赞
踩
- 源文件部分:
- #include<stdio.h>
- #include<malloc.h>
- #include<string.h>
- typedef int Elemtype;
- #include"DList.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 &arrow) ///双向初始化
- {
- arrow=(Dlnode)malloc(sizeof(DLnode));
- if(!arrow)
- {
- printf("对不起,已无更多的内存单元,初始化失败!\n");
- return ;
- }
- arrow->prior=NULL;
- arrow->next=NULL;
- }
-
- int Empty_Dlist(DLnode head) ///双向判空
- {
- if(head.next==NULL)
- return 1;
- return 0;
- }
-
- void Insert_Dlist(DLnode *head,Elemtype e) ///尾插法-双向(新增)
- {
- Dlnode p=NULL,q=head;
- p=(DLnode *)malloc(sizeof(DLnode));
- if(!p)
- {
- printf("对不起,已无更多的内存单元,申请内存失败!\n");
- return ;
- }
- while(q->next)
- {
- q=q->next;
- }
- p->data=e;
- p->next=NULL;
- p->prior=q;
- q->next=p;
- }
-
- int Length_Dlist(DLnode head) ///双向的链长
- {
- DLnode *p=NULL;
- int len=0;
- p=head.next;
- if(Empty_Dlist(head))
- return 0;
- while(p)
- {
- len++;
- p=p->next;
- }
- return len;
- }
-
- void Delete_Dlist(DLnode *head,Elemtype where) ///双向按位置删除
- {
- DLnode *p=NULL;
- int i=1;
- p=head->next;
- if(Empty_Dlist(*head))
- {
- printf("对不起,链表是空的,无法完成删除操作!!!\n");
- return ;
- }
- if(where>Length_Dlist(*head)||where<0)
- {
- printf("对不起,你删除的位置是不合法的,请重新输入!!!\n");
- return ;
- }
- while(i<where)
- {
- p=p->next;
- i++;
- } //保证双向链表的完整性
- p->prior->next=p->next;
- if(where!=Length_Dlist(*head)+1)
- p->next->prior=p->prior;
- printf("删除成功!!!\n");
- return ;
- }
-
- 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)
- {
- if(p->data==e)
- {
- printf("你要查找的元素位于链表的第%d位置上.\n",len);
- return ;
- }
- len++;
- p=p->next;
- }
- printf("对不起,你要查找的元素不存在,请重新输入!!!\n");
- return ;
- }
-
- void Modify_Dlist(DLnode *head,Elemtype where,Elemtype e) //双向按位置修改
- {
- DLnode *p=NULL;
- int len=1;
- if(Empty_Dlist(*head))
- {
- printf("对不起,链表是空的,无法完成修改操作!!!\n");
- return ;
- }
- p=head->next;
- if(where>Length_Dlist(*head)||where<0)
- {
- printf("对不起,你修改的位置是不合法的,请重新输入!!!\n");
- return ;
- }
- while(len<where)
- {
- p=p->next;
- len++;
- }
- p->data=e;
- printf("修改成功!\n");
- return ;
- }
-
- void Print_Dlist(Dlnode head) //双向的打印
- {
- Dlnode p=head->next;
- if(p==NULL)
- {
- printf("对不起,当前链表已空,无法完成打印操作!!!\n");
- return ;
- }
- while(p)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- return ;
- }
-
- void Destory_Dlist(Dlnode head) //双向的销毁-不包括头节点
- {
- Dlnode p=head,q=NULL;
- while(p->next)
- {
- p=p->next;
- }
- while(p!=head)
- {
- p->prior->next=NULL;
- q=p;
- p=p->prior;
- free(q);
- }
- 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:
- 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);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。