【数据结构】C语言实现顺序链表

来源:互联网 发布:python redis pubsub 编辑:程序博客网 时间:2024/04/26 13:29

这是在上数据结构课程时候的练习,以后拿过来随时用。


#include <stdio.h>#include <malloc.h>#include <string.h>#include <math.h>#include <stdlib.h>typedef int elemtype;#define TRUE 0#define FALSE 1#define OK 1#define ERROR 0#define INFEASIBLE -1#if(1)typedef struct LNode{struct LNode *next;int date;}*LinkList;//typedef LNode *LinkList;#endif#if(0)typedef struct LNode{struct LNode *next;elemtype data;};#endifvoid InitList(LinkList L){L = (LinkList)malloc(sizeof(struct LNode));if(!L){exit(-1);}L->next = NULL;}void DestroyList(LinkList L){LinkList q;while(L){q = L->next;free(L);L = q;}}void ClearList(LinkList L){LinkList p, q;p = L->next;          //p = L的话就销毁了链表相当于DestroyListwhile(p){q = p->next;free(p);p = q;}L->next = NULL;}int ListEmpty(LinkList L){if(L->next){return FALSE;}return TRUE;}int ListLength(LinkList L){int i = 0;LinkList p = L->next;        //应该设立一个新的指针代替L,while(p){i++;p = p->next;}return i;}int GetElem(LinkList L, int i, elemtype *e){int j;LinkList p;p = L;for(j = 0; j < i; j++){p = p->next;}if(!p){return ERROR;}*e = p->date;return OK;}int LocateElem(LinkList L, elemtype *e){int i = 0;LinkList p;p = L->next;while(p){i++;if(p->date == *e){return i;}p = p->next;}return 0;}int PriorElem(LinkList L, elemtype cur_e, elemtype *pre_e){LinkList p, q;p = L->next;while(p->next){q = p->next;if(q->date == cur_e){*pre_e = p->date;return OK;}p = q;}return INFEASIBLE;}int NextElem(LinkList L, elemtype cur_e, elemtype *next_e){LinkList p;               //remember itp = L->next;while(p->next){if(p->date == cur_e){*next_e = p->next->date;return OK;}p = p->next;}return INFEASIBLE;}int ListInsert(LinkList L, int i, elemtype e){int j = 1;LinkList p = L, s;if(i < 1){return ERROR;}s = (LinkList)malloc(sizeof(struct LNode));s->date = e;if(i == 1){s->next = L;L = s;}else{while(p && j < i - 1){p = p->next;j++;}if(!p){return ERROR;}s->next = p->next;p->next = s;}return OK;}int ListDelete(LinkList L, int i, elemtype *e){int j = 1;LinkList p = L->next;LinkList q = L;while(j < i){p = p->next;q = q->next;j++;}if(!p || j >= i){return ERROR;}q->next = p->next;*e = p->date;free(p);return OK;}void ListTraverse(LinkList L){LinkList q = L;while(q){printf("%d ", q->date);q = q->next;}//printf("\n\n");}#if(0)void main(){ // 除了几个输出语句外,主程序和main2-1.cpp很像LinkList L = NULL; // 与main2-1.cpp不同elemtype e, e0;int i;int j, k;InitList(L);for(j=1; j<=5; j++){i = ListInsert(L, 1, &j);}printf("在L的表头依次插入1~5后:L=");ListTraverse(L); // 依次对元素调用print(),输出元素的值i = ListEmpty(L);printf("L是否空:i=%d(1:是0:否)\n",i);ClearList(L);printf("清空L后:L=");ListTraverse(L);i = ListEmpty(L);printf("L是否空:i=%d(1:是0:否)\n",i);for(j=1; j<=10; j++){ListInsert(L, j, &j);}printf("在L的表尾依次插入1~10后:L=");ListTraverse(L);GetElem(L, 5, &e);printf("第5个元素的值为%d\n",e);for(j=0; j<=1; j++){k = LocateElem(L, &j);if(k){printf("第%d个元素的值为%d\n",k,j);}else{printf("没有值为%d的元素\n",j);}}for(j=1;j<=2;j++) // 测试头两个数据{GetElem(L, j, &e0); // 把第j个数据赋给e0i = PriorElem(L, e0, &e); // 求e0的前驱if(i == INFEASIBLE)printf("元素%d无前驱\n", e0);elseprintf("元素%d的前驱为%d\n", e0, e);}for(j=ListLength(L)-1; j<=ListLength(L); j++) // 最后两个数据{GetElem(L, j, &e0); // 把第j个数据赋给e0i=NextElem(L, e0, &e); // 求e0的后继if(i == INFEASIBLE){printf("元素%d无后继\n",e0);}else{printf("元素%d的后继为%d\n", e0, e);}}k = ListLength(L); // k为表长for(j=k+1; j>=k; j--){i = ListDelete(L, j, &e); // 删除第j个数据if(i == ERROR){printf("删除第%d个元素失败\n",j);}else{printf("删除第%d个元素成功,其值为%d\n", j, e);}}printf("依次输出L的元素:");ListTraverse(L);DestroyList(L);printf("销毁L后:L=%u\n",L);}#endifvoid main(){LinkList L = NULL;int i, j;InitList(L);for(j=1; j<=5; j++){i = ListInsert(L, 1, j);}printf("在L的表头依次插入1~5后:L=");ListTraverse(L); // 依次对元素调用print(),输出元素的值}


0 0