目录
下一篇:线性表的链表实现和分析
一、静态分配的线性表
#define MaxSize 10//表最大长度
typedef struct{
int data[MaxSize];
int length;
}SqList;
//初始化
void InitList(SqList &L){
for(int i=0;i<MaxSize;i++){
L.data[i]=0;//所有元素默认置为0
}
L.length=0;//长度置0
}
二、动态分配的线性表
#define InitSize 10//初始长度
typedef struct{
int *data;
int MaxSize=50,length=10;
}SeqList;
//初始化
void InitList(SeqList &L){
//用malloc动态分配
L.data=(int *)malloc(sizeof(int)*InitSize);
L.length=0;
L.MaxSize=InitSize;
}
//动态增加数组长度
void IncresaseSize(SeqList &L,int len){
//指针指向就的数组
int *p=L.data;
//分配新数组
L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));
for(int i=0;i<L.length;i++){
L.data[i]=p[i];
}
L.MaxSize+=len;
free(p);
}
三、使用静态线性表演示其他操作
1、求表长
int Length(SqList L){
return L.length;
}
2、按值查找
int LocateElem(SqList L,int e){
int i;
for(i=0;i<L.length;i++){
if(L.data[i]==e)return i+1;
}
return 0;
}
3、按位序查找
int GetElem(SqList L,int i){
return L.data[i-1];
}
4、插入操作
bool ListInsert(SqList &L,int i,int e){
//判断i的范围
if(i<1||i>L.length+1)return false;
//判断是否超出最大空间
if(L.length>=MaxSize)return false;
//将i-1之后元素往后移一位
for(int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
//最好情况:新元素插入在表尾,不用移动元素O(1)
//最坏情况:新元素插入到表头,需要移动n个元素O(n)
//平均情况:假设插入到任何一个位置的概率相同,概率p=1/(n+1)
//i=1时循环n次i=2时n-1次,...n=i+1时循环0次所以平均循环n/2次 ,O(n)
//删除同理
}
5、删除操作
bool ListDelete(SqList &L,int i,int &e){
if(i<1||i>L.length)return false;
e=L.data[i-1];//被删除的元素保存到e
//i之后的元素全部左移
for(int j=i;j<L.length;j++){
L.data[j-1]=L.data[j];
}
L.length--;
return true;
}
void PrintList(SqList L){
for(int i=0;i<L.length;i++){
printf("%d\n",L.data[i]);
}
}
6、判空
bool Empty(SqList L){
return L.length==0;
}
7、销毁表
bool Destory(SqList &L){
L.length=0;
}
四、测试
int main(){
SqList L;
int e=0;
InitList(L);
ListInsert(L,1,10);
ListInsert(L,2,11);
ListInsert(L,3,12);
ListInsert(L,4,13);
ListInsert(L,5,14);
ListInsert(L,6,15);
ListInsert(L,7,16);
ListInsert(L,8,17);
ListInsert(L,9,18);
ListInsert(L,10,19);
ListInsert(L,11,20);
PrintList(L);
e=LocateElem(L,15);
printf("被e=%d\n",e);
e=GetElem(L,3);
printf("被e=%d\n",e);
ListDelete(L,7,e);
printf("被删除的是%d\n",e);
PrintList(L);
Destory(L);
PrintList(L);
return 0;
}