1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 #define OK 1 6 #define ERROR 0 7 typedef int Status; 8 typedef int ElemType; 9 10 typedef struct Node 11 { 12 ElemType data; 13 struct Node* next; 14 }Node; 15 16 typedef struct Node* LinkList; 17 18 Status InitList(LinkList* L) //初始化操作,建立一个空的线性表.想把头指针里面的值改掉,所以传个头指针的地址 19 { 20 *L = (LinkList)malloc(sizeof(Node)); 21 if (!(*L)) 22 return ERROR; 23 (*L)->next = *L; 24 return OK; 25 } 26 Status ListEmpty(LinkList L) //若线性表为空,返回true,否则返回false 27 { 28 if (L->next == L) 29 return OK; 30 return ERROR; 31 } 32 Status ClearList(LinkList* L) //清空线性表 33 { 34 LinkList p = (*L)->next; 35 LinkList q; 36 while (p != *L) 37 { 38 q = p; 39 p = p->next; 40 free(q); 41 } 42 (*L)->next = (*L); 43 return OK; 44 } 45 Status GetElem(LinkList L, int i, ElemType *e) //查找线性表中的第i个位置的元素值,并赋值给e 46 { 47 int j = 1; 48 LinkList p = L->next; 49 while ((p!=L) && j < i) 50 { 51 p = p->next; 52 j++; 53 } 54 if ((p==L) || j > i) 55 return ERROR; 56 *e = p->data; 57 return OK; 58 } 59 Status LocateElem(LinkList L, ElemType e) //查找线性表L中与给定值e相等的元素,如果查找成功,则返回第一个相同的元素在L中的下标;否则,返回0表示失败 60 { 61 int i = 1; 62 LinkList p = L->next; 63 while (p != L && p->data != e) 64 { 65 p = p->next; 66 i++; 67 } 68 if (!p) 69 return ERROR; 70 return i; 71 } 72 Status ListInsert(LinkList* L, int i, ElemType e) //在线性表L的第i个位置插入元素e 73 { 74 LinkList p, q; 75 p = (*L)->next; 76 int j = 1; 77 if ((*L)->next == *L) 78 { 79 if (i == 1) 80 { 81 goto ADD; 82 } 83 } 84 while ((p!=*L) && j < i) //尾部插入时,p指向最后一个值,而j=i-1 85 { 86 p = p->next; 87 j++; 88 } 89 if ((p==*L) || j > i) 90 return ERROR; 91 ADD: 92 q = (LinkList)malloc(sizeof(Node)); 93 q->data = e; 94 q->next = p->next; 95 p->next = q; 96 97 return ERROR; 98 } 99 Status ListDelete(LinkList*L, int i, ElemType* e) //删除线性表L中第i个位置元素,并用e返回其值 100 { 101 LinkList p, q; 102 p = *L; 103 int j = 1; 104 //while (p && j<i) 105 while ((p->next!=*L) && j < i) 106 { 107 p = p->next; 108 j++; 109 } 110 //if (!p || j > i) 111 if (!(p->next) || j > i) 112 return ERROR; 113 q = p->next; 114 *e = q->data; 115 p->next = q->next; 116 free(q); 117 return OK; 118 } 119 Status CreateListHead(LinkList *L, int n) 120 { 121 LinkList p; 122 int i; 123 (*L) = (LinkList)malloc(sizeof(Node)); 124 (*L)->next = *L; 125 for (i = 0; i < n; i++) 126 { 127 p = (LinkList)malloc(sizeof(Node)); 128 p->data = i; 129 p->next = (*L)->next; 130 (*L)->next = p; 131 } 132 return OK; 133 } 134 Status CreateListTail(LinkList *L, int n) 135 { 136 LinkList p; 137 int i; 138 (*L) = (LinkList)malloc(sizeof(Node)); 139 //(*L)->next = NULL; 140 LinkList q = (*L); 141 for (i = 0; i < n; i++) 142 { 143 p = (LinkList)malloc(sizeof(Node)); 144 p->data = i + 10; 145 q->next = p; 146 q = p; 147 } 148 q->next = *L; 149 return OK; 150 } 151 Status visit(ElemType n) 152 { 153 printf("-> %d ", n); 154 return OK; 155 } 156 Status ListTraverse(LinkList L) 157 { 158 LinkList p = L->next; 159 while (p != L) 160 { 161 visit(p->data); 162 p = p->next; 163 } 164 return OK; 165 } 166 167 int ListLength(LinkList L) //返回线性表L的长度 168 { 169 int i = 0; 170 LinkList p = L->next; 171 while (p != L) 172 { 173 i++; 174 p = p->next; 175 } 176 return i; 177 } 178 179 int main() 180 { 181 LinkList L; 182 Status i, j; 183 char opp = '-1'; 184 ElemType e; 185 int pos = 1; 186 int k = 0; 187 188 i = InitList(&L); 189 printf("链表L初始化完毕,ListLength(L)=%d\n\n", ListLength(L)); 190 191 printf("\n1.遍历操作 \n2.插入操作 \n3.删除操作 \n4.获取结点数据\n5.查找某个数是否在链表中 \n6.头插法创建链表 \n7.尾插法创建链表 \n8.置空链表 \n0.退出 \n请选择你的操作:\n"); 192 193 while (opp != '0') { 194 scanf_s("%c", &opp); 195 switch (opp) { 196 case '1': 197 ListTraverse(L); 198 printf("\n"); 199 break; 200 201 case '2': 202 srand((unsigned)time(NULL)); 203 for (j = 1; j <= 10; j++) 204 { 205 i = ListInsert(&L, 1, rand() % 100); 206 } 207 printf("在L的表头依次插入10个随机数后:"); 208 ListTraverse(L); 209 printf("\n"); 210 printf("链表L创建完毕,ListLength(L)=%d\n\n", ListLength(L)); 211 break; 212 case '3': 213 printf("要删除第几个元素?"); 214 scanf_s("%d", &pos); 215 ListDelete(&L, pos, &e); 216 printf("删除第%d个元素成功,现在链表为:\n", pos); 217 ListTraverse(L); 218 printf("\n"); 219 break; 220 221 case '4': 222 printf("你需要获取第几个元素?"); 223 scanf_s("%d", &pos); 224 GetElem(L, pos, &e); 225 printf("第%d个元素的值为:%d\n", pos, e); 226 printf("\n"); 227 break; 228 case '5': 229 printf("输入你需要查找的数:"); 230 scanf_s("%d", &pos); 231 k = LocateElem(L, pos); 232 if (k) 233 printf("第%d个元素的值为%d\n", k, pos); 234 else 235 printf("没有值为%d的元素\n", pos); 236 printf("\n"); 237 break; 238 case '6': 239 CreateListHead(&L, 10); 240 printf("整体创建L的元素(头插法):\n"); 241 ListTraverse(L); 242 printf("\n"); 243 break; 244 245 case '7': 246 CreateListTail(&L, 10); 247 printf("整体创建L的元素(尾插法):\n"); 248 ListTraverse(L); 249 printf("\n"); 250 break; 251 252 case '8': 253 i = ClearList(&L); 254 printf("\n清空L后:ListLength(L)=%d\n", ListLength(L)); 255 ListTraverse(L); 256 printf("\n"); 257 break; 258 259 case '0': 260 exit(0); 261 } 262 } 263 }