C的链表-简单介绍
相关知识: 结构体, 指针, malloc申请内存函数
链表的出现
在存储数据时, 当数目确定时, 我们可以通过数组或者结构体数组来存储数据.
当数目不确定时, 可以把数据的长度定义为一个很大的数目, 从而保证有足够的空间存储数据.
但这种做法会造成空间的浪费, 总会有一部分的空间没被用到.
因为数组的长度必须是事先确定下的常量, 不能为变量, 所以数组已经无法满足我们的需求了.
于是出现了长度可变的链表, 要多少, 拿多少.链表的介绍
链表可以想象为环式手链, 每一个环都连着下一个环
链表也是这样, 我们把链表中的环叫做节点, 节点包括数据域与指针域
数据域存放数据
指针域存放下一个节点的地址(指针)
头节点: 链表中的第一个节点
其数据域一般不存储数据
其指针域存放第一个数据节点的地址
头指针: 头节点的地址
首节点: 第一个存放数据的节点
尾节点: 最后一个存放数据的节点, 其指针域应为NULL- 链表的实现
由于涉及多种基本的数据, 所以在C中, 我们用结构体+指针实现链表
示例代码:
#include <stdio.h>
// 节点结构体
typedef struct node{
// 数据域
int age;
char sex;
// 指针域
struct node * next;
}Node;
void main()
{
int i = 0;
// 头指针
struct node *head, *p;
// 为头节点申请空间
head = (Node*)malloc( sizeof(Node) );
// 新建10个节点
for(i=0, p = head; i<=9; i++)
{
// 为节点申请空间
(*p).next = (Node*)malloc( sizeof(Node) );
// 更新暂时节点地址到下一个节点
p = (*p).next;
}
// 尾节点指针域为NULL
(*p).next = NULL;
// 遍历节点
for(p=(*head).next; p!=NULL; p=(*p).next)
{
....
}
}
PS: 链表的操作有头/尾插节点, 遍历链表, 节点的数据交换
上面介绍的只是简单的单链表, 还有双向链表, 循环链表