数据结构(严蔚敏)之二——链表的c语言实现

来源:互联网 发布:2016年7月出口数据 编辑:程序博客网 时间:2024/05/17 06:35

介绍:

1、构造一个长为n的线性表,插入元素为逆序插入

2、构造一个长为n的线性表,插入元素为顺序插入

3、销毁链表L

4、查找L的第i个元素,并用e返回

5、查找L中第一个与e满足compare关系的元素,若存在返回其对应位置,否则返回error

6、若cur_e是L中的元素,且不是第一个,则返回其前驱元素

7、若cur_e是L中的元素,且不是最后一个,返回其对应后继元素

8、在L的第i个位置插入元素e

9、删除L的第i个元素


链表结构的实现:

#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <assert.h>typedef int Elemtype;typedef int Status;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -1typedef struct Node{Elemtype data;struct Node * next;}LinkNode,*LinkList;/*构造一个空的线性表*/Status InitList(LinkList &L){L=(LinkList)malloc(sizeof(LinkNode));if(!L){printf("L failed");return ERROR;}L->next=NULL;return OK;}/*构造一个长为n的线性表,插入元素为逆序插入*/Status ListCreate_Invert(LinkList &L,const int n){int i;InitList(L);LinkList p;for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(LinkNode));if(!p){printf("p failed ");return ERROR;}scanf("%d", &p->data);p->next=L->next;L->next=p;}return OK;}/*构造一个长为n的线性表,插入元素为顺序插入*/Status ListCreate_Sequence(LinkList &L,const int n){int i;InitList(L);LinkList p,q=L;for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(LinkNode));if(!p){printf("p failed ");return ERROR;}scanf("%d", &p->data);q->next=p;q=p;}q->next=NULL;return OK;}/*销毁线性表L*/Status DestroyList(LinkList &L){LinkList p=L->next,q;free(L);while(p){q=p->next;free(p);p=q;}return OK;}/*将L重置为空表*/Status ClearList(LinkList &L){LinkList p=L->next,q;while(p){q=p->next;free(p);p=q;}L->next=NULL;return OK;}/*判断L是否为空,空返回True,否则返回False*/Status EmptyList(const LinkList L){if(L->next==NULL)return TRUE;elsereturn FALSE;}/*返回L的长度*/Status ListLength(const LinkList L){LinkList p=L;int length=0;while(p->next){++length;p=p->next;}return length;}/*查找L的第i个元素,并用e返回*/Status GetElem(const LinkList L,int i,Elemtype &e){assert(i>0);int j=0;LinkList p=L;while (j<i&&p){++j;p=p->next;}if(p==NULL||j>i){printf("there aren't %d elements is the linklist\n", i);return FALSE;}e=p->data;return OK;}/*查找L中第一个与e满足compare关系的元素,若存在返回其对应位置,否则返回error*/Status LocateElem(const LinkList L,Elemtype e,Status (*compare)(Elemtype,Elemtype)){LinkList p=L->next;int pos=1;while(p){if(compare(e,p->data)==1)return pos;else{pos++;p=p->next;}}if(p==NULL){printf("no element has the compare relation with %d \n", e);return FALSE;}}//若cur_e是L中的元素,且不是第一个,则返回其前驱元素Status PriorElem(const LinkList L,Elemtype cur_e,Elemtype &pre_e){int pos=1;LinkList p=L;while (p->next&&p->next->data!=cur_e){p=p->next;pos++;}if(pos!=1)//不是第一个结点{pre_e=p->data;return OK;}else{printf("%d is  the first element of linklist\n", cur_e);return ERROR;}}//若cur_e是L中的元素,且不是最后一个,返回其对应后继元素Status NextElem(const LinkList L,Elemtype cur_e,Elemtype &next_e){int pos=1;LinkList p=L->next;while(p&&p->data!=cur_e){p=p->next;pos++;}if(p->next!=NULL){next_e=p->next->data;return OK;}else{printf("%d is the last element of linklist\n", cur_e);return ERROR;}}//在L的第i个位置插入元素eStatus InsertList(LinkList &L,int i,Elemtype e){assert(i>0);LinkList p=L->next;int j=1;while(p&&j<i-1){p=p->next;++j;}LinkList s=(LinkList)malloc(sizeof(LinkNode));s->data=e;s->next=p->next;p->next=s;return OK;}/*删除L的第i个元素*/Status DeleteList(LinkList &L,int i,Elemtype &e){assert(i>0);LinkList p=L->next;int j=1;while(p->next&&j<i-1){p=p->next;j++;}LinkList q=p->next;p->next=q->next;e=q->data;free(q);return OK;}/*对L中的每一个元素调用visit函数*/Status TraverseList(const LinkList L,void(*visit)(Elemtype)){LinkList p;p=L->next;while(p){visit(p->data);p=p->next;}return OK;}void visit(Elemtype e){printf("%-5d", e);}

测试代码:

//测试代码 int main(){LinkList L;int n;LinkNode *p,*emin,*emax;printf("请输入要要输入的元素个数:");scanf("%d", &n);ListCreate_Sequence(L, n);printf("原序链表值:\n");p = L->next;while(p){printf("%d ", p->data);p = p->next;}printf("\n");p = L;int ce, pe;printf("请输入要查找前驱和后继的元素:");scanf("%d", &ce);PriorElem(L, ce, pe);printf("%d的前驱是%d\n", ce, pe);NextElem(L, ce, pe);printf("%d的后继是%d\n", ce, pe); printf("请输入要插入的元素和插入位置:");scanf("%d%d", &ce,&pe);InsertList(L, pe,ce);printf("插入元素%d后的线性表为\n", ce);TraverseList(L, visit);puts("");printf("请输入要删除元素位置:");scanf("%d", &ce);DeleteList(L, ce, pe);printf("删除%d位置的元素后的线性表为\n", ce);TraverseList(L, visit);puts("");DestroyList(L);return 0;}

运行结果:


0 0