首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-08-23 
单链表插入程序,有些疑问,求教typedef struct student{int datastruct student* next}node/*单链表插入

单链表插入程序,有些疑问,求教
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

热点排行