线性表是一种最基本,最简单,也是最常用的数据结构
线性表(linear list)是数据结构的一种,一个线性表是由多个数据元素组成的有限序列
- 若元素存在多个,则第一个无元素前驱,而最后一个无元素后继,其他元素有且只有一个前驱和后继
以上是线性表的四个特征
我们通过一张图来看一下线性表
不难看出线性表有点像数组,但是把线性表定义成数组不好操作,我们一般用结构体来定义线性表
我们先来介绍一下顺序表和链式表,队列和栈属于线性表中的奇葩,我们后面再讲
对于线性表主要可以进行以下操作:- 添加节点
- 插入节点
- 删除节点
- 查找节点
- 统计节点数
操作顺序表
顺序表是线性表的一种最简单和最常用的方式,这种方式用一组地址连续的储存单元一次保存线性表中的数据元素
#define MAXSIZE 10000; //可存放数据最长长度 typedef struct{ int data[MAXSIZE]; //数据 int length; //表的长度 }list; /* void ListInit(list *L) //初始化顺序表 int ListLength(list *L) //返回顺序表的长度 int ListAdd(list *L,int data) //在表尾添加数据data int ListInsert(list *L,int i,int data) //在i处插入数据data int ListDelete(list *L,int i) //删除第i个数据 int ListFind(list *L,int i) //查找第i个元素 */ void ListInit(list *L){ L->length=0; } int ListLength(list *L){ return (L->length); } int ListAdd(list *L,int data){ if(L->length>=MAXSIZE) //表已满,返回 return 0; L->data[L->length]=data; //插入元素 L->length++; //表长+1 return true; } int ListInsert(list *L,int i,int data){ if(L->length>=MAXSIZE) return 0; if(i<1 || i>L->length-1) return 0; //非法操作 for(int j=L->length;j>=i;j++) //把第i及位往后的元素后移,空出第i个 L->data[j+1]=L->data[j]; L->data[i]=data; //插入 L->length++; //表长+1 return true; } int ListDelete(list *L,int i){ if(i<1 || i>L->length+1) return 0; for(int j=i;j<L->length;j++) //第i位后面前移,把第i位覆盖 L->data[j]=L->data[j+1]; L->length--; return true; } int ListFind(list *L,int i){ int ans=0; if(i<1 || i>L->length+1) return 0; for(int j=0;j<L->length;j++){ if(L->data[j]==i){ cout<<"元素"<<i<<"在"<<"第"<<j<<中<<endl; //支持重复数据查找 ans=1; } } if(ans==0) cout<<"找不到!"<<endl; else return true; }
为了节省代码量,这里只展现核心代码,以上代码已经过上机编译且编译通过
单链表
单链表就是像一条链子一样,单链表的存储结构为一个存储数据一个存储下一个节点的位置的指针,单链表的好处是方便操作,删除数据的时间复杂度是O(1),而顺序表的删除综合时间复杂度是O(n).单链表存储数据的称谓数据域,存储指针的称谓指针域。
以上就是单链表的储存结构
由于我比较懒,而且单链表代码较多
so 窝就不展示太多了
窝找到了一篇写的比我原来想写的内容写得更好的文章
传送门https://blog.csdn.net/fanyun_01/article/details/79831877
以后写数据结构可能会用到STL库,不用的小伙伴可以百度一下,STL库里有很多可以代替一些数据结构的头文件,例如stack可以代替栈,这样就可以减少代码量