保姆级教程(1)——C语言链表基本知识详解

C语言链表

  • 前言
  • 一、预备知识
    • 1.typedef 关键字
  • 二、链表
    • 2.1定义
      • 2.1.1 链表概念
    • 2.2专业术语
      • 2.2.1 链表结构
      • 2.2.2 链表节点类型
    • 3.对链表数据的操作
      • 3.1 插入一个节点
      • 3.1 删除一个节点
  • 总结


前言

废话不说,反正链表就是很重要。本文以单链表为例


一、预备知识

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)——C语言链表基本知识详解_第1张图片
链表是由节点组成的,每个节点有两部分组成,分为数据域和指针域,数据域用来存放当前节点的数据,指针域用来存放指向下一个节点的指针变量
1)头节点:头节点数据类型与其他节点一样;是第一个有效节点之前的那一个节点;头节点并不存放数据,即数据域没有数据;加头节点的目的是方便对链表进行操作;
2)头指针:指向头节点的指针变量
3)首节点:第一个有效节点;
4)尾节点:最后一个有效节点
5)尾指针:指向最后一个有效节点的指针变量;

如果我们希望通过一个函数对链表进行处理,我们至少需要知道链表的头指针这个参数;

2.2.2 链表节点类型

链表的节点其实就是一个结构体变量,在这个变量中存放当前节点的数据以及指向下一个节点的指针变量,具体见代码所示:

typedef struct node
{
	int data;
	struct node * pnext;
}node ,*pnode;  

每个节点都是一个 node 型变量,变量的 pnext成员存放的是下一个节点的地址。

3.对链表数据的操作

3.1 插入一个节点

首先看图,
保姆级教程(1)——C语言链表基本知识详解_第2张图片
在没有插入节点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 删除一个节点

还是首先看图
保姆级教程(1)——C语言链表基本知识详解_第3张图片

同样假设,p指针变量指向节点a,c指针变量指向节点c,若想删除节点b,将 节点a指针域的指针变量指向节点c即可,但是考虑到节约内存的效果,往往会对 p 结构体变量所占的内存空间进行释放,释放内存空间利用free()函数,另外,出于人性化考虑,在调用删除某个节点的时候,会对所删除节点的数据进行回传,以供其他需要。
看代码喽!

node t;
t = p->pnext->data;     //保存节点b数据域的数据
p->next = p->next->pnext;   //节点c的地址赋值给节点a的指针域的指针变量

总结

本文介绍了C语言链表的基本知识,下一篇将以代码的形式对 “如何对数组进行操作进行详细讲解”,欢迎大家指正!!!

你可能感兴趣的:(C语言,链表,指针,数据结构,c语言)