源文件部分: #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); }
原文:http://blog.csdn.net/huangqiang1363/article/details/41077385