线性表·1

数据结构复习·1 线性表:顺序表

宏定义

1
2
3
4
5
6
7
8
#include<iostream> 
#define MAXSIZE 100
using namespace std;
typedef char ElemType;
typedef struct{
ElemType *data;
int length;
}SqList;

顺序表操控函数

1.初始化顺序表L

1
2
3
4
5
6
bool Initlist_Sq(SqList &L){ //初始化顺序表L
L.data = new ElemType[MAXSIZE];//利用new 来创建动态数组
if(!L.data) return 0;
L.length = 0;
return 1;
}

2.在顺序表的指定位置插入数据

1
2
3
4
5
6
7
8
9
10
bool ListInsert_Sq(SqList &L,int i,ElemType e){ //插入表L
if((i<1)||(i>L.length+1)) return 0;
if(L.length==MAXSIZE) return 0;//表满
for(int j=L.length-1;j>=i-1;j--){
L.data[j+1] = L.data[j];
}
L.data[i-1] = e;
++L.length;
return 1;
}
时间复杂度

最好情况:在表尾插入(i=n+1) 元素后移语句不执行 时间复杂度O(1)
最坏情况:在表头插入(i=1) 元素后移语句执行n次 时间复杂度O(n)
平均情况:移动结点平均次数为$\frac{n}{2}$
因此 顺序表插入算法平均时间复杂度为O(n)

3.在顺序表指定位置删除数据

1
2
3
4
5
6
7
8
bool ListDelete_Sq(SqList &L,int i){//删除表位置i的元素
if(i<1||i>L.length) return 0;
for(int j=i;j<=L.length-1;j++){
L.data[j-1] = L.data[j];
}
--L.length;
return 1;
}
时间复杂度

最好情况:删除表尾元素(i=n) 无须移动元素 时间复杂度O(1)
最坏情况:删除表头元素(i=1) 移动除第一个元素外的所有元素 时间复杂度O(n)
平均情况:移动结点平均次数为$\frac{n-1}{2}$
因此 顺序表删除算法平均时间复杂度为O(n)

4.遍历整个表的数据元素并输出

1
2
3
4
5
6
int ShowList(SqList L){//遍历整个顺序表的元素并输出 
for(int i=0;i<L.length;i++){
cout<<L.data[i]<<" ";
}
cout<<endl;
}

5.销毁顺序表

1
2
3
4
5
int DestroyList(SqList &L)
{
if (L.data) delete[]L.data;//释放存储空间
return 1;
}

所有代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include<iostream> 
#define 1 1
#define 0 0
#define 0 -2
#define MAXSIZE 100
using namespace std;
typedef int bool;
typedef char ElemType;
typedef struct{
ElemType *data;
int length;
}SqList;
bool Initlist_Sq(SqList &L){//初始化顺序表L
L.data = new ElemType[MAXSIZE];
if(!L.data) exit(0);
L.length = 0;
return 1;
}
bool ListInsert_Sq(SqList &L,int i,ElemType e){//插入表L
if((i<1)||(i>L.length+1)) return 0;
if(L.length==MAXSIZE) return 0;
for(int j=L.length-1;j>=i-1;j--){
L.data[j+1] = L.data[j];
}
L.data[i-1] = e;
++L.length;
return 1;
}
bool ListDelete_Sq(SqList &L,int i){//删除表位置i的元素
if(i<1||i>L.length) return 0;
for(int j=i;j<=L.length-1;j++){
L.data[j-1] = L.data[j];
}
--L.length;
return 1;
}
int CleanList(SqList &L){//清空表L
L.length = 0;
return 1;
}
int GetLength(SqList L){//求表长
return (L.length);
}
int ShowList(SqList L){//遍历整个顺序表的元素并输出
for(int i=0;i<L.length;i++){
cout<<L.data[i]<<" ";
}
cout<<endl;
}
int DestroyList(SqList &L)
{
if (L.data) delete[]L.data;//释放存储空间
return 1;
}

int main(){
int i,len;
ElemType e;
SqList L;
if (Initlist_Sq(L)) cout<<"顺序表初始化成功"<<endl;
else cout<<"顺序表初始化失败"<<endl;
cout<<"输入相应的数字来进行相应的操作"<<endl;
int c = -1;
while(c!=0){
cout<<"1.提供一个位置插入一个元素 2.删除提供位置的一个元素 3.求表长 4.获取表内所有的元素 5.清空表 0. exit"<<endl;
cin>>c;
switch(c){
case 1:{
cout<<"请输入位置的序号和插入的元素"<<endl;
cin>>i>>e;
if (ListInsert_Sq(L,i,e)) cout<<"插入成功"<<endl;
else cout<<"插入失败"<<endl;
break;
}
case 2:{
cout<<"请输入删除元素的位置序号"<<endl;
cin>>i;
if (ListDelete_Sq(L,i)) cout<<"删除成功"<<endl;
else cout<<"删除失败"<<endl;
break;
}
case 3:{
len = GetLength(L);
cout<<"表的长度为"<<len<<endl;
break;
}
case 4:{
ShowList(L);
break;
}
case 5:{
if (CleanList(L)) cout<<"清空成功"<<endl;
else cout<<"清空失败"<<endl;
break;
}
}
}
if (DestroyList(L)) cout<<"顺序表已销毁"<<endl;
else cout<<"顺序表销毁失败"<<endl;
return 0;
}

后记

下一篇准备写单链表

End of reading! -- Thanks for your supporting