#配置deovoice 数据结构之线性表 | blog of coderdz

数据结构之线性表

开始考研复习数据结构了,准备把《数据结构》严蔚敏版中所有的数据结构全部实现一遍,今天是线性表.

基本上和课本上的类c语言差不多。(代码注释的很详细了哈哈)
Mycode:

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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std;

#define List_Init_Size 100 //线性表存储空间的初始分配量
#define ListIncrement 10 //线性表存储空间的分配增量

typedef struct{
int *elem; //存储空间基址
int length; //当前表长
int listsize; //当前分配的存储大小
}SqList;

int InitList(SqList &L){
//初始化一个空的线性表
L.elem = (int *)malloc(List_Init_Size * sizeof(int)); //初始分配存储空间
if (!L.elem) exit(-2); //分配失败
L.length = 0;
L.listsize = List_Init_Size;
return 1;
}

int DestroyList(SqList &L){
//销毁线性表
free(L.elem); //直接释放掉这段空间
return 1;
}

int ListEmpty(SqList L){
//判断表是否为空
if (L.length == 0) return 1;
return 0;
}

/* 个人感觉这个实在没啥用
int ListLength(SqList L){
//返回表长
return L.length;
}
*/

int ListClear(SqList &L){
//清空线性表
for(int i = 0; i < L.length; i++)
L.elem[i] = 0;
L.length = 0;
return 1;
}

int GetElem(SqList L, int i, int &e){
//找到第i个元素,并用e返回
if (i < 0 || i > L.length) return 0; //i不合法
e = L.elem[i - 1];
return 1;
}

int LocateElem(SqList L, int e){
//返回线性表中第一个和e相等的元素
for(int i = 0; i < L.length; i++)
if (L.elem[i] == e)
return i + 1;
return 0;
}

int PriorElem(SqList L, int cur, int &pre){
//若cur是L中的元素,且不是第一个,则返回它的前驱
for(int i = 0; i < L.length; i++){
if (L.elem[i] == cur){
if (i == 0){
return 0; //不能是第一个元素
}
pre = L.elem[i - 1];
return 1;
}
}
return 0; //cur不在线性表中,找不到前驱
}

int NextElem(SqList L, int cur, int &next){
//若cur是L中的元素,且不是最后一个,则返回它的后继
for(int i = 0; i < L.length; i++){
if (L.elem[i] == cur){
if (i == L.length - 1){
return 0; //不能是最后一个元素
}
next = L.elem[i + 1];
return 1;
}
}
return 0; //cur不是线性表中的元素
}

int ListInsert(SqList &L, int i, int e){
//在第i个位置之前插入新的元素e
if (i < 1 || i > L.length + 1) return 0; //i不合法
if (L.length >= L.listsize){ //当前空间已满,增加分配
L.elem = (int *)realloc(L.elem, (L.listsize + ListIncrement) * sizeof(int));
L.length += ListIncrement;
}
int *q = &(L.elem[i-1]);
int *p ;
for(p = &(L.elem[L.length - 1]); p >= q; p--)
*(p+1) = *p; //插入的位置及以后的元素全部后移1位
*q = e;
L.length += 1; //插入后表长+1
return 1;
}

int ListDelete(SqList &L, int i, int &e){
//删除第i位元素,并用e返回
if (i < 1 || i > L.length) return 0;
int *p = &(L.elem[i - 1]);
e = *p;
int *q = &(L.elem[L.length - 1]);
for(++p; p <= q; p++){
*(p - 1) = *p;
}
L.length--;
return 1;
}

int main(){
SqList s;
printf("开始初始化线性表s\n");
InitList(s);
printf("空表长度: %d, 分配存储大小: %d\n",s.length,s.listsize);
printf("---------------------------------\n");
printf("开始进行插入操作\n");
for(int i = 1; i <= 10; i++){
printf("线性表第%d个元素插入%d\n",i,i);
ListInsert(s, i, i);
}
printf("---------------------------------\n");
if (ListEmpty(s)) printf("线性表为空\n");
else printf("此时线性表的表长为: %d\n", s.length);
int e;
GetElem(s, 5, e);
printf("第5个元素的值是: %d\n", e);
printf("---------------------------------\n");
PriorElem(s, 7, e);
printf("第7个元素的前驱是: %d\n", e);
NextElem(s, 7, e);
printf("第7个元素的后继是: %d\n", e);
printf("---------------------------------\n");
ListDelete(s, 1, e);
printf("删除1号元素后的表长: %d\n", s.length);
for(int i = 0; i < s.length; i++){
printf("第%d个元素为:%d\n", i + 1, s.elem[i]);
}
printf("---------------------------------\n");
ListClear(s);
printf("清空后s的表长: %d\n", s.length);
DestroyList(s);
return 0;
}

运行结果:

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
开始初始化线性表s
空表长度: 0, 分配存储大小: 100
---------------------------------
开始进行插入操作
线性表第1个元素插入1
线性表第2个元素插入2
线性表第3个元素插入3
线性表第4个元素插入4
线性表第5个元素插入5
线性表第6个元素插入6
线性表第7个元素插入7
线性表第8个元素插入8
线性表第9个元素插入9
线性表第10个元素插入10
---------------------------------
此时线性表的表长为: 10
第5个元素的值是: 5
---------------------------------
第7个元素的前驱是: 6
第7个元素的后继是: 8
---------------------------------
删除1号元素后的表长: 9
第1个元素为:2
第2个元素为:3
第3个元素为:4
第4个元素为:5
第5个元素为:6
第6个元素为:7
第7个元素为:8
第8个元素为:9
第9个元素为:10
---------------------------------
清空后s的表长: 0
Hit any key to close this window...

谢谢你请我吃苹果!
-------------本文结束感谢您的阅读-------------