纯C语言实现线性表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
纯C语⾔实现线性表
1 #include <stdio.h>
2 #include <stdlib.h>
3#define MAXSIZE 100
4
5 typedef int ElemType;
6
7 typedef struct{
8 ElemType data[MAXSIZE];
9int length;
10 }SqList;
11
12 SqList *InitList(SqList *L);//初始化
13void DestroyList(SqList *L);//销毁
14void ClearList(SqList *L);//清空列表
15int ListEmpty(SqList *L);//判空
16int ListLength(SqList *L);//返回线性表长度
17int GetElem(SqList *L, int i, ElemType *e);//获取第i个元素
18int LocateElem(SqList *L, ElemType e);//定位值为e的位置
19 ElemType PriorElem(SqList *L, ElemType cur_e);//查找前驱
20 ElemType NextElem(SqList *L, ElemType cur_e);//查找后继
21int ListInsert(SqList *L, int i, ElemType e);//插⼊元素
22int ListDelete(SqList *L, int i);//删除第i个元素
23int TraverseList(SqList *L);//遍历线性表
24
25//初始化线性表,返回头指针
26 SqList* InitList(SqList *L){
27int x;
28int index = 0;
29
30 L = (SqList *)malloc(sizeof(SqList));
31if(L){
32 printf("输⼊到-1结束\n");
33while(1){
34 scanf("%d", &x);
35if(x == -1){
36 printf("初始化成功\n");
37break;
38 };
39 L->data[index++] = x;
40 }
41 L->length = index;
42 }else{
43 printf("空间不⾜,初始化失败\n");
44 }
45return L;
46 }
47
48//销毁线性表
49void DestroyList(SqList *L){
50free(L);
51 printf("销毁成功\n");
52 }
53
54//清空线性表
55void ClearList(SqList *L){
56int len = L->length;
57int i;
58for(i=0; i<len; i++){
59 L->data[i] = 0;
60 }
61 printf("清空成功\n");
62 }
63
64//判空,1为空,0不为空
65int ListEmpty(SqList *L){
66return (L->length == 0);
67 }
68
69//返回线性表长度
70int ListLength(SqList *L){
71return L->length;
72 }
73
74//获取第i个元素,返回是否获取的状态
75int GetElem(SqList *L, int i, ElemType *e){
76if(i<1 || i>L->length){
77 printf("查找下标%d越界\n",i);
78return0;
79 }
80 *e = L->data[i-1];
81 printf("第%d个元素是%d\n", i, *e);
82return1;
83 }
84
85//返回第⼀个与e相同元素的位置,返回找寻到的下标 86int LocateElem(SqList *L, ElemType e){
87int i;
88for(i=0; i<L->length; i++){
89if(L->data[i] == e){
90 printf("元素%d的位置是第%d个\n",e,i+1); 91return i+1;
92 }
93
94 }
95 printf("%d, 查⽆此元素的下标\n", e);
96return0;
97 }
98//返回元素为e的前驱元素
99 ElemType PriorElem(SqList *L, ElemType cur_e){ 100int idx = LocateElem(L, cur_e);
101 ElemType e;
102if(!idx){
103return0;
104 }
105if(idx == 1){
106 printf("第⼀个元素%d没有前驱\n", cur_e); 107return0;
108 }
109 GetElem(L, idx-1, &e);
110 printf("%d元素的前驱是%d\n",cur_e, e);
111return e;
112 }
113//返回元素e的后继元素
114 ElemType NextElem(SqList *L, ElemType cur_e){ 115int idx = LocateElem(L, cur_e);
116 ElemType e;
117if(!idx){
118return0;
119 }
120if(idx == L->length){
121 printf("最后⼀个元素%d没有后继\n", cur_e); 122return0;
123 }
124 GetElem(L, idx+1, &e);
125 printf("%d元素的后继是%d\n",cur_e, e);
126return e;
127 }
128//插⼊,返回是否插⼊成功的状态
129int ListInsert(SqList *L, int i, ElemType e){
130if(i<1 || i>L->length+1){
131 printf("插⼊位置有误\n");
132return0;
133 }
134if(L->length == MAXSIZE){
135 printf("线性表已满⽆法插⼊新元素\n");
136return0;
137 }
138int j;
139for(j=L->length-1; j>=i-1; j--){
140 L->data[j+1] = L->data[j];
141 }
142 L->data[i-1] = e;
143 L->length++;
144 printf("插⼊成功\n");
145return1;
146 }
147//删除第i个元素,返回是否删除成功的状态
148int ListDelete(SqList *L, int i){
149if(i<1 || i>L->length){
150 printf("删除位置有误\n");
151return0;
152 }
153int j;
154for(j=i; j<L->length; j++){
155 L->data[j-1] = L->data[j];
156 }
157 L->length--;
158 printf("删除成功\n");
159return1;
160 }
161
162//遍历线性表
163int TraverseList(SqList *L){
164if(L->length == 0){
165 printf("空表\n");
166return0;
167 }
168if(L->length>MAXSIZE || L->length<-MAXSIZE){
169 printf("线性表已被摧毁或未初始化\n");
170return0;
171 }
172int j;
173for(j=0; j<L->length; j++){
174 printf("%d ", L->data[j]);
175 }
176 printf("\n");
177 }
178
179int main(void){
180int idx;
181int len;
182 ElemType e;
183 ElemType cur_e;
184 SqList *L = NULL;
185
186 L = InitList(L);
187
188// printf("线性表长度为%d\n",ListLength(L));
189
190////判空测试
191// if(ListEmpty(L))
192// printf("线性表空\n");
193// else
194// printf("线性表不为空\n");
195
196////获取元素测试
197// idx = 2;
198// GetElem(L, idx, &e);
199// GetElem(L, L->length+1, &e);
200
201////获取位置测试
202// LocateElem(L, 3);
203
204////获取前驱测试
205// cur_e = 4;
206// PriorElem(L, cur_e);
207// GetElem(L, 1, &cur_e);
208// PriorElem(L, cur_e);
209
210////插⼊测试
211// ListInsert(L, 1, 999);
212// TraverseList(L);
213// ListInsert(L, L->length+1, 999);
214// TraverseList(L);
215
216////删除测试
217// ListDelete(L, 1);
218// TraverseList(L);
219
220////清空测试
221// ClearList(L);
222// TraverseList(L);
223
224////摧毁测试
225// DestroyList(L);
226// TraverseList(L);
227return0;
228 }
书虽然说是C语⾔实现,但基本都是⽤C++的引⽤参数。
我就尝试把所有的⽤C语⾔实现,基本和书上的参数都是⼀⼀对应的,
把初始化的返回值改为了⼀个指针返回,就不⽤搞那种地址传递还是值传递的问题。
摧毁的功能还有点问题,debug正常,但是正常运⾏,表内的值还有保留的,百度下来好像说free这个并不是真正意义上的都释放了。
如果有问题,请指出,我好进⾏改进。