读书人

单链表安插程序有些疑问求教

发布时间: 2013-08-23 15:57:36 作者: rapoo

单链表插入程序,有些疑问,求教
typedef struct student{
int data;
struct student* next;
}node;

/*单链表插入节点:1.如果插入在头结点之前 2.如果插入为中间节点 3.如果插入为尾节点*/
node* insertNode(node* head,int data){
node *p0,*p1,*p2; //p0为要插入的节点
p1 = head;
p0 = (node*)malloc(sizeof(node));
p0->data = data;
while(p1->next != NULL){
p2 = p1; //疑问在这2行,是想p2保存p1之前的节点,p1指向下一个节点
p1 = p1->next; //但是这样写好像head被跳过了?该怎么写,求教
if(p0->data <= p1->data){
if(p1 == head){ //插入在头节点之前
p0->next = p1;
head = p0;
}else{ //插入中间节点
p2->next = p0;
p0->next = p1;
}
}else{ //插入在尾节点之后


p1->next = p0;
p0->next = NULL;
}
}
return head;
}
[解决办法]

引用:
Quote: 引用:

if(p0->data <= p1->data){
if(p1 == head){ //插入在头节点之前
p0->next = p1;
head = p0;
}else{
那这几句就吧p1改成p2

插入尾节点之后,除了头和尾中间的数据全没了。。。
写成下面这样,把判断放在循环外面了
while(p0->data > p1->data && p1->next != NULL){
p2 = p1;
p1 = p1->next;
}
之后正常了,有点不能理解啊,这几行是做什么,不是应该在循环里判断么?

先判断要插入的值是否大于遍历的现节点p1的值,或者没到tail,若大于,就继续往下遍历,p2是为了保证能够插入在两个节点之间,所以需要一直跟着p1

读书人网 >C++

热点推荐