早上准备去买菜,随手在纸条上列了几样要买的菜:西红柿、鸡蛋、洋葱。刚走到超市门口,突然想起家里酱油快没了,得加上。这时候要是用的是固定长度的数组,就像那张写满的纸条,想加点东西就得重新抄一遍。但要是用链表,就像拿一串可拆卸的钥匙环,新项目挂上去就行,不用动前面的东西。
链表是啥?
你可以把它想象成一列火车,每节车厢是一个节点,装着数据和指向下一节车厢的“连接”。C语言里,这个结构通常用结构体定义:
struct Node {
int data;
struct Node* next;
};
这里的 data 可以是你想存的任何东西,比如买菜的名字,而 next 是个指针,指着下一个节点在哪。最后一节车厢的 next 指向 NULL,表示到站了。
怎么建一个节点?
每次要添点新东西,就得申请一块内存。比如你要把“酱油”加入购物清单:
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = 4; // 假设酱油编号是4
newNode->next = NULL;
malloc 就像去仓库领了个空箱子,然后你把数据放进去,再决定它连不连下一个。
插到链表前面最省事
如果每次都把新东西放在最前面,操作最简单。比如你现在又想起要买葱,可以直接让它当“车头”:
newNode->next = head; // 新节点指向原来的第一个
head = newNode; // 更新车头为新节点
这样不管原来有多少东西,加新项的时间都差不多,不会因为清单变长就更慢。
遍历就像顺着链条走
你想看看都要买啥,就得从头开始一个个看:
struct Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
这就像手电筒照隧道,一节一节往前,直到尽头。
用完记得释放
程序跑完,别忘了把申请的内存还回去,不然就像用完的快递盒堆在家里。每个节点都要 free:
while (head != NULL) {
struct Node* temp = head;
head = head->next;
free(temp);
}
这样系统才不会“内存泄漏”,程序也更健康,跟人吃完饭要收拾桌子一样。