[数据结构]-[线性结构]知识点:顺序表、链表、栈、队列的基本操作及应用,串。
【还没写完】
1.顺序表
1.基础知识点
1.顺序表存在唯一的首元素和尾元素,除了首元素外每个元素都只有一个直接前驱,除了尾元素外每个元素都只有一个直接后继。
2.数组:
优点:下标访问速度快,存储密度高。
缺点:大小不能改,插入删除需要移动元素。
顺序表实际上就是在数组的基础上增加了自动扩容,增删改查等。
3.顺序存储结构
优点:
(1)是一种随机存取结构,存取任何元素的时间都是常数,速度快。
(2)结构简单,逻辑上相邻的元素物理上也相邻。
(3)不使用指针,节省存储空间。存储密度大,相比链表少了指针域。
缺点:
(1)插入删除要移动大量元素,浪费时间。
(2)需要一个连续的存储空间。
(3)插入元素可能会溢出。
(4)自由区的存储空间不能被其他数据占用/共享。
2.实现
1.ADT
typedef int ElemType;
typedef struct{
ElemType *data;
int length;
int size;
}SqList;
2.建立与销毁
//初始化
bool Init(SqList *L,int size){
L->data = (ElemType*) calloc(size,sizeof(ElemType));
if(L->data == NULL)
return false;//存储分配失败
L->length = 0;//空表长度为0
L->size = size;//初始存储容量
return true;
}
//销毁
void Destroy(SqList* L){
free(L->data);
L->data = NULL;
L->length = 0;
L->size = 0;
}
3.判断空、判断满、查长度
//判断空
bool IsEmpty(SqList L){
return L.length == 0;
}
//判断满
bool IsFull(SqList L){
return L.length == L.size;
}
//元素个数
int Length(SqList L){
return L.length;
}
4.遍历
//遍历
void Traverse(SqList L){
int i;
for(i = 0;i<L.length;i++){
printf("-%d",L.data[i]);
}
printf("\n");
}
5.扩容
//扩容
bool Expand(SqList *L){
ElemType* ndata = (ElemType *) realloc(L->data,L->size*2*sizeof(ElemType));
if(ndata!=NULL){
L->data = ndata;
L->size = L->size*2;
return true;
}else return false;
}
6.插入和删除(重点)
//插入
bool Insert(SqList *L,int i,ElemType e){
//判断满如果满了扩容
if(i>=1&&i<=L->length+1&&(IsFull(*L)?Expand(L):true)){
int k;
//所有元素往后移
for(k = L->length;k>=i;k--){
L->data[k] = L->data[k-1];}
//设置i处为插入元素e
L->data[i-1] = e;
L->length ++; //表长加1
return true;
}else return false;
}
//删除
bool Delete(SqList *L,int i,ElemType *e){
if(i<1 || i> L->length) return false; //i值不合法
//把删除的这个数给e
*e = L->data[i-1];
//所有数往前移
for(;i<L->length;i++){
L->data[i-1] = L->data[i];
}
L->length--; //表长减1
return true;
}
2.链表
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!