




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/*数据结构C语言版 双向链表表示和实现P36-P37 编译环境:Dev-C+ 4.9.9.2日期: 2011年2月10日 */#include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef int ElemType;/ 线性表的双向链表存储结构 typedef struct DuLNodeElemType data;/数据域struct DuLNode *prior,*next;/前驱后继指针DuLNode,*DuLinkList;/ 产生空的双向循环链表Lint InitList(DuLin
2、kList *L) *L=(DuLinkList)malloc(sizeof(DuLNode);/ *L指向头结点if(*L)/ 将头结点的前驱后继都指向头结点,这样构成了一个空表(*L)->next=(*L)->prior=*L;return 1;elsereturn 0;/ 销毁双向循环链表Lint DestroyList(DuLinkList *L)DuLinkList q,p=(*L)->next; / p指向第一个结点 while(p!=*L) / p没到表头 q=p->next;free(p);p=q;free(*L);*L=NULL;return 1;/
3、将L重置为空表int ClearList(DuLinkList L)DuLinkList q,p=L->next; / p指向第一个结点 while(p!=L) / p没到表头 q=p->next;free(p);p=q;L->next=L->prior=L; / 头结点的两个指针域均指向自身,构成空表 return 1;/ 若L为空表(空表就是头结点的前驱后继都指向头结点),则返回1,否则返回0 int ListEmpty(DuLinkList L)if(L->next=L&&L->prior=L)return 1;elsereturn 0
4、;/ 返回L中数据元素个数int ListLength(DuLinkList L)int i=0;DuLinkList p=L->next; / p指向第一个结点 while(p!=L) / p没到表头 i+;p=p->next;return i;/ 当第i个元素存在时,其值赋给e并返回1,否则返回0int GetElem(DuLinkList L,int i,ElemType *e)int j=1; / j为计数器 DuLinkList p=L->next; / p指向第一个结点 while(p!=L&&j<i) / 顺指针向后查找,直到p指向第i个元
5、素或p指向头结点 p=p->next;j+;if(p=L|j>i) / 第i个元素不存在 return 0;*e=p->data; / 取第i个元素 return 1;/ 返回L中第1个与e满足关系compare()的数据元素的位序。 / 若这样的数据元素不存在,则返回值为0 int LocateElem(DuLinkList L,ElemType e,int(*compare)(ElemType,ElemType)int i=0;DuLinkList p=L->next; / p指向第1个元素 while(p!=L)i+;if(compare(p->data,e
6、) / 找到这样的数据元素 return i;p=p->next;return 0;/ 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱int PriorElem(DuLinkList L,ElemType cur_e,ElemType *pre_e)DuLinkList p=L->next->next; / p指向第2个元素 while(p!=L) / p没到表头 if(p->data=cur_e)*pre_e=p->prior->data;return 1;p=p->next;return 0;/ 若cur_e是L的数据元素,且
7、不是最后一个,则用next_e返回它的后继int NextElem(DuLinkList L,ElemType cur_e,ElemType *next_e)DuLinkList p=L->next->next; / p指向第2个元素 while(p!=L) / p没到表头 if(p->prior->data=cur_e)*next_e=p->data;return 1;p=p->next;return 0;/ 在双向链表L中返回第i个元素的位置指针(算法2.18、2.19要调用的函数) DuLinkList GetElemP(DuLinkList L,in
8、t i)int j;DuLinkList p=L;for(j=1;j<=i;j+)p=p->next;return p;/ 改进算法2.18 P36/ 在带头结点的双链循环线性表L中第i个位置之前插入元素e,/ i的合法值为1i表长+1 int ListInsert(DuLinkList L,int i,ElemType e)DuLinkList p,s;if(i<1|i>ListLength(L)+1) / i值不合法 return 0;p=GetElemP(L,i-1); / 在L中确定第i-1个元素的位置指针p if(!p) / p=NULL,即第i-1个元素不存
9、在 return 0;s=(DuLinkList)malloc(sizeof(DuLNode);if(!s)return 0;s->data=e; / 在第i-1个元素之后插入 s->prior=p;s->next=p->next;p->next->prior=s;p->next=s;return 1;/ 算法2.19 P37 / 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1i表长+1 int ListDelete(DuLinkList L,int i,ElemType *e) DuLinkList p;if(i<1|i>Li
10、stLength(L) / i值不合法 return 0;p=GetElemP(L,i); / 在L中确定第i个元素的位置指针p if(!p) / p=NULL,即第i个元素不存在 return 0;*e=p->data;p->prior->next=p->next;p->next->prior=p->prior;free(p);return 1;/ 由双链循环线性表L的头结点出发,正序对每个数据元素调用函数visit() void ListTraverse(DuLinkList L,void(*visit)(ElemType)DuLinkList p
11、=L->next; / p指向头结点 while(p!=L)visit(p->data);p=p->next;printf("n");/ 由双链循环线性表L的头结点出发,逆序对每个数据元素调用函数visit()void ListTraverseBack(DuLinkList L,void(*visit)(ElemType)DuLinkList p=L->prior; / p指向尾结点 while(p!=L)visit(p->data);p=p->prior;printf("n");/ 数据元素判定函数(判定相等)int
12、 compare(ElemType c1,ElemType c2) if(c1=c2)return 1;elsereturn 0;void vd(ElemType c) / ListTraverse()调用的函数(类型一致) printf("%d ",c);int main()DuLinkList L;int i,n;int j;ElemType e;InitList(&L);for(i=1;i<=5;i+)ListInsert(L,i,i); / 在第i个结点之前插入i printf("正序输出链表:");ListTraverse(L,v
13、d); / 正序输出 printf("逆序输出链表:");ListTraverseBack(L,vd); / 逆序输出 n=2;ListDelete(L,n,&e); / 删除并释放第n个结点 printf("删除第%d个结点,值为%d,其余结点为:",n,e);ListTraverse(L,vd); / 正序输出 printf("链表的元素个数为%dn",ListLength(L);printf("链表是否空:%d(1:是 0:否)n",ListEmpty(L);ClearList(L); / 清空链表
14、printf("清空后,链表是否空:%d(1:是 0:否)n",ListEmpty(L);for(i=1;i<=5;i+)ListInsert(L,i,i); / 重新插入5个结点 ListTraverse(L,vd); / 正序输出 n=3;j=GetElem(L,n,&e); / 将链表的第n个元素赋值给e if(j)printf("链表的第%d个元素值为%dn",n,e);elseprintf("不存在第%d个元素n",n);n=4;i=LocateElem(L,n,compare);if(i)printf("等于%d的元素是第%d个n",n,i);elseprintf("没有等于%d的元素n",n);j=PriorElem(L,n,&e);if(j)printf("%d的前驱是%dn",n,e);elseprintf("不存在%d的前驱n",n);j=NextElem(L,n,&e);if(j)printf("%d的后继是%dn",n,e);elseprintf("不存在%d的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京室内绿化施工方案
- 幼儿园开学安全预案
- 天津水上滑梯施工方案
- 2025年乳品加工机械项目建议书
- 课题开题报告:湖北职业教育数字化转型的制度设计与政策研究
- 课题开题报告:湖北教育服务“一带一路”发展战略研究
- 乙型肝炎知识培训课件
- 课题开题报告:国际学生勤工助学现状、问题与对策研究
- 课题开题报告:构建与教育治理现代化相匹配的教育法律制度体系研究
- 鲁科版高中化学选择性必修2第2章第3节离子键、配位键与金属键基础课课件
- GB/T 44264-2024光伏组件清洁机器人通用技术条件
- 2024工程用钢丝环形网
- 济南网约车驾驶员区域考试题库(含答案)
- 2024年四川省德阳市中考英语试卷真题(含答案解析)
- 2024年九年级中考语文课外文言文阅读题汇集(一)附答案解析
- 医疗器械的验收与管理制度
- 部编人教版七年级下册道德与法治全册课件
- 护理文件书写PDCA课件
- GB/T 9799-2024金属及其他无机覆盖层钢铁上经过处理的锌电镀层
- 2024年陕西省中考英语试卷附答案
- 江西省南昌市西湖区2023-2024学年五年级下学期期末数学试题
评论
0/150
提交评论