考研笔记——王道C语言

写在前面的话

基于王道龙哥的代码写的笔记,为了加深印象,同时也为了后期复习。

初级阶段太简单了,中级阶段其实也简单,但以前没有写结构体的习惯,习惯直接把结构体拆成数组写,现在觉得还是挺方便的,主要也是为了这个才做的笔记,把一堆数据结构放在一起便于对比。高级阶段的什么文件、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;
}
L-malloc
NULL
L-malloc
NULL
s->data=x
L-malloc
s->data=x
NULL
尾插法新建链表

​ 传入:结构体变量(未初始化,所以需要引用)

​ 返回:结构体变量(可有可无)

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;
}
L-malloc,r
未初始化
L-malloc,r,r指向新节点
s->data=x
未初始化
L-malloc
s->data=x,r,r变为新节点
未初始化

双链表(DNode,*DLinkList)

数据结构

                
  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值