1 /*静态链表*/ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <time.h> 5 6 #define OK 1 7 #define ERROR 0 8 #define MAXSIZE 1000 9 typedef int ElemType; 10 typedef int Status; 11 12 typedef struct 13 { 14 ElemType data; 15 int cur; 16 }Component,StaticLinkList[MAXSIZE]; 17 18 19 Status InitList(StaticLinkList space) //初始化操作 20 { 21 int i; 22 for (i = 0; i < MAXSIZE; i++) 23 { 24 space[i].cur = i + 1; 25 } 26 space[MAXSIZE - 1].cur = 0; 27 return OK; 28 } 29 int Malloc_SLL(StaticLinkList space) 30 { 31 int i = space[0].cur; 32 if (space[0].cur) 33 space[0].cur = space[i].cur; 34 return i; 35 } 36 37 int ListLength(StaticLinkList L) 38 { 39 int j = 0; 40 int i = L[MAXSIZE - 1].cur; 41 while (i) 42 { 43 i = L[i].cur; 44 j++; 45 } 46 return j; 47 } 48 49 void Free_SSL(StaticLinkList L, int k) //清空线性表 50 { 51 L[k].cur = L[0].cur; 52 L[0].cur = k; 53 } 54 55 Status ListInsert(StaticLinkList L, int i, ElemType e) //在线性表L的第i个位置插入元素e 56 { 57 int j, k, l; 58 k = MAXSIZE - 1; 59 if (i<1 || i>ListLength(L)+1) 60 return ERROR; 61 j = Malloc_SLL(L); 62 if (j) 63 { 64 for (l = 1; l <= i-1; l++) 65 { 66 k = L[k].cur; 67 } 68 L[j].data = e; 69 L[j].cur = L[k].cur; 70 L[k].cur = j; 71 return OK; 72 } 73 return ERROR; 74 } 75 76 Status ListDelete(StaticLinkList L, int i, ElemType* e)//删除线性表L中第i个位置元素,并用e返回其值 77 { 78 int j, k; 79 k = MAXSIZE - 1; 80 if (i<1 || i>ListLength(L) + 1) 81 return ERROR; 82 83 for (j = 1; j <= i; j++) 84 { 85 k = L[k].cur; 86 } 87 j = L[k].cur; 88 L[k].cur = L[j].cur; 89 Free_SSL(L, j); 90 return OK; 91 } 92 93 void visit(ElemType n) 94 { 95 printf("%d ", n); 96 } 97 98 void ListTraverse(StaticLinkList L) 99 { 100 int i = L[MAXSIZE - 1].cur; 101 while (i) 102 { 103 visit(L[i].data); 104 i = L[i].cur; 105 } 106 } 107 int main() 108 { 109 StaticLinkList L; 110 int i = 0; 111 int opp = 0; 112 int pos; 113 int j; 114 ElemType e; 115 i = InitList(L); 116 printf("链表L初始化完毕,ListLength(L)=%d\n\n", ListLength(L)); 117 118 printf("\n1.遍历操作 \n2.插入操作 \n3.删除操作 \n0.退出 \n请选择你的操作:\n"); 119 120 while (opp != '0') { 121 scanf_s("%c", &opp); 122 switch (opp) { 123 case '1': 124 ListTraverse(L); 125 printf("\n"); 126 break; 127 128 case '2': 129 srand((unsigned)time(NULL)); 130 for (j = 1; j <= 10; j++) 131 { 132 i = ListInsert(L, j, rand() % 100); 133 } 134 printf("在L的表头依次插入10个随机数后:"); 135 ListTraverse(L); 136 printf("\n"); 137 printf("链表L创建完毕,ListLength(L)=%d\n\n", ListLength(L)); 138 break; 139 case '3': 140 printf("要删除第几个元素?"); 141 scanf_s("%d", &pos); 142 ListDelete(L, pos, &e); 143 printf("删除第%d个元素成功,现在链表为:\n", pos); 144 ListTraverse(L); 145 printf("\n"); 146 break; 147 148 case '0': 149 exit(0); 150 } 151 } 152 }