C语言 链表
@
参考博客(写得很不错,我就是看这个看懂了٩(๑>◡<๑)۶ ):
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 <stdio.h>
#include <stdlib.h>
//创建结构体
typedef struct{
int a;
char b;
}test;
int main(void)
{
test *test01,*test02;
test01 = (test*)malloc(sizeof(test));
printf("test01=%p,test02=%p\n",test01,test02);
test02 = test01;
printf("test01=%p,test02=%p\n",test01,test02);
return 0;
}
结果:
可以看到,在还没进行test02=test01的操作时,它们两个指向的地址是不同的;
但当执行了test02=test01的操作后,它们两个指针都是指向了同一个地址。
所以,在下面代码里的tail = head其实就是将这两个指针都指向一个地址(这个地址为头结点的地址)。
然后还有个tail = node,就是在将指针tail指向指针node指向的普通结点的地址。
代码
#include <stdio.h>
#include <stdlib.h>
//创建节点结构
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("%d\n",p->num);
p = p->next;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)