<html>
源文件部分: #include<stdio.h> #include<string.h> #include<malloc.h> typedef int Elemtype; #include"Delist.h" int main() { Dlnode head=NULL; instruction(head); return 0; } 头文件部分: typedef struct DLnode { Elemtype data; struct DLnode *prior; //节点的声明定义 struct DLnode *next; }DLnode,*Dlnode; void Init_Dlist(Dlnode &head) //循环双向初始化 { head=(Dlnode)malloc(sizeof(DLnode)); head->prior=head; head->next=head; } int Empty_Dlist(Dlnode head) //双向判空 { if(head->prior==head&&head->next==head) return 1; return 0; } void Insert_Dlist(DLnode *head,Elemtype e) //头插法-双向(新增) { Dlnode p=NULL; p=(DLnode *)malloc(sizeof(DLnode)); //由于是双向循环链表,所以不存在双向的那个问题 if(!p) { printf("对不起,已无很多其它的内存单元得到分配!!!\n"); return ; } p->data=e; p->next=head->next; p->next->prior=p; p->prior=head; // printf("*%d*\n",head->next); head->next=p; } int Length_Dlist(Dlnode head) { DLnode *p=NULL; int len=0; if(Empty_Dlist(head)) return 0; p=head->next; while(p!=head) { len++; p=p->next; } return len; } int Delete_Dlist(DLnode *head,Elemtype where) //按位置删除 { DLnode *p=NULL; int i=1; p=head->next; if(Empty_Dlist(head)) { printf("对不起,链表是空的,无法完毕删除操作!!!\n"); return 0; } if(where>Length_Dlist(head)||where<0) { printf("对不起,你删除的位置是不合法的,请又一次输入!!!\n"); return 0; } while(i<where) { p=p->next; i++; } p->prior->next=p->prior->next->next; p->prior->next->prior=p->prior; printf("删除成功!!!\n"); return p->data; } void Insearch_Dlist(Dlnode head,Elemtype e) //按元素查找 { DLnode *p=NULL; int len=1; if(Empty_Dlist(head)) { printf("对不起,链表是空的,无法完毕查找操作!!!\n"); return ; } p=head->next; while(p!=head) { if(p->data==e) { printf("你要查找的元素位于链表的第%d个位置上.\n",len); return ; } p=p->next; len++; } printf("对不起,你要查找的元素不存在,请又一次输入!!!\n"); return ; } void Modify_Dlist(DLnode *head,Elemtype where,Elemtype e) //按位置改动 { DLnode *p=NULL; int len=1; p=head->next; while(len<where) { p=p->next; len++; } p->data=e; printf("改动成功!\n"); return ; } void Print_Dlist(Dlnode head) //打印操作 { Dlnode p=head->next; if(Empty_Dlist(head)) { printf("对不起,链表是空的,无法完毕打印操作!!!\n"); return ; } while(head!=p) { printf("%d ",p->data); p=p->next; } printf("\n"); return ; } void Destory_Dlist(Dlnode head) //销毁清空操作 { Dlnode p=head->next; while(p!=head) { p->prior->next=p->next; p->next->prior=p->prior; p=head->next; } printf("销毁成功!\n"); } void instruction(Dlnode head) //功能函数 { int n,m,t,a,b,len1,index; printf("\t\t1、初始操作\n"); printf("\t\t2、新增操作\n"); //为什么不能在这里定义head指针---由于每次调用功能函数后,head指针又被又一次初始化了 printf("\t\t3、删除操作\n"); printf("\t\t4、查找操作\n"); printf("\t\t5、改动操作\n"); printf("\t\t6、销毁操作\n"); printf("\t\t7、求长操作\n"); printf("\t\t8、打印操作\n"); printf("\t\t9、退出程序\n"); printf("请输入你所须要完毕的指令:\n"); do{ scanf("%d",&n); if(n<1||n>9) printf("对不起。你输入的指令编号是无效的。请又一次输入!!!\n"); }while(n<1||n>9); switch(n) { case 1: Init_Dlist(head); //初始化操作 printf("已完毕双向链表初始化,请输入你要加入的元素个数!\n"); scanf("%d",&n); while(n--) { int x; scanf("%d",&x); Insert_Dlist(head,x); } printf("完毕建表操作!\n"); break; case 2: //新增操作 if(!head) { printf("对不起,请先完毕初始化操作再做该选择!!!\n"); break; } printf("请输入你要加入的元素个数!\n"); scanf("%d",&n); while(n--) { int x; scanf("%d",&x); Insert_Dlist(head,x); } printf("增添成功!\n"); break; case 3: printf("请输入你所要删除的节点的位置:\n"); scanf("%d",&n); Delete_Dlist(head,n); //删除操作 break; case 4: printf("请输入你所要查找的元素:\n"); scanf("%d",&m); Insearch_Dlist(head,m); //查找操作 break; case 5: if(Empty_Dlist(head)) { printf("对不起,链表是空的,无法完毕改动操作!!!\n"); break ; } printf("请输入你要更改的元素队列位置:\n"); //改动操作 do{ scanf("%d",&a); if(a<1||a>Length_Dlist(head)) printf("对不起。你所输入的元素位置不在区域内,请又一次输入!!!\n"); }while(a<1||a>Length_Dlist(head)); printf("请输入改动后的值:\n"); scanf("%d",&b); Modify_Dlist(head,a,b); break; case 6: Destory_Dlist(head); //销毁操作 break; case 7: len1=Length_Dlist(head); //返回链长操作 printf("当前链队列的长度为:%d\n",len1); break; case 8: Print_Dlist(head); //打印操作 break; case 9: //退出操作 return; default: instruction(head); break; } instruction(head); }
版权声明:本文为博主原创文章,未经博主同意不得转载。
举报
- 本文已收录于下面专栏:
相关文章推荐
-
数据结构与算法之六 双向链表和循环链表
在本章中,你将学习: 运行双链接列表 运行循环链接列表 应用链接列表以解决编程问题 如今。考虑一个演示样例,您须要以降序的方式显示这些数字。 怎样解决此问题? 每个节点链接到序列中的...- zhangchen124
- 2016-06-11 18:36
- 1943
-
循环双向链表的创建方法 最简单的循环双向链表
首先讲循环链表,简单来说就是让链表首尾相连。形成一个环,由于一般的链表都是单向的,随意给出的一个节点是不能訪问前面的链节,这就导致了单向链表的局限性,循环链表从一定程度上来说就攻克了这一问题,通过表头...- lin19931006
- 2013-06-06 23:44
- 1537
-
C#将托管DLL嵌入exe文件
C#将托管DLL嵌入exe文件近期用winForm开发一个小程序,当中用到了HtmlAgilityPack(用于解析html)和Newtonsoft.Json(用于解析json)这两个库,因为编译后生...- call_me_lzm
- 2016-05-25 20:59
- 1071
-
Net程序怎样防止被注入(整站通用)
- MadeInJack
- 2008-03-22 10:13
- 199
-
怎样使用(注冊)DirectShow接口
DirectShow是一组经常使用的COM接口组件,当中经常使用的组件有IGraphBuilder。IMediaControl,IMediaEvent接口。这三个接口在本文先不介绍。本文主要是讲讲怎样使用Di...- Chinajiyong
- 2012-06-15 12:46
- 3362
-
双向链表-C语言版
[cpp] view plaincopyprint? 源文件部分: #include #include #include typedef int ...- u012377333
- 2014-11-13 20:01
- 555
-
编程新手导论(转载)
第二部分 导论。这一部分主要是关于编程的导论, (要懂得一点思想具备一点常识)《设计。编码。,与软工》(编程与思想)这一章解释了三种思想,原语,抽象,组合,。和软件开发的二个重要过程,,软件project的相关概念,是编程入门的关键 (要懂得一点领域内的数学)《数学与算法》(编程与数学)计算机整个就是架构在数学上的。跟计算机平台实现。算法设计,,架构密切相关,。真正要深入编程,。。对数学的学习是必须的,。千万不要相- weiyinchao88
- 2012-01-22 10:26
- 1803
-
双向循环链表程序(C语言版)
双向循环链表程序(C语言版) 2006-08-27 01:49:50| 分类: 软件编程|字号 订阅 http://blog.163.com/huzuhu...- quannii
- 2013-03-19 01:13
- 457
-
Generic double circular linked list - 通用双向循环链表C语言实现
Generic double circular linked list - 通用双向循环链表C语言实现 cheungmine 双向循环链表是计算机数据结构里面最基础- cloudtech
- 2010-09-18 20:12
- 332
-
单链表的操作C语言版
2009年3月24日 13:04 Slyar <span style="color: #297- BlogDown
- 2009-09-06 18:51
- 75
收藏助手
不良信息举报
1条评论