C语言链表
前言
废话不说,反正链表就是很重要。本文以单链表为例
一、预备知识
1.typedef 关键字
举例说明
typedef int U32;
typedef struct Student
{
int score;
char name[20];
}ST,*PST;
U32 i; //U32 i;等价 int 32;
ST student; //ST student; 等价 struct Student;
PST *pst; //PST *pst;等价struct Student *
为了方便,可以利用typedef 给某种数据类型起个别名;
二、链表
2.1定义
2.1.1 链表概念
链表属于一种离散的存储方式,离散是与连续相对的,数组是常见的连续存储方式。
链表就是一个表,表是有节点组成的。
1)n个节点离散分配;
2)彼此通过指针相连;
3)每个节点只有一个前驱节点,每个节点只有一个后继节点
4)首节点没有前驱节点,尾节点没有后继节点
2.2专业术语
2.2.1 链表结构
链表如下图所示
链表是由节点组成的,每个节点有两部分组成,分为数据域和指针域,数据域用来存放当前节点的数据,指针域用来存放指向下一个节点的指针变量
1)头节点:头节点数据类型与其他节点一样;是第一个有效节点之前的那一个节点;头节点并不存放数据,即数据域没有数据;加头节点的目的是方便对链表进行操作;
2)头指针:指向头节点的指针变量;
3)首节点:第一个有效节点;
4)尾节点:最后一个有效节点
5)尾指针:指向最后一个有效节点的指针变量;
如果我们希望通过一个函数对链表进行处理,我们至少需要知道链表的头指针这个参数;
2.2.2 链表节点类型
链表的节点其实就是一个结构体变量,在这个变量中存放当前节点的数据以及指向下一个节点的指针变量,具体见代码所示:
typedef struct node
{
int data;
struct node * pnext;
}node ,*pnode;
每个节点都是一个 node 型变量,变量的 pnext成员存放的是下一个节点的地址。
3.对链表数据的操作
3.1 插入一个节点
首先看图,
在没有插入节点c之前,a为b 的前驱节点(说b是c的后继节点也一样),若想在a与b之间插入节点c,只需要将a节点指针域的指针变量指向c节点,将c节点的指针域的指针变量指向b即可
若p指向节点a,q指向节点c,进行以下操作即可完成节点插入,详情见代码
pnode t; //定义中间指针变量
t = p->pnext;
p->pnext = q;
q->qnext = t;
3.1 删除一个节点
还是首先看图
同样假设,p指针变量指向节点a,c指针变量指向节点c,若想删除节点b,将 节点a指针域的指针变量指向节点c即可,但是考虑到节约内存的效果,往往会对 p 结构体变量所占的内存空间进行释放,释放内存空间利用free()函数,另外,出于人性化考虑,在调用删除某个节点的时候,会对所删除节点的数据进行回传,以供其他需要。
看代码喽!
node t;
t = p->pnext->data; //保存节点b数据域的数据
p->next = p->next->pnext; //节点c的地址赋值给节点a的指针域的指针变量
总结
本文介绍了C语言链表的基本知识,下一篇将以代码的形式对 “如何对数组进行操作进行详细讲解”,欢迎大家指正!!!