今天学习了链表内的创建和添加,先总结一下我犯的错误
- 二级指针理解不深刻,导致传参之后,实参的值并没有变化;
- 符号优先级没有记熟练,导致写完之后会出现很多语法问题;
先上代码
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\n",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 }
代码注释:
- 此处设置的头指针和尾指针是便于添加结点;
- 函数传参,若想对传入参数的值进行改变的话,应该使用地址传递,反之,使用值传递(在这个练习当中,我想改变指针的值,所以采用地址传递,而二级指针正好是用来存储指针的地址)
思路分析:
本次练习首先是数据结构中简单链表中单个结点的创建,经过分析可得,若是想要在程序运行的过程当中进行创建添加操作:
- 应该在堆区申请空间,因为栈区在程序运行后大小不可变化,并且会随着自定义函数的结束而消亡,造成信息的损失;
- 传入参数有多种形式,我采用的是直接传入,也可以采用scanf()即时输入的方式。
链表简单的添加,此处的添加分为两种情况:
- 程序中并未有链表出现,那么遍历后 头指针pHead = 0就可以判断,那么头指针指向添加的结点,尾指针也指向添加的结点即可;
程序中原先若是有链表已经出现,那么头指针是指向第一个结点可以不变,此时尾指针所指向结点内所存储的 pnext 就可以指向添加的结点,然后继续把尾指针指向最后一个结点。
2019-04-18 22:37:16 编程小菜鸟反思,大佬勿喷 谢谢!