首页 > 代码库 > 线性表实现——单链表

线性表实现——单链表

  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 }

 

线性表实现——单链表