循环链表的基本操作

来源:互联网 发布:linux jira6.3.6破解 编辑:程序博客网 时间:2024/04/28 12:28
/*2016年6月15日16:55:27循环链表的基本操作 插入,删除,查找,求一个元素的前驱,后继,求链表长度等 */#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct Node {int data;struct Node *next;}Node,*LinkList;bool InitList(LinkList *L); //初始化void ListEmpty(LinkList L); //判断是否为空bool ListInsert(LinkList *L,int i,int e); //插入int ListLength(LinkList L); //求表长bool GetElem(LinkList L,int i,int *e); //查找bool ListTraverse(LinkList L);//遍历输出bool PriorElem(LinkList L,int cur_e,int *pre_e); //求元素的前驱bool NextElem(LinkList L,int cur_e,int *next_e); //求元素的后继int LocateElem(LinkList L,int e, bool(*compare)(int,int) ); //求位序bool compare(int c1,int c2);bool ListDelete(LinkList *L,int i,int *e); //删除bool ClearList(LinkList *L);//清空bool DestoryList(LinkList *L);   //销毁int main(){LinkList L;int len;int e;int e0;int pos, i; //元素在表中的位置InitList(&L);  //初始化单链表ListEmpty(L);  //判断链表是否为空ListInsert(&L,1,3); //在链表第1个位置前插入3 ListInsert(&L,2,6);ListEmpty(L);len = ListLength(L);printf("len = %d\n",len);GetElem(L,1,&e);printf("第一个元素的值为 %d\n",e);GetElem(L,2,&e0);printf("第二个元素的值为 %d\n",e0);printf("依次输出表中的元素:");ListTraverse(L);PriorElem(L,6,&e); //求元素的前驱printf("元素6的前驱为 %d\n",e);NextElem(L,3,&e0);printf("元素3的后继为 %d\n",e0);pos = LocateElem(L,6,compare);if(pos)printf("L的第%d个元素为6\n",pos);elseprintf("不存在值为6的元素!\n");ListDelete(&L,2,&e);if(i){printf("删除的数据元素为%d,现在表中的数据为:\n",e);ListTraverse(L);}elseprintf("删除元素失败!\n");ClearList(&L);printf("清空后判断链表是否为空 ");ListEmpty(L);DestoryList(&L);return 0;}bool InitList(LinkList *L){*L = (LinkList)malloc(sizeof(Node));if( (*L) == NULL){printf("内存分配失败程序终止!\n");exit(-1);}(*L)->next = *L;return true;}void ListEmpty(LinkList L){if(L->next == L)printf("循环链表为空!\n");elseprintf("循环链表不空!\n");}bool ListInsert(LinkList *L,int i,int e){//在第i个元素之前插入元素eLinkList p = (*L)->next, s; //p指向头结点int j = 0;if(i <= 0 || i > ListLength(*L)+1) //i值不合法return false;while(j < i - 1)  //寻找第i-1个结点{p = p->next;j++;}s = (LinkList)malloc(sizeof(Node)); //生成新结点s->data = e;s->next = p->next;p->next = s;if(p == *L)*L = s;return true;}int ListLength(LinkList L){int i = 0;LinkList p = L->next; //p指向头结点while(p != L) //没到表尾{i++;p = p->next;}return i;}bool GetElem(LinkList L,int i,int *e){//当第i个元素存在时 赋值给e int j = 1; //j为计数器LinkList p = L->next->next; // p指向第一个结点if(i <= 0 || i > ListLength(L))return true;while(j < i){  // 顺指针向后查找 直到p指向第i个元素p = p->next;j++;}*e = p->data;return true;}bool ListTraverse(LinkList L){LinkList p = L->next->next;while(p != L->next){printf("%d ",p->data);p = p->next;}printf("\n");return true;}bool PriorElem(LinkList L,int cur_e,int *pre_e){LinkList q, p = L->next->next; //p指向第一个结点 q = p->next;while(q != L->next) {if(q->data == cur_e){*pre_e = p->data;return true;}p = q;q = q->next;}return false;}bool NextElem(LinkList L,int cur_e,int *next_e){LinkList p = L->next->next; //p指向第一个结点while(p != L) //p没有到表尾{if(p->data == cur_e){*next_e = p->next->data;return true;}p = p->next;}return true;}int LocateElem(LinkList L,int e, bool(*compare)(int,int) ){//返回位序 (第1个与e满足关系compare()的数据元素)int i = 0;LinkList p = L->next->next; // p指向第一个结点while(p != L->next){i++;if(compare(e,p->data)) //满足关系return i;p = p->next;}return 0;}bool compare(int c1,int c2){if(c1 == c2)return true;elsereturn false;}bool ListDelete(LinkList *L,int i,int *e){LinkList p = (*L)->next, q; //p指向头结点int j = 0;if(i <= 0 || i > ListLength(*L))return false;while(j < i - 1){p = p->next;j++;}q = p->next; // q指向待删除的结点p->next = q->next;*e = q->data;if(*L == q) //删除的是表尾元素*L = p;free(q);return true;}bool ClearList(LinkList *L){//将L重置为空表LinkList p, q;*L = (*L)->next; //L指向头结点p = (*L)->next; //p指向第一个结点 while(p != *L){q = p->next;free(p);p = q;}(*L)->next = *L; //头结点的指针域指向自身return true;}bool DestoryList(LinkList *L){   //销毁链表LinkList q, p = (*L)->next;while(p != *L){q = p->next;free(p);p = q;}free(*L);*L = NULL;return true;}

程序执行结果:

1 0