




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构C语言版 双向链表表示和实现.txt同志们:别炒股,风险太大了,还是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐脑,做薄了是豆腐皮,做没了是豆浆,放臭了是臭豆腐!稳赚不亏呀!/*数据结构C语言版 双向链表表示和实现P36-P37 编译环境:Dev-C+ 4.9.9.2日期: 2011年2月10日 */#include #include #include typedef int ElemType;/ 线性表的双向链表存储结构 typedef struct DuLNodeElemType data;/数据域struct DuLNode *prior,*next;/前驱后继指针DuLNode,*DuLinkList;/ 产生空的双向循环链表Lint InitList(DuLinkList *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;/ 将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;/ 返回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&jnext;j+;if(p=L|ji) / 第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) / 找到这样的数据元素 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的数据元素,且不是最后一个,则用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,int i)int j;DuLinkList p=L;for(j=1;jnext;return p;/ 改进算法2.18 P36/ 在带头结点的双链循环线性表L中第i个位置之前插入元素e,/ i的合法值为1i表长+1 int ListInsert(DuLinkList L,int i,ElemType e)DuLinkList p,s;if(iListLength(L)+1) / i值不合法 return 0;p=GetElemP(L,i-1); / 在L中确定第i-1个元素的位置指针p if(!p) / p=NULL,即第i-1个元素不存在 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(iListLength(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=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 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,vd); / 正序输出 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); / 清空链表 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的后继n,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美容外科技术试题及答案
- 辅警接处警培训课件
- 辅警医护岗知识培训内容课件
- 建设银行2025鹤壁市秋招群面案例总结模板
- 建设银行2025厦门市秋招笔试性格测试题专练及答案
- 农业银行2025曲靖市笔试英文行测高频题含答案
- 农业银行2025晋中市秋招半结构化面试题库及参考答案
- 2025行业技术革新趋势预测
- 农业银行2025周口市秋招半结构化面试题库及参考答案
- 农业银行2025朝阳市笔试英文行测高频题含答案
- 占道施工申请书怎么写范文
- 医院耗材SPD解决方案(技术方案)
- 室内工装施工方案
- 护理投诉案例分析医学课件
- 四川省家庭经济困难学生认定申请表(样表)
- Android移动应用开发高职PPT完整全套教学课件
- 中国哲学史教案
- 云计算技术及应用PPT完整全套教学课件
- 辽宁省房屋面积测量与计算细则修订稿
- 历年高考满分作文集
- GB/T 6365-2006表面活性剂游离碱度或游离酸度的测定滴定法
评论
0/150
提交评论