写在前面的话
基于王道龙哥的代码写的笔记,为了加深印象,同时也为了后期复习。
初级阶段太简单了,中级阶段其实也简单,但以前没有写结构体的习惯,习惯直接把结构体拆成数组写,现在觉得还是挺方便的,主要也是为了这个才做的笔记,把一堆数据结构放在一起便于对比。高级阶段的什么文件、OS那块还没看,如果后期写了笔记还会补。
主要是面向我自己写的,不为教学也不为扩列,所以别指指点点,有哪里写的不对可以说,别在那balabala什么写的太浅,就是复制代码什么的。我完全为了自己,只是觉得发博客就是顺手的事。
主要就是将龙哥的代码模块化(毕竟代码长的话读起来也没有逻辑性,从main开始读还得跳来跳去),更改了一下代码顺序(按照逻辑思维顺序),以及分了一些层次,加了一些注释和解释。再然后就是把很多数据结构放一起好对比。
如果后期做了其他笔记也会发出来,欢迎交流
线性表
定义:n个相同类型元素组成的有序集合
1. 个数有限
2. 数据类型相同
3. 逻辑上有序
线性表的顺序表示
静态分配的数组(SqList)
数据结构
typedef struct{
ElemType data[MaxSize];
int length;//当前顺序表中有多少个元素
}SqList;
插入元素
传入:结构体变量,插入位置,插入元素
返回:ture or false
//i代表插入的位置(即序数=下标+1),从1开始,e要插入的元素(&为引用)
bool ListInsert(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1)//判断要插入的位置是否合法
return false;
if(L.length>=MaxSize)//超出空间了
return false;
for(int j=L.length;j>=i;j--)//移动顺序表中的元素
L.data[j]=L.data[j-1];
L.data[i-1]=e;//数组下标从零开始,插入第一个位置,访问的下标为0
L.length++;
return true;
}
删除元素
传入:结构体变量,删除位置,元素类型变量(通过引用的方式得到输出值)
返回:ture or false
//删除使用元素e的引用的目的是拿出对应的值
bool ListDelete(SqList &L,int i,ElemType &e)
{
if(i<1||i>L.length)//如果删除的位置是不合法
return false;
e=L.data[i-1];//获取顺序表中对应的元素,赋值给e
for(int j=i;j<L.length;j++)
L.data[j-1]=L.data[j];
L.length--;//删除一个元素,顺序表长度减1
return true;
}
动态分配的数组(SeqList)
数据结构
typedef struct{
ElemType *data;//数组的首地址(地址指针)
int capacity;//动态数组的最大容量
int length;//当前已存数量
}SeqList;
线性表的链式表示
有头结点的单链表(LNode,*LinkList)
数据结构
typedef struct LNode{
ElemType data;
struct LNode *next;//指向下一个结点
}LNode,*LinkList;
头插法新建链表
传入:结构体变量(未初始化,所以需要引用)
返回:结构体变量(可有可无)
LinkList CreatList1(LinkList &L)//list_head_insert
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));//带头结点的链表
L->next=NULL;//L->data里边没放东西
scanf("%d",&x);//从标准输入读取数据
//3 4 5 6 7 9999
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));//申请一个新空间给s,强制类型转换
s->data=x;//把读取到的值,给新空间中的data成员
s->next=L->next;//让新结点的next指针指向链表的第一个元素(第一个放我们数据的元素)
L->next=s;//让s作为第一个元素
scanf("%d",&x);//读取标准输入
}
return L;
}
尾插法新建链表
传入:结构体变量(未初始化,所以需要引用)
返回:结构体变量(可有可无)
LinkList CreatList2(LinkList &L)//list_tail_insert
{
int x;
L=(LinkList)malloc(sizeof(LNode));//带头节点的链表
LNode* s, * r = L;//LinkList s,r=L;也可以,r代表链表表尾结点,指向链表尾部
//3 4 5 6 7 9999
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;//让尾部结点指向新结点
r=s;//r指向新的表尾结点
scanf("%d",&x);
}
r->next=NULL;//尾结点的next指针赋值为NULL
return L;
}