线性表的顺序存储结构
线性表的顺序存储结构
先上代码:
#include "Sqlist.h"
//各个函数的具体实现
int Init_SqList(SqList* L){
for(int i = 0;i < MAXSIZE;i++)
L->data[i] = 0;
L->length = 0;
return 0;
}
int Get_Elem(SqList* L,int i,ElemType* e){
if(L->length == 0 || i < 1 || (i > L->length))
return -1;
*e = L->data[i-1];
return 0;
}
int Insert_Elem(SqList* L,int i,ElemType e){
int k = 0;
if(L->length == MAXSIZE)
return -1;
if((i > (L->length) + 1) || i < 1)
return -1;
if(i <= L->length){
for(k = L->length -1;k >= i-1;k--)
L->data[k+1] = L->data[k];
}
L->data[i-1] = e;
L->length++;
return 0;
}
int Delete_Elem(SqList* L,int i,ElemType* e){
int k = 0;
if(L->length == 0)
return -1;
if((i > L->length) || i < 1)
return -1;
*e = L->data[i-1];
if(i < L->length){
for(k = i;k < L->length;k++)
L->data[k-1] = L->data[k];
}
L->length--;
return 0;
}
int Search_Elem(SqList* L,ElemType e){
int i = 0;
if(L->length == 0)
return -1;
for (i = 0;i < L->length;i++){
if(e == L->data[i])
return i+1;
}
return -1;
}
int Modify_Elem(SqList* L,int i,ElemType e){
if(L->length == 0)
return -1;
if((i > L->length) || i < 1)
return -1;
if(i < L->length){
L->data[i-1] = e;
}
return 0;
}
#ifndef __SQLIST_H_
#define __SQLIST_H_
#define MAXSIZE 20
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int length;
} SqList;
int Init_SqList(SqList* L);
int Get_Elem(SqList* L,int i,ElemType* e);
int Insert_Elem(SqList* L,int i,ElemType e);
int Delete_Elem(SqList* L,int i,ElemType* e);
int Search_Elem(SqList* L,ElemType e);
int Modify_Elem(SqList* L,int i,ElemType e);
#endif // __SQLIST_H_
#include <stdio.h>
#include <stdlib.h>
#include "Sqlist.h"
int main(){
SqList L;
int i = 0;
int e = 0;
Init_SqList(&L);
for(i = 1;i <= 10;i++)
{
Insert_Elem(&L,i,10-i);
}
for(i = 1;i <= 10;i++)
{
Get_Elem(&L,i,&e);
printf("%d\n",e);
}
e = 5;
if(Search_Elem(&L,e) == 0)
printf("e = %d in the SqList\n",e);
Delete_Elem(&L,5,&e);
if(Search_Elem(&L,e) == 0)
printf("e = %d in the SqList\n",e);
else{
printf("e = %d not in the SqList\n",e);
}
Insert_Elem(&L,5,12);
for(i = 1;i <= 10;i++)
{
Get_Elem(&L,i,&e);
printf("%d\n",e);
}
Modify_Elem(&L,5,20);
for(i = 1;i <= 10;i++)
{
Get_Elem(&L,i,&e);
printf("%d\n",e);
}
}
正文:
线性表的顺序存储结构,指的是用一段连续的地址依次存储线性表的数据元素。
因为线性表的元素类型相同,所以可以用一维数组来实现顺序存储结构。
-
结构代码
#define MAXSIZE 20 typedef int ElemType; typedef struct{ ElemType data[MAXSIZE]; int length; } SqList;
三个重要属性:
- 存储空间的起始位置:数组data
- 最大存储容量,及数组长度
- 线性表当前的长度,任意时刻小于等于数组长度
-
插入操作
- 如果链表已满,则返回异常
- 如果插入位置不合理,返回异常
- 从最后一个元素开始向前遍历到插入位置,分别将它们都向后移动一个位置
- 插入元素
- 表长加一
-
删除操作
- 如果删除位置不合理,返回异常
- 如果链表为空,返回异常
- 取出删除元素
- 从删除元素开始向前遍历到最后一个元素,分别将它们都向前移动一个位置
- 表长减一
-
其他操作比较简单,就不再赘述
-
时间复杂度为O(n)
-
优点:
- 结构简单
- 操作迅速
-
缺点:
- 插入与删除操作需要移动大量元素
- 难以确地暗存储空间,容易造成存储空间的“碎片”