大话数据结构-链式线性表

删除部分在Dev C++里面运行报错,没找到原因(呵呵)

  1 #include "stdio.h"    
  2 #include "string.h"
  3 #include "ctype.h"      
  4 #include "stdlib.h"   
  5 #include "io.h"  
  6 #include "math.h"  
  7 #include "time.h"
  8 
  9 #define OK 1
 10 #define ERROR 0
 11 #define TRUE 1
 12 #define FALSE 0
 13 
 14 #define MAXSIZE 20 /* 存储空间初始分配量 */
 15 
 16 typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
 17 typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */
 18 
 19 typedef struct Node{
 20     ElemType data;
 21     struct Node *next;
 22 } Node;
 23 
 24 typedef struct Node *LinkList; 
 25 //打印显示 
 26 Status visit(ElemType e){
 27     printf("%d\n",e);
 28     return OK;
 29 }
 30 
 31 //初始化线性表,初始化线性表的头结点
 32 Status InitList(LinkList *L){
 33     *L = (LinkList)malloc(sizeof(LinkList));
 34     if(!(*L)){
 35         return ERROR;
 36     }
 37     (*L)->next = NULL;
 38     return OK;
 39 }
 40 //判断链式线性表是否为空 
 41 /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
 42 Status ListEmpty(LinkList L){
 43     if(!L->next){
 44         return TRUE;
 45     } 
 46     return FALSE;
 47 }
 48  
 49 /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
 50 //需要Free掉不用的空间 
 51 Status ClearList(LinkList *L){
 52     struct Node *p;
 53     struct Node *q;
 54     p = (*L)->next;
 55     while(!p){
 56         q = p->next;
 57         free(p);
 58         p = q;
 59     }
 60     (*L)->next = NULL;
 61     return OK;
 62 }
 63 
 64 /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
 65 //元素个数不包含头结节 
 66 int ListLength(LinkList L){
 67     if(!L->next){
 68         return 0;
 69     }
 70     struct Node *p = L->next;
 71     int i=0;
 72     while(p){
 73         i++;
 74         p = p->next;
 75     }
 76     return i;
 77 }
 78 
 79 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
 80 /* 操作结果:用e返回L中第i个数据元素的值 */
 81 Status GetElem(LinkList L,int i,ElemType *e){
 82     if(i<1) return ERROR;
 83     int j=1;
 84     LinkList p = L->next;
 85     while(p && j/* p不为空或者计数器j还没有等于i时,循环继续 */
 86         p = p->next;
 87         j++;
 88     }
 89     if(!p || jreturn ERROR;
 90     *e = p->data;
 91     return OK;
 92 }
 93 
 94 /* 初始条件:顺序线性表L已存在 */
 95 /* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
 96 /* 若这样的数据元素不存在,则返回值为0 */
 97 int LocateElem(LinkList L,ElemType e){
 98     int i=0;
 99     LinkList p = L->next;
100     while(p){
101         i++;
102         if(p->data == e){
103             return i;
104         }
105         p = p->next;
106     }
107     return 0;
108 }
109 
110 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
111 /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
112 Status ListInsert(LinkList *L,int i,ElemType e){
113     if(i<1) return ERROR;
114     int j=1;
115     LinkList p = *L;
116     while(p&&j<i){
117         j++;
118         p=p->next;
119     }
120     if(!p){
121         return ERROR;
122     }
123     LinkList t = (LinkList)malloc(sizeof(LinkList));
124     t->data = e;
125     t->next = p->next;
126     p->next = t;
127     return OK;
128 }
129 
130 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
131 /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
132 Status ListDelete(LinkList *L,int i,ElemType *e) {
133     int j=1;
134     LinkList p = (*L)->next;
135     LinkList q = *L;
136     while(p && j<i){
137         j++;
138         q=p;
139         p=p->next;
140     }
141     if(!p||j>i){
142         return ERROR; 
143     }
144     q->next = p->next;
145     *e = p->data; 
146     free(p);
147     return OK;
148 }
149 
150 Status ListDelete2(LinkList *L,int i,ElemType *e) 
151 { 
152     int j;
153     LinkList p,q;
154     p = *L;
155     j = 1;
156     while (p->next && j < i)    /* 遍历寻找第i个元素 */
157     {
158         p = p->next;
159         ++j;
160     }
161     if (!(p->next) || j > i) 
162         return ERROR;           /* 第i个元素不存在 */
163     q = p->next;
164     p->next = q->next;            /* 将q的后继赋值给p的后继 */
165     *e = q->data;               /* 将q结点中的数据给e */
166     free(q);                    /* 让系统回收此结点,释放内存 */
167     return OK;
168 }
169 
170 /* 初始条件:顺序线性表L已存在 */
171 /* 操作结果:依次对L的每个数据元素输出 */
172 Status ListTraverse(LinkList L){
173     LinkList p = L->next;
174     while(p){
175         visit(p->data);
176         p = p->next;
177     }
178     printf("\n");
179     return OK;
180 }
181 
182 /*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
183 //1.声明一指针p和计数器变量i;
184 //2.初始化一空链表L;
185 //3.让L的头结点的指针指向NULL,
186 //即建立一个带头结点的单链表;
187 //4.循环:
188 //生成一新结点赋值给p;
189 //随机生成一数字赋值给p的数据域p->data;
190 //将p插入到头结点与前一新结点之间
191 void CreateListHead(LinkList *L, int n) {
192     int i;
193     LinkList p;
194     srand(time(0));
195     *L = (LinkList)malloc(sizeof(LinkList));
196     (*L)->next = NULL;
197     for(i=1;i<=n;i++){
198         p = (LinkList)malloc(sizeof(LinkList));
199         p->data = rand()%100+1;
200         p->next = (*L)->next;
201         (*L)->next = p;
202     }
203 }
204 
205 /*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
206 void CreateListTail(LinkList *L, int n){
207     int i;
208     LinkList p,last;
209     srand(time(0));
210     *L = (LinkList)malloc(sizeof(LinkList));
211     (*L)->next = NULL;
212     last = *L;
213     for(i=1;i<=n;i++){
214         p = (LinkList)malloc(sizeof(LinkList));
215         last->next = p;
216         p->data = rand()%100+1;
217         p->next = NULL;
218         last = p;
219     }
220 } 
221 
222 
223 int main(void){
224     LinkList L;
225     ElemType e;
226     Status i;
227     int j,k;
228     i=InitList(&L);
229     printf("初始化L后:ListLength(L)=%d\n",ListLength(L));
230     for(j=1;j<=5;j++)
231             i=ListInsert(&L,1,j);
232     i=ListInsert(&L,6,j);
233     printf("在L的表头依次插入1~5后:L.data=");
234     ListTraverse(L); 
235 
236     printf("ListLength(L)=%d \n",ListLength(L));
237     i=ListEmpty(L);
238     printf("L是否空:i=%d(1:是 0:否)\n",i);
239 
240     i=ClearList(&L);
241     printf("清空L后:ListLength(L)=%d\n",ListLength(L));
242     i=ListEmpty(L);
243     printf("L是否空:i=%d(1:是 0:否)\n",i);
244 
245     for(j=1;j<=10;j++)
246             ListInsert(&L,j,j);
247     printf("在L的表尾依次插入1~10后:L.data=");
248     ListTraverse(L); 
249 
250     printf("ListLength(L)=%d \n",ListLength(L));
251 
252     ListInsert(&L,1,0);
253     printf("在L的表头插入0后:L.data=");
254     ListTraverse(L); 
255     printf("ListLength(L)=%d \n",ListLength(L));
256 
257     GetElem(L,5,&e);
258     printf("第5个元素的值为:%d\n",e);
259     for(j=3;j<=4;j++)
260     {
261             k=LocateElem(L,j);
262             if(k)
263                     printf("第%d个元素的值为%d\n",k,j);
264             else
265                     printf("没有值为%d的元素\n",j);
266     }
267     
268 
269 //    k=ListLength(L); /* k为表长 */
270 //    for(j=k+1;j>=k;j--)
271 //    {
272 //            i=ListDelete(&L,j,&e); /* 删除第j个数据 */
273 //            if(i==ERROR)
274 //                    printf("删除第%d个数据失败\n",j);
275 //            else
276 //                    printf("删除第%d个的元素值为:%d\n",j,e);
277 //    }
278 //    printf("依次输出L的元素:");
279 //    ListTraverse(L); 
280 
281 //    j=5;
282 //    ListDelete(&L,j,&e); /* 删除第5个数据 */
283 //    printf("删除第%d个的元素值为:%d\n",j,e);
284 
285     printf("依次输出L的元素:");
286     ListTraverse(L); 
287 
288     i=ClearList(&L);
289     printf("\n清空L后:ListLength(L)=%d\n",ListLength(L));
290     CreateListHead(&L,20);
291     printf("整体创建L的元素(头插法):");
292     ListTraverse(L); 
293     
294     i=ClearList(&L);
295     printf("\n删除L后:ListLength(L)=%d\n",ListLength(L));
296     CreateListTail(&L,20);
297     printf("整体创建L的元素(尾插法):");
298     ListTraverse(L); 
299 }

 

转载于:https://www.cnblogs.com/xxyxpy/p/5374660.html

你可能感兴趣的:(大话数据结构-链式线性表)