zoukankan      html  css  js  c++  java
  • 4-19 易错点 链表的插入

      今天学习了链表的插入,有很多的易错点,导致我在练习的时候一直运行不对,记录一下,谨防再次出错

    先上代码

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 typedef struct NODE
     4 {
     5     int id;
     6     char *name;
     7     char *tel;
     8     struct NODE *next;
     9 }Node;
    10 Node *GetNode(int id,char *name,char *tel);
    11 void AddNode(Node **ppHead,Node **ppEnd,Node *pNode);
    12 void InsertNode(Node **ppHead,Node **ppEnd,Node *pNode,int id);
    13 
    14 int main()
    15 {
    16     Node *pHead = NULL;
    17     Node *pEnd = NULL;
    18 
    19     AddNode(&pHead,&pEnd,GetNode(1,"qwe","123654789"));
    20     AddNode(&pHead,&pEnd,GetNode(2,"ert","123654789"));
    21     AddNode(&pHead,&pEnd,GetNode(3,"rty","123654789"));
    22     AddNode(&pHead,&pEnd,GetNode(4,"sdf","123654789"));
    23     InsertNode(&pHead,&pEnd,GetNode(8,"pdf","123456789"),32);
    24     while(pHead != NULL)
    25     {
    26         printf("%d    %s    %s
    ",pHead->id,pHead->name,pHead->tel);
    27         pHead = pHead->next;
    28     }
    29 
    30     return 0;
    31 }
    32 
    33 Node *GetNode(int id,char *name,char *tel)
    34 {
    35     Node *pTemp = (Node *)malloc(sizeof(Node));
    36     pTemp ->id = id;
    37     pTemp ->name = name;
    38     pTemp ->tel = tel;
    39     pTemp ->next = NULL;
    40 
    41     return pTemp;
    42 }
    43 
    44 void AddNode(Node **ppHead,Node **ppEnd,Node *pNode)
    45 {
    46     if(*ppHead == NULL)
    47     {
    48         *ppHead = pNode;
    49     }
    50     else
    51     {
    52         (*ppEnd)->next = pNode;
    53     }
    54     *ppEnd = pNode;
    55 
    56     return;
    57 }
    58 
    59 void InsertNode(Node **ppHead,Node **ppEnd,Node *pNode,int id)
    60 {
    61     Node *pMove = *ppHead;
    62     if((*ppHead)->id == id)                    //1
    63     {
    64         pNode->next = (*ppHead);
    65         (*ppHead) = pNode;
    66         return;                                
    67     }
    68     while((pMove->next) != NULL)                //2
    69     {
    70         if((pMove->next->id) == id)
    71         {
    72             pNode->next = pMove->next;
    73             pMove->next =pNode;
    74             return;                                //3
    75 
    76         }
    77         pMove = pMove->next;
    78     }
    79     (*ppEnd)->next = pNode;
    80     *ppEnd = pNode;
    81 
    82     return;
    83 
    84 
    85 }

      链表插入的思路(此处默认为插入在给定id的结点前):

    1. 插入在头结点前,即给的id此处为1;
    2. 插在中间;
    3. 插在末尾,即给的id不在我已经创建的结点之内;

    我当时犯的错误:

    1. 在注释2处 ,写为1 while(pMove != NULL) ,就忽略了若是遍历到最后一个结点时,p->next == NULL ,那么p->next->id就不存在,则下一行的if就会崩溃,造成整个程序崩溃
    2. 在注释3处,并未加入 return 跳出,就会一直加入我设置的新结点,并且新结点一直指向p->next 从而跳出不循环,程序运行后没有结果

    总结:

    在编写代码时,要先画清逻辑分析图,针对于链表而言 在添加和插入的时候,一定要先连后断,先连接新结点,再断老结点的指针例如

    pNode->next = *ppHead;
    *ppHead = pNode;
    pNode->next = pMove->next;
    pMove->next = pNode;

     

    2019-04-19 22:54:44 编程小菜鸟反思,大佬勿喷,谢谢!

  • 相关阅读:
    validFrom不通过submit按钮来触发表单验证
    微信小程序组件开发
    css3 单行文字溢出,多行文字溢出
    表格布局
    对象设置默认属性
    按钮样式
    判断一个json是否为空
    vue高仿饿了么(三)
    Win10 用IE打开网址默认跳转到Edge如何解决?
    VMware虚拟机安装Win11正式版
  • 原文地址:https://www.cnblogs.com/xgmzhna/p/10739361.html
Copyright © 2011-2022 走看看