- 对链表的理解
- 关于类型都为同一个结构体
- 代码
参考博客(写得很不错,我就是看这个看懂了٩(๑>◡<๑)۶ ):
https://blog.csdn.net/Endeavor_G/article/details/80552680?spm=1001.2014.3001.5506
以下为个人理解,如有错误欢迎指出~~~
对链表的理解链表有一个头结点head、普通带数据的结点node以及指向最后一个结点的结点tail。
head、node和tail是指针,我们用malloc函数申请内存,并返回那个内存的开头地址给这些指针。
大致上是这样:
每一次创建一个普通结点,指针*node指向新的那个结点的地址,尾指针tail(图片里用的是end)也随着改变指向新的结点(数字1、2、3……n分别为第一次创建结点时、第二次创建结点时……)。
在链表代码里有个tail = head的理解,用指针test01作为指针head,指针test02作为指针tail,代码:
#include#include //创建结构体 typedef struct{ int a; char b; }test; int main(void) { test *test01,*test02; test01 = (test*)malloc(sizeof(test)); printf("test01=%p,test02=%pn",test01,test02); test02 = test01; printf("test01=%p,test02=%pn",test01,test02); return 0; }
结果:
可以看到,在还没进行test02=test01的操作时,它们两个指向的地址是不同的;
但当执行了test02=test01的操作后,它们两个指针都是指向了同一个地址。
所以,在下面代码里的tail = head其实就是将这两个指针都指向一个地址(这个地址为头结点的地址)。
然后还有个tail = node,就是在将指针tail指向指针node指向的普通结点的地址。
#include#include //创建节点结构 typedef struct Link{ int num; struct Link *next; }link; link *creat_link(void); void traverse_link(link *link_node); int main(void) { link *p = creat_link(); traverse_link(p); return 0; } //创建链表 link *creat_link(void) { int num; //创建头结点指针、尾指针和普通节点指针 link *head,*tail,*node; //给头结点分配地址 head = (link*)malloc(sizeof(link)); //让tail和head都指向同一个头结点地址 tail = head; //创建结点 while (1) { scanf("%d",&num); if(num!=-1){ //创建普通节点 node = (link*)malloc(sizeof(link)); node->num = num; //头结点指向node tail->next = node; tail = node; }else{ break; } } //结束创建,最后的结点指向NULL tail->next = NULL; return head; } //遍历链表 void traverse_link(link *link_node) { link *p = link_node->next; while (p!=NULL) { printf("%dn",p->num); p = p->next; } }



