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