纯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];
  9     int length;
 10 }SqList;
 11 
 12 SqList *InitList(SqList *L);//初始化
 13 void DestroyList(SqList *L);//销毁
 14 void ClearList(SqList *L);//清空列表
 15 int ListEmpty(SqList *L);//判空
 16 int ListLength(SqList *L);//返回线性表长度
 17 int GetElem(SqList *L, int i, ElemType *e);//获取第i个元素
 18 int LocateElem(SqList *L, ElemType e);//定位值为e的位置
 19 ElemType PriorElem(SqList *L, ElemType cur_e);//查找前驱
 20 ElemType NextElem(SqList *L, ElemType cur_e);//查找后继
 21 int ListInsert(SqList *L, int i, ElemType e);//插入元素
 22 int ListDelete(SqList *L, int i);//删除第i个元素
 23 int TraverseList(SqList *L);//遍历线性表
 24 
 25 //初始化线性表,返回头指针
 26 SqList* InitList(SqList *L){
 27     int x;
 28     int index = 0;
 29 
 30     L = (SqList *)malloc(sizeof(SqList));
 31     if(L){
 32         printf("输入到-1结束\n");
 33         while(1){
 34             scanf("%d", &x);
 35             if(x == -1){
 36                 printf("初始化成功\n");
 37                 break;
 38             };
 39             L->data[index++] = x;
 40         }
 41         L->length = index;
 42     }else{
 43         printf("空间不足,初始化失败\n");
 44     }
 45     return L;
 46 }
 47 
 48 //销毁线性表
 49 void DestroyList(SqList *L){
 50     free(L);
 51     printf("销毁成功\n");
 52 }
 53 
 54 //清空线性表
 55 void ClearList(SqList *L){
 56     int len = L->length;
 57     int i;
 58     for(i=0; i<len; i++){
 59         L->data[i] = 0;
 60     }
 61     printf("清空成功\n");
 62 }
 63 
 64 //判空,1为空,0不为空
 65 int ListEmpty(SqList *L){
 66     return (L->length == 0);
 67 }
 68 
 69 //返回线性表长度
 70 int ListLength(SqList *L){
 71     return L->length;
 72 }
 73 
 74 //获取第i个元素,返回是否获取的状态
 75 int GetElem(SqList *L, int i, ElemType *e){
 76     if(i<1 || i>L->length){
 77         printf("查找下标%d越界\n",i);
 78         return 0;
 79     }
 80     *e = L->data[i-1];
 81     printf("第%d个元素是%d\n", i, *e);
 82     return 1;
 83 }
 84 
 85 //返回第一个与e相同元素的位置,返回找寻到的下标
 86 int LocateElem(SqList *L, ElemType e){
 87     int i;
 88     for(i=0; i<L->length; i++){
 89         if(L->data[i] == e){
 90             printf("元素%d的位置是第%d个\n",e,i+1);
 91             return i+1;
 92         }
 93 
 94     }
 95     printf("%d, 查无此元素的下标\n", e);
 96     return 0;
 97 }
 98 //返回元素为e的前驱元素
 99 ElemType PriorElem(SqList *L, ElemType cur_e){
100     int idx = LocateElem(L, cur_e);
101     ElemType e;
102     if(!idx){
103         return 0;
104     }
105     if(idx == 1){
106         printf("第一个元素%d没有前驱\n", cur_e);
107         return 0;
108     }
109     GetElem(L, idx-1, &e);
110     printf("%d元素的前驱是%d\n",cur_e, e);
111     return e;
112 }
113 //返回元素e的后继元素
114 ElemType NextElem(SqList *L, ElemType cur_e){
115     int idx = LocateElem(L, cur_e);
116     ElemType e;
117     if(!idx){
118         return 0;
119     }
120     if(idx == L->length){
121         printf("最后一个元素%d没有后继\n", cur_e);
122         return 0;
123     }
124     GetElem(L, idx+1, &e);
125     printf("%d元素的后继是%d\n",cur_e, e);
126     return e;
127 }
128 //插入,返回是否插入成功的状态
129 int ListInsert(SqList *L, int i, ElemType e){
130     if(i<1 || i>L->length+1){
131         printf("插入位置有误\n");
132         return 0;
133     }
134     if(L->length == MAXSIZE){
135         printf("线性表已满无法插入新元素\n");
136         return 0;
137     }
138     int j;
139     for(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");
145     return 1;
146 }
147 //删除第i个元素,返回是否删除成功的状态
148 int ListDelete(SqList *L, int i){
149     if(i<1 || i>L->length){
150         printf("删除位置有误\n");
151         return 0;
152     }
153     int j;
154     for(j=i; j<L->length; j++){
155         L->data[j-1] = L->data[j];
156     }
157     L->length--;
158     printf("删除成功\n");
159     return 1;
160 }
161 
162 //遍历线性表
163 int TraverseList(SqList *L){
164     if(L->length == 0){
165         printf("空表\n");
166         return 0;
167     }
168     if(L->length>MAXSIZE || L->length<-MAXSIZE){
169         printf("线性表已被摧毁或未初始化\n");
170         return 0;
171     }
172     int j;
173     for(j=0; j<L->length; j++){
174         printf("%d ", L->data[j]);
175     }
176     printf("\n");
177 }
178 
179 int main(void){
180     int idx;
181     int 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);
227     return 0;
228 }

书虽然说是C语言实现,但基本都是用C++的引用参数。

我就尝试把所有的用C语言实现,基本和书上的参数都是一一对应的,

把初始化的返回值改为了一个指针返回,就不用搞那种地址传递还是值传递的问题。

摧毁的功能还有点问题,debug正常,但是正常运行,表内的值还有保留的,百度下来

好像说free这个并不是真正意义上的都释放了。

如果有问题,请指出,我好进行改进。

posted @ 2019-05-18 22:46  PowerZZJ  阅读(2678)  评论(0编辑  收藏  举报