昨天又开始复习数据结构了,满世界的书翻来翻去,就是不知道怎么看,没办法就先找了本数据结构的先看着,看到链表就头疼,以前学的时候也是半桶水在那晃来晃去的,根本就没有好好的看过,现在在看时,还是会模模糊糊的,好在还是一狠心,把它给吃透了,在这写下来给大家还在学链表的童鞋一个教程,尽量把我学的时候的难点写出来,其它的如果有什么不懂的可以留言问我。费话少说,开始:

ONE:

    链表的创建,是链表中较重要的部分,只要链表创建好了,其它的什么添加、删除就好写了。首先,三个指针,head(头结点),pTail(本结点),pNext(下一个结点),有了这三个在加一个数据就可以开始了,来个简单的数据吧:

 

  1. struct Node{ 
  2.     int data; 
  3.     Node* next; 
  4. }; 

前面工作完成,下面我们来创建:

 

  1. static Node* head; 
  2. Node* CreateList(){ //至少也要把头结点返回嘛,要不你去那找^-^是吧 
  3.     Node *pTail,*pNext; 
  4.     pNext = new Node; //生个新蛋出来; 
  5.     head = pNext;    //头头肯定要指向它的; 
  6.     pTail = pNext;   //因为只有一个,所以尾巴也要指向它。 
  7.     cout<<"Please enter a number, with 0 at the end:"<<endl; 
  8.     int temp = 0; 
  9.     cin>>temp; //以上不解释; 
  10.     if(temp){ 
  11.         pTail->data = temp;//把数据给刚刚新生出的蛋; 
  12.     }else
  13.         delete pNext;//如果第一个数就是0,那就不要它了,狠心呐; 
  14.         head = NULL; //一个蛋都木有,头头也没法指了,让它为空 
  15.         pTail = NULL;//它也理所当然为空了 
  16.         return head; //OK,不用往下走了,返回头头。 
  17.     } 
  18.     while(temp){ //如果第一个数不为空的话 
  19.         cout<<"Please enter a number, with 0 at the end:"<<endl; 
  20.         cin>>temp;  //那就输入第二个数; 
  21.         if(temp){ 
  22.             pNext = new Node;  //这数为真,就要新生个节点, 
  23.             pNext->data = temp; //把这个数给这个节点, 
  24.             pTail->next = pNext; //让第上个节点的next指向这个新开的节点,因为要串起来嘛。 
  25.             pTail = pNext;//这个是把尾巴节点指向刚刚的新生出来的节点,我开始的时候会不理解这句,我把pTail理解成一个结构体了,结构体怎么能赋一个指针给它呢,其实它不是结构体,只是一个指针,指向这个结构体而已,用这个指针你可以找到这个结构体里面的元素进行修改和赋值,把这理解了我指针水平感觉又提高了,呵呵,说笑,继续下面。 
  26.         }else{     //如果第二个数为空 
  27.             pTail->next = NULL; //就把刚刚上一节点的next置空 
  28.             pNext = NULL; //下面也不会在生出新节点了,置空 
  29.             pTail = NULL; //它也不用指向尾巴节点了, 
  30.             return head;  //返回头头 
  31.         } 
  32.     } 

OK,这一个创建的就建成了,非常的简单,前提是在你理解的情况下,当你把这个彻底的理解后,那些什么链表啊,栈啊,都不在话下了。

其它的简单的我也顺便写一下吧,注释就不这么详细了,理解了上面的,其它的你都可以自己写了。

既然说了栈,就顺便把栈的特性也一起写出来算了,它的特性是“first in last out”,用链表实现如下:

  1. Node* stack(){ //和上面一样的注释就不写了,全手打,见谅 
  2.     Node *pTail,*pNext; 
  3.     pNext = new Node;pTail = pNext;head = pNext; 
  4.     int temp = 0; 
  5.     cout<<"Please enter a number, with 0 at the end:"<<endl; 
  6.     cin>>temp; 
  7.     if(temp){ 
  8.          pTail->data = temp; 
  9.          pTail->next = NULL;//因为它是栈,所以最先进来,最后出去,所以第一个点就是链表的最后一个点; 
  10.     }else
  11.         delete pNext;head = NULL;pTail = NULL; 
  12.         return head; 
  13.     } 
  14.     while(temp){ 
  15.         cout<<"Please enter a number, with 0 at the end:"<<endl; 
  16.         cin>>temp; 
  17.         if(temp){ 
  18.             pNext = new Node; 
  19.             pNext->data = temp; 
  20.             head = pNext; //因为每new出来的新点都是要在最前面 
  21.             pNext->next = pTail;//它的下一个节点是pTail,所以新new出来的这个pNext节点它要指向pTail, 
  22.             pTail = pNext; //然后pTail这个指针就不指向老节点了,它要指向刚刚新生出来的这个点,这样,pNext就可以松开,好指向用户再次new出来的节点. 
  23.         }else
  24.             pTail = NULL;pNext = NULL;return head; 
  25.         } 
  26.     } 

其实栈也就改变了一点点而已,所以说理解了一个,其它的就都类似了。如果有图的话可以让大家更好理解,可惜不会画图,也太麻烦,呵呵。
见谅。

有兴趣的童鞋可以实现下有序的,从小到大的插入到链表中。^-^

————————分———————————隔——————————————一——————^-^———————————下————————————————
下面就都是简单的了:

TWO:

显示链表:

 

  1. void ShosList() 
  2.     Node* temp = head; 
  3.     int i = 0; 
  4.     while(temp){ 
  5.         cout<<"第"<<i<<"个节点,内容为:"<<temp->data<<endl; 
  6.         temp = temp->next; 
  7.     } 
  8. 显示的比较好写


THREE:

插入链表:

 

  1. Node* Insert(int data) 
  2.     Node* temp = head; 
  3.     while(TRUE) 
  4.     { 
  5.          if(temp->next == NULL)//一直往下找,找到最后一个节点 
  6.         { 
  7.             Node* target = new Node; 
  8.             target->data = data; 
  9.             target->next = NULL; 
  10.             temp->next = target; 
  11.             break;  //要记得加呀,如是不加你可以试试,它会在几十秒内把你内存占满(可以邪恶下); 
  12.         }else
  13.             temp = temp->next; 
  14.         } 
  15.     } 
  16. } 这个我只是插到最后,你可以优化,e,g:指定位置插入,插入时排序。。等

其它的我感觉也没什么好写的了吧,大家可以自己写成,主要是自己的思路,有了这东东,什么都好解决,这么多完全靠自己手打,

没有CP一个字符,如果转载的话请注明出处:http://thgenius.blog.51cto.com/1042803/944817

谢谢,如果写得不好,请大侠们赐教一下,大家一起交流交流。