链表由头指针和(多个)结点组成,其中每个结点都是一个结构体。
一、链表结点结构体
该结构体由两部分组成:
一部分是数据区,用于存放数据;
一部分是地址区,用于存放下一次申请到的内存的首地址。
创建一个链表结点结构体如下:
struct student
{
int id;
char name[20];
char sex;
int score;
struct student* next; // 指向struct student类型的指针
};
其中,id、name、sex、score是结点数据域的成员,next是结点指针域的成员。
其构成如图:
二、创建一个链表
(注:该图片出自 链表(链式存储结构)及创建(C语言详解版))
当链表中有头节点时,头指针指向头节点;反之,若链表中没有头节点,则头指针指向首元节点。
(首元结点:第一个有数据的结点)
由图,我们创建一个无头节点的链表,让头指针指向首元结点:
第一步:创建一个结构体
该结构体由两部分组成:
1, 数据域(存放数据的成员)
2, 指针域(存放节点指针)
struct Node
{
char a; //数据域
struct node* next; //指针域
}node; //节点名
第二步:创建一个头指针
头指针指向链表第一个节点的位置,方便后期找到链表
struct Node* head = NULL; //定义链表头指针,初始化为空
第三步:创建一个首元节点
链表中第一个存有数据的节点被称为首元结点。
struct Node* tmp;
tmp = (struct Node*)calloc(1, sizeof(struct Node));
第四步:对首元结点初始化
tmp->a = 1; //对数据域赋值
tmp->next = NULL; //将该节点指针置为空
第五步,让头指针指向首元结点
head = tmp;
第六步,从第2个节点开始创建,假设再创建3个结点
链表结构如图:
for (int i = 2; i < 5; i++)
{
//创建一个新节点并初始化
struct Node* new;
new = (struct Node*)calloc(1,sizeof(struct Node));
//对节点数据域赋值
new->a = i;
//将节点指针置为空
new->next = NULL;
//将tmp节点(首元结点)与新的节点建立逻辑关系
tmp->next = new;
//让tmp节点每次都指向新链表最后一个节点
tmp = new;
}
第七步,根据头指针输出链表所有节点的内容
struct Node* p; //创建一个指针变量p
if (head != NULL)
{
p = head;
//如果指针p不为NULL就一直指向下一个节点输出
while (p != NULL)
{
printf("%d ",p->a);
p = p->next;
}
}
由此可得到完整代码如下:
struct Node
{
char a; //数据域
struct node* next; //指针域
}node; //节点名
int main()
{
//第二步:创建一个头指针
//头指针指向链表第一个节点的位置,方便后期找到链表
struct Node* head = NULL; //定义链表头指针,初始化为空
//第三步:创建一个首元节点
//链表中第一个存有数据的节点被称为首元结点。
struct Node* tmp;
tmp = (struct Node*)calloc(1, sizeof(struct Node));
/*第四步:对首元结点初始化*/
tmp->a = 1; //对数据域赋值
tmp->next = NULL; //将该节点指针置为空
//第五步,让头指针指向首元结点
head = tmp;
//第六步,从第2个节点开始创建,假设再创建3个结点
for (int i = 2; i < 5; i++)
{
//创建一个新节点并初始化
struct Node* new;
new = (struct Node*)calloc(1,sizeof(struct Node));
//对节点数据域赋值
new->a = i;
//将节点指针置为空
new->next = NULL;
//将tmp节点(首元结点)与新的节点建立逻辑关系
tmp->next = new;
//让tmp节点每次都指向新链表最后一个节点
tmp = new;
}
//第七步,根据头指针输出链表所有节点的内容
struct Node* p; //创建一个指针变量p
if (head != NULL)
{
p = head;
//如果指针p不为NULL就一直指向下一个节点输出
while (p != NULL)
{
printf("%d ",p->a);
p = p->next;
}
}
return 0;
}
运行结果:
输出链表所有节点的内容,即1 2 3 4