删除部分在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 }