首页 > 代码库 > 线性表实现——单链表
线性表实现——单链表
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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 = http://www.mamicode.com/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 else227 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 }
线性表实现——单链表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。