数据结构学习(C语言)之 链表基本知识

(郝斌老师视频课)

简介

14_链表的重要性
15_typedef的用法
16_链表的定义
17_如果希望通过一个函数来对链表进行处理,我们至少需要接受链表的哪些参数
18_每一个链表节点的数据类型该如何表示的问题【以前一直不理解】!!
19_链表的分类
20_非循环单链表插入节点伪算法讲解(插入节点)
21_删除非循环单链表节点伪算法的讲解(内存泄露)
22_学习数据结构的目的和要达到的要求
23_复习

14_链表的重要性

15_typedef的用法

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。
在编程中使用typedef 目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
typedef简单例子:

#include
typedef	int ZHAGNSAN;//为int再重新多取一个名字,ZHAGNSAN等价于int
typedef struct Student  // struct Studen st很麻烦,所以用typedef
{
	int sid;
	char name[100];
	char sex;
}ST;  // typedef意味着为这个结构体,多起了一个名字,以后就不用写结构体了麻烦,可直//接写别名

int main(void)
{
	int i=10;//等价于ZHANGSAN i=10;
	ZHAGNSAN j=20;
	printf("%d\n",j);   //验证ZHAGNSAN j=20;这样写是否可以
	struct Student st;//等价于ST st;
	struct Student *ps=&st;//等价于ST *ps;
	ST st2;
	st2.sid=200;
	printf("%d\n",st2.sid);
	return 0;
}

数据结构学习(C语言)之 链表基本知识_第1张图片
typedef在结构体中:
int ZHAGNSAN;
struct Student
{
int sid;
char name[100];
char sex;
}* 表示:结构体指针 和PST等价,所以PST也表示结构体指针类型

PST等价于struct Student * , PST是一个指针,表示指向结构体的指针

#include
typedef	int ZHAGNSAN;//为int再重新多取一个名字,ZHAGNSAN等价于int
typedef struct Student
{
	int sid;
	char name[100];
	char sex;
}*PST;	//PST等价于struct Student *  , PST是一个指针,表示指向结构体的指针

int main(void)
{
	struct Student st;//等价于ST st;
	PST ps=&st;
	ps->sid=99;
	printf("%d\n",ps->sid);
	return 0;
}

数据结构学习(C语言)之 链表基本知识_第2张图片
PSTU等价于struct Student *,STU代表了struct Student
PSTU表示指向结构体的指针
STU表示结构体

#include
typedef	int ZHAGNSAN;//为int再重新多取一个名字,ZHAGNSAN等价于int
typedef struct Student
{
	int sid;
	char name[100];
	char sex;
}*PSTU,STU;	//PSTU等价于struct Student *,STU代表了struct Student
//一般大写,因为一看就是一个数据类型的别名

int main(void)
{
	STU st;//相当于struct Srudent st;
	PSTU ps=&st;//相当于struct Srudent *ps=&st;
	ps->sid=99;
	printf("%d\n",ps->sid);
	return 0;
}

在这里插入图片描述

16_链表的定义

1、定义:
(1)n个节点离散分配;
(2)彼此通过指针相连;
(3)每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。

2、专业术语
数据结构学习(C语言)之 链表基本知识_第3张图片
(1)首节点:第一个有效节点
(2)尾节点:最后一个有效节点
(3)头节点:头节点的数据类型和首节点的数据类型相同;
第一个有效节点之前的那个节点;
头节点并不存放存放有效数据;
加头节点目的主要是为了方便对链表的操作。
(4)头指针:指向头节点的指针变量
(5)尾指针:指向尾节点的指针变量
头节点-首节点头节点并没有存储有效数据,也没有存放链表中有效节点的个数。首节点开始存放有效数据。在链表前边加一个没有实际意义的头节点,可以方便对链表的操作。头节点于之后节点的数据类型相同

17_如果希望通过一个函数来对链表进行处理,我们至少需要接受链表的哪些参数

如果希望通过一个函数来对链表进行处理,我们至少需要接受链表的哪些参数
只需要一个参数:头指针
因为我们通过头指针可以推算出链表的其他所有参数

18_每一个链表节点的数据类型该如何表示的问题

数据结构学习(C语言)之 链表基本知识_第4张图片
第一个节点的指针域,指向的是下一个节点的整体,而这个整体的数据类型和它本身的数据类型一样。
也可以说,一个结构体的一部分指向了和自己一样的数据类型。
所以,我们要用 struct Node * pNext; 指向节点结构体的指针变量,理解为;pNext是一个指针变量,指向的是下一个节点,下一个节点也有数据域和指针域。

#include

typedef struct Node
{
	int data;//数据域
	struct Node * pNext;//指针域   ,指向的是跟他数据类型一样的结构体
}NODE,*PNODE;//NODE等价于struct Node,PNODE等价于struct Node *
int main(void)
{
	
	return 0;
}

19_链表的分类

分类:
单链表:每个链表的指针域只能指向后面的节点
双链表:每一个节点有两个指针域
循环链表:能通过任何一个节点找到其他所有的结点
非循环链表:

20_非循环单链表插入节点伪算法讲解

算法:
遍历
查找
清空
销毁
求长度
排序
删除节点
插入节点

数据结构学习(C语言)之 链表基本知识_第5张图片
插入算法1)r=p->pNext;p->Next=q;q->pNext=r;
插入算法2)q->Next=p->pNext;p->Next=q;【p,q不是节点,是指针变量】

21_删除非循环单链表节点伪算法的讲解

算法1(不采用):
数据结构学习(C语言)之 链表基本知识_第6张图片
p->pNext=p->pNext->pNext;//容易导致内存泄露,没有释放被删除节点的内存
内存泄露:被删除的那个节点还是占有内存的,没有被释放,内存浪费,内存空间就会越来越少,程序运行越来越慢。

算法2:先临时定义一个指向p后面节点的指针r
r=p->pNext;//p表示第一个节点的指针(地址),p->pNext存的是一个地址,这个地址指向第二个节点的结构体的首地址
p->pNext=p->pNext->pNext;
free®;
数据结构学习(C语言)之 链表基本知识_第7张图片

22_学习数据结构的目的和要达到的要求

23_复习

你可能感兴趣的:(数据结构)