写在读前:博客内代码基本每句都含注释,请参考注释食用~
博客内容包括课程框架梳理,要点总结,笔者个人总结的拓展内容,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