入门:链表的基本操作
标签:C语言 链表
By 小威威
1.写这篇博文的原因
C语言有三大重要部分:流程控制、函数、指针。
对于指针,单单了解它的简单应用是不够的,最重要的还是学习链表。许多参考书对链表的基本操作的概括还是不大完整的,所以在此通过这篇博文介绍链表的几种常用操作,以帮助初学者入门链表。
2.链表的基本操作主要有哪一些
1)链表的建立;
2)链表的输出;
3)链表结点的插入;
4)链表结点的删除;
5)链表各结点指向的倒置;
6)链表的粉碎。
补充:入门基本操作以后,可以进行其他操作:如各种类型的排序,这里就不介绍了,在以后的博文可能会介绍。
3.链表基本操作的完整代码
# include <stdio.h>
# include <stdlib.h>
struct student { // 用结构体定义链表的结点
int num; // 学号
float score; // 分数
struct student *next; // 存储的是指向下一个结构体的地址
};
struct student *establish(void); // 建立链表的函数的声明
struct student *lessen(struct student *head, int num); // 删除结点的函数的声明
struct student *insert(struct student *head, int num, struct student *node); // 插入结点的函数的声明
struct student *reserve(struct student *head); // 链表指向倒置的函数的声明
void output(struct student *head); // 输出链表的函数的声明
void deletelist(struct student *head); // 粉碎链表的函数的声明
int n; // 定义全局变量,表示链表中结点的个数
int main(void) {
struct student *head; // 定义链表的头指针
int num, num2; // num表示要删去的结点
head = establish(); // 调用建立链表的函数
output(head); // 调用输出链表的函数
printf("请输入你要删除的结点:\n");
scanf("%d", &num);
head = lessen(head, num); // 调用删除结点的函数
output(head); // 调用输出链表的函数
struct student *node = malloc(sizeof(struct student)); // 定义一个新的结点,并为他开辟一个空间
printf("请输入需要插入新结点的数据:\n");
scanf("%d%f", &node->num, &node->score); // 给该新结点赋值
printf("请输入要插入的位置(哪个结点之后):\n");
scanf("%d", &num2); // 输入要插入的位置
head = insert(head, num2, node); // 调用插入结点的函数
output(head); // 调用输出的函数
printf("现在对该链表的指向进行倒置\n");
head = reserve(head); // 调用链表指向倒置的函数
output(head); // 调用输出链表的函数
deletelist(head); // 调用粉碎链表的函数
return 0;
}
struct student *establish(void) { // 定义建立链表的函数
struct student *p1, *p2, *head; // 定义三个指针变量,p1、p2可以对相邻结点进行操作,head为头指针
n = 0; // 给n初始化,即结点为0
p1 = p2 = malloc(sizeof(struct student)); // 给两个指针变量分配动态内存
head = NULL; // 一定要将头指针置空。(如果没有初始化,一旦没有执行循环,该函数就会直接返回没有初始化的头指针,即没用的头