zoukankan      html  css  js  c++  java
  • 4-18 易错点 链表的创建和添加

      今天学习了链表内的创建和添加,先总结一下我犯的错误

    1. 二级指针理解不深刻,导致传参之后,实参的值并没有变化;
    2. 符号优先级没有记熟练,导致写完之后会出现很多语法问题;

    先上代码

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 typedef struct NODE
     5 {
     6     int id;
     7     char *name;
     8     char *tel;
     9     struct NODE *next;
    10 }Node;
    11 Node *GetNode(int id,char *name,char *tel);
    12 void addNode(Node **ppHead,Node **ppEnd,Node *pNode);
    13 int main()
    14 {
    15     Node *pHead = NULL;     //1
    16     Node *pEnd = NULL;
    17 
    18     addNode(&pHead,&pEnd,GetNode(1,"cyc","164864613521"));
    19     addNode(&pHead,&pEnd,GetNode(2,"xmx","164864613521"));
    20     addNode(&pHead,&pEnd,GetNode(3,"wdh","164864613521"));
    21     addNode(&pHead,&pEnd,GetNode(4,"yk","164864613521"));
    22 
    23     while(pHead != NULL)
    24     {
    25         printf("%d    %s    %s
    ",pHead->id,pHead->name,pHead->tel);
    26         pHead = pHead->next;
    27     }
    28 
    29 
    30 
    31     return 0;
    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 void addNode(Node **ppHead,Node **ppEnd,Node *pNode)   // 2
    44 {
    45     if(*ppHead == NULL)
    46     {
    47         *ppHead = pNode;
    48         *ppEnd = pNode;
    49     }
    50     else
    51     {
    52         (*ppEnd)->next = pNode;
    53         *ppEnd = pNode;
    54     }
    55     return;
    56 
    57 }

    代码注释:

    1. 此处设置的头指针和尾指针是便于添加结点;
    2. 函数传参,若想对传入参数的值进行改变的话,应该使用地址传递,反之,使用值传递(在这个练习当中,我想改变指针的值,所以采用地址传递,而二级指针正好是用来存储指针的地址)

    思路分析:

      本次练习首先是数据结构中简单链表中单个结点的创建,经过分析可得,若是想要在程序运行的过程当中进行创建添加操作:

    1. 应该在堆区申请空间,因为栈区在程序运行后大小不可变化,并且会随着自定义函数的结束而消亡,造成信息的损失;
    2. 传入参数有多种形式,我采用的是直接传入,也可以采用scanf()即时输入的方式。

      链表简单的添加,此处的添加分为两种情况:

    1. 程序中并未有链表出现,那么遍历后 头指针pHead = 0就可以判断,那么头指针指向添加的结点,尾指针也指向添加的结点即可;

    程序中原先若是有链表已经出现,那么头指针是指向第一个结点可以不变,此时尾指针所指向结点内所存储的 pnext 就可以指向添加的结点,然后继续把尾指针指向最后一个结点。

    2019-04-18 22:37:16 编程小菜鸟反思,大佬勿喷 谢谢!

  • 相关阅读:
    什么是序列化
    命令执行漏洞
    sql注入总结
    npm包之merge-descriptors
    Koa路由中间件之koa-router
    TypeScript声明文件(.d.ts)的使用
    TypeScript使用的简单记录
    TypeScript的安装、使用及配置
    Node websocket简单封装
    使用docker-compose配置mysql服务
  • 原文地址:https://www.cnblogs.com/xgmzhna/p/10732923.html
Copyright © 2011-2022 走看看