循环链表的基本操作
2016-06-15 17:04
447 查看
/* 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); else printf("不存在值为6的元素!\n"); ListDelete(&L,2,&e); if(i) { printf("删除的数据元素为%d,现在表中的数据为:\n",e); ListTraverse(L); } else printf("删除元素失败!\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"); else printf("循环链表不空!\n"); } bool ListInsert(LinkList *L,int i,int e) { //在第i个元素之前插入元素e LinkList 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; else return 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; }
程序执行结果:
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法