12 链表
12.1 链表概述
1.采用动态存储分配的一种重要数据结构,一个链表中存储的是一批同类型的相关联数据
2.动态分配时,每个结点之间可以不连续,结点之间的联系可以用指针实现,每个结点分两个域:数据域和指针域
12.2 处理动态链表所需函数(需要包含头文件stdlib.h)
1.分配内存空间函数malloc()
(1)函数调用形式:(类型说明符*)malloc(size)
(2)malloc函数要求系统在内存分配一块长度为size字节的连续区域,函数返回值为区域首地址
(3)函数返回的指针是无类型的,(类型说明符*)表示把返回值强制转换为该类型指针
(4)例如,p=(char*)malloc(100); //表示分配100个字节的内存空间,强制转换为字符数组类型,函数返回值为指向该字符数组的指针,把该指针赋给指针变量p
2.分配内存空间函数calloc()
(1)函数调用形式:(类型说明符*)calloc(n,size)
(2)calloc函数要求系统在内存动态存储区分配n块长度为size字节的连续区域
(3)例如,ps=(struct stu *)calloc(2,sizeof(struct stu));
3.释放内存空间函数free()
(1)函数调用形式:free§
(2)释放指针变量p所指向的一块内存区域
12.3 单链表基本操作
1.建立链表
(1)调用malloc()函数向系统申请一个结点的存储空间
(2)输入该结点的值,并把该节点的指针成员设置为0
(3)把该结点加入链表中,如果链表为空,则该结点为链表头结点,否则该结点加入表尾
2.链表查找
3.插入结点
(1)调用malloc()函数分配一个结点空间,并输入新节点的值
(2)查找合适的插入位置
(3)修改相关节点的指针域
4.删除结点
(1)从表头结点开始,确定要删除结点的地址q,以及q的前一个结点p的地址
(2)如果q为头结点,删除后应修改表头指针head,否则修改结点p的指针域
(3)回收结点q的空间
代码:
#include<stdio.h>
#include<stdlib.h>
struct node //定义结点结构
{
int num;
int score;
struct node *next;
};
//1.创建链表
struct node *creat(struct node *head,int n)
{
struct node *p,*q;
for(int i=1; i<=n; i++)
{
q=(struct node *)malloc(sizeof(struct node)); //申请结点空间
scanf("%d%d",&q->num,