学习记录 mooc浙大数据结构第二讲 线性结构(附向前星的详细讲解,持续更新中)

本文是mooc浙大数据结构第二讲的学习笔记,重点讨论线性表的顺序存储(数组)和链式存储(链表)。介绍了数组的插入、删除、查找操作及其复杂度,以及链表的头插法、尾插法。同时,文章还讲解了广义表、多重链表的概念,并探讨了向前星在图的链式存储中的应用。
摘要由CSDN通过智能技术生成

写在读前:博客内代码基本每句都含注释,请参考注释食用~
博客内容包括课程框架梳理要点总结笔者个人总结的拓展内容PTA课后题解等等,多有理解不当或者概念错误请多多指出并加以包涵~

线性表

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

													——引自百度百科“线性表”词条

顺序存储——数组

最简单的数据结构;定义一个头指针,所有元素根据头指针位置依次按顺序储存。

  • 定义:ElementType Data[MAXSIZE];
    ElenmentType 为数据类型,即为int、double等等;

  • 访问:下标访问;

  • 插入:由于数组储存是按下标顺序依次储存,插入元素便需要将目标结点的元素及后续元素全部后移;
    复杂度O(n);
    实现代码:


//将x插入到长度为n的数组Data[]中goal_index的位置
void Insert(ElementType Data[],intn,int x,int goal_index){
   
	 int i=n;							        //n为数组最后一个元素的下一个位置,通过i实现元素后移操作
	 while(i<goal_index) Data[i]=Data[i-1];     //将MAXSIZE到goal_index位置范围内的元素后移一位
	 Data[goal_index]=x;						//插入x
}
  • 删除:与插入同理,需要将目标结点后元素全部前移一个位置;
    复杂度O(n);
    实现代码:
//将长度为n的数组Data[]中goal_index位置的元素删除
void Delete(ElementType Data[],int n,int goal_index){
   
	 int i=n-2;            			            //n-1为数组最后一个元素,n-2为数组倒数第二个元素,通过i实现删除操作
	 while(i>=goal_index) Data[i]=Data[i+1];    //将MAXSIZE到goal_index位置范围内的元素前移一位
}
  • 查找:遍历一遍数组即可;
    复杂度O(n);
    实现代码:
//在数组Data[]中查找x,并返回第一个与x相等的元素下标
ElementType Find(ElementType Data[],int x){
   
	 for(int i=0;i<n;i++)                       //遍历数组
	 	 if(Data[i]==x) return i;				//如果找到即返回下标
	 return -1;                                 //如果没有找到便返回-1代表数组中不包含此元素
}
  • 拓展知识:
    数组不能作为函数参数来传递,在函数的传递过程中会被当做指针进行传递,即直接将数组首元素的地址传递给函数,故在函数中对数组内元素进行修改会应用与数组本身。

链式存储——链表

链表与数组的不同之处即为链表中元素的地址在计算机中可以不相邻,通过指针串起来便能够实现访问;

  • 定义与建表:定义链表的基本单元并且建立一个链表头;
typedef struct node *List;                      //将指针类型的node变量使用typedef创建一个新名字 List

struct node{
   
	 ElementType Data;							//数据域
	 List pointer;								//指针域
};

List build_link(){
   
	 List header;
	 header=(List)malloc(sizeof(node));	 		//为表头申请空间(c++写法)
	 //c语言写法:  header=(List)malloc(sizeof(struct node));
	 header->pointer=NULL;
	 return header;
}


  • 访问:顺序访问,即想要访问第i个元素,必须通过指针从表头遍历到第i个元素;
  • 插入
头插法:

将元素插在链表头;
代码实现:

//将元素x插入到链表linked_list中,List和node请参照上文代码
List head_Insert(List linked_list,ElementType x){
   
	 List nwe_node=(List)malloc(sizeof(node
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值