目录
前言
C语言中链表所带来的关系有些许复杂,现在对链表创建以及输出做一个记录,以便于以后进行复习,并且更清楚的认识链表。
什么是链表
链表有一个“头指针”变量,图中以head表示,它存放一个地址,该地址指向一个元素。
链表中每一个元素称为“结点”,每个结点都应包括两个部分:
(1) 用户需要用的实际数据;
(2) 下一个结点的地址。
head指向第1个元素,第1个元素又指向第2个元素……直到最后一个元素,该元素不再指向其他元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
可以用结构体变量建立链表。一个结构体变量包含若干成员,这些成员可以是数值类型、字符类型、数组类型,也可以是指针类型。用指针类型成员来存放下一个结点的地址。
引用库函数
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(stu)
创建结构体
typedef struct student
{
long id;
char name[20];
int score;
struct student *next;
}stu;
静态链表建立与输出
int main()
{
stu a, b, c;//定义三个结构体,3为链表长度
stu* head, * p;//定义链表的起始位置和移动链表的变量
p = head = &a;//将链表的初始位置赋予head和p
a.next = &b;
b.next = &c;
c.next = NULL;//连接结构体成为链表
while (p != NULL)
{
scanf("%d%s%d", &p->id, p->name, &p->score);//输入链表参数
p = p->next;
}
p = head;
while (p != NULL)
{
printf("%d %s %d\n", p->id, p->name, p->score);//输出链表
p = p->next;
}
return 0;
}
动态链表建立
stu *creat(void)
{
stu* p1, * p2, * head;//head和p2分别为链表的头指针变量和终止指针变量,p1为移动结点
head = NULL;//初始化头指针变量
n = 0;//用于计算动态链表长度
p2 = p1 = (stu*)malloc(LEN);//为p1,p2在堆中开辟新的空间
scanf("%ld%s%d", &p1->id, p1->name, &p1->score);//输入第一个结点的值,方便接下来判度胺
while (p1->id != 0)
{
n++;
if (n == 1)
head = p1;//如果为第一个结点,就赋予head
else
p2->next = p1;//否则将p2与p1两个结点连接
p2 = p1;//将p2移动至p1位置
p1 = (stu*)malloc(LEN);//再为p1开辟新的空间
scanf("%ld%s%d", &p1->id, p1->name, &p1->score);
}
p2->next = NULL;//为链表结尾
return head;
};
动态链表输出
int main()
{
stu* head, * p;//head和p为头指针变量和移动的结点
head = creat();//创建链表
p=head;//将头节点赋予p
while (p != NULL)
{
printf("%ld %s %d\n", p->id, p->name, p->score);//输出一个节点
p = p->next;//将p移动至下一节点
}
return 0;
}
总结
在处理链表时,不要搞混移动节点的顺序,并且注意变量类型为指针变量还是普通变量