【数据结构】C语言实现顺序链表
发布时间:2020-12-15 06:03:13 所属栏目:安全 来源:网络整理
导读:这是在上数据结构课程时候的练习,以后拿过来随时用。 #include stdio.h#include malloc.h#include string.h#include math.h#include stdlib.htypedef int elemtype;#define TRUE 0#define FALSE 1#define OK 1#define ERROR 0#define INFEASIBLE -1#if(1)ty
这是在上数据结构课程时候的练习,以后拿过来随时用。
#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; }; #endif void 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的话就销毁了链表相当于DestroyList while(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 *next_e) { LinkList p; //remember it p = 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,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,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("nn"); } #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个元素的值为%dn",e); for(j=0; j<=1; j++) { k = LocateElem(L,&j); if(k) { printf("第%d个元素的值为%dn",k,j); } else { printf("没有值为%d的元素n",j); } } for(j=1;j<=2;j++) // 测试头两个数据 { GetElem(L,&e0); // 把第j个数据赋给e0 i = PriorElem(L,e0,&e); // 求e0的前驱 if(i == INFEASIBLE) printf("元素%d无前驱n",e0); else printf("元素%d的前驱为%dn",e); } for(j=ListLength(L)-1; j<=ListLength(L); j++) // 最后两个数据 { GetElem(L,&e0); // 把第j个数据赋给e0 i=NextElem(L,&e); // 求e0的后继 if(i == INFEASIBLE) { printf("元素%d无后继n",e0); } else { printf("元素%d的后继为%dn",e); } } k = ListLength(L); // k为表长 for(j=k+1; j>=k; j--) { i = ListDelete(L,&e); // 删除第j个数据 if(i == ERROR) { printf("删除第%d个元素失败n",j); } else { printf("删除第%d个元素成功,其值为%dn",e); } } printf("依次输出L的元素:"); ListTraverse(L); DestroyList(L); printf("销毁L后:L=%un",L); } #endif void main() { LinkList L = NULL; int i,j; InitList(L); for(j=1; j<=5; j++) { i = ListInsert(L,j); } printf("在L的表头依次插入1~5后:L="); ListTraverse(L); // 依次对元素调用print(),输出元素的值 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容