双向链表-C语言版

来源:互联网 发布:2016年网络热议话题 编辑:程序博客网 时间:2024/05/16 09:01
[cpp] view plaincopyprint?
  1. 源文件部分:  
  2. #include<stdio.h>  
  3. #include<malloc.h>  
  4. #include<string.h>  
  5. typedef int Elemtype;  
  6. #include"DList.h"  
  7. int main()  
  8. {  
  9.     Dlnode head=NULL;  
  10.     instruction(head);  
  11.     return 0;  
  12. }  
  13. 头文件部分:  
  14. typedef struct DLnode  
  15. {  
  16.     Elemtype data;  
  17.     struct DLnode *prior;    ///节点的声明定义  
  18.     struct DLnode *next;  
  19. }DLnode,*Dlnode;  
  20.   
  21. void Init_Dlist(Dlnode &arrow)    ///双向初始化  
  22. {  
  23.     arrow=(Dlnode)malloc(sizeof(DLnode));  
  24.     if(!arrow)  
  25.     {  
  26.         printf("对不起,已无更多的内存单元,初始化失败!\n");  
  27.         return ;  
  28.     }  
  29.     arrow->prior=NULL;  
  30.     arrow->next=NULL;  
  31. }  
  32.   
  33. int Empty_Dlist(DLnode head)       ///双向判空  
  34. {  
  35.     if(head.next==NULL)  
  36.         return 1;  
  37.     return 0;  
  38. }  
  39.   
  40. void Insert_Dlist(DLnode *head,Elemtype e)  ///尾插法-双向(新增)  
  41. {  
  42.     Dlnode p=NULL,q=head;  
  43.     p=(DLnode *)malloc(sizeof(DLnode));  
  44.     if(!p)  
  45.     {  
  46.         printf("对不起,已无更多的内存单元,申请内存失败!\n");  
  47.         return ;  
  48.     }  
  49.     while(q->next)  
  50.     {  
  51.         q=q->next;  
  52.     }  
  53.     p->data=e;  
  54.     p->next=NULL;  
  55.     p->prior=q;  
  56.     q->next=p;  
  57. }  
  58.   
  59. int Length_Dlist(DLnode head)         ///双向的链长  
  60. {  
  61.     DLnode *p=NULL;  
  62.     int len=0;  
  63.     p=head.next;  
  64.     if(Empty_Dlist(head))  
  65.         return 0;  
  66.     while(p)  
  67.     {  
  68.         len++;  
  69.         p=p->next;  
  70.     }  
  71.     return len;  
  72. }  
  73.   
  74. void Delete_Dlist(DLnode *head,Elemtype where)        ///双向按位置删除  
  75. {  
  76.     DLnode *p=NULL;  
  77.     int i=1;  
  78.     p=head->next;  
  79.     if(Empty_Dlist(*head))  
  80.     {  
  81.         printf("对不起,链表是空的,无法完成删除操作!!!\n");  
  82.         return ;  
  83.     }  
  84.     if(where>Length_Dlist(*head)||where<0)  
  85.     {  
  86.         printf("对不起,你删除的位置是不合法的,请重新输入!!!\n");  
  87.         return ;  
  88.     }  
  89.     while(i<where)  
  90.     {  
  91.         p=p->next;  
  92.         i++;  
  93.     }                                 //保证双向链表的完整性   
  94.     p->prior->next=p->next;  
  95.     if(where!=Length_Dlist(*head)+1)  
  96.         p->next->prior=p->prior;  
  97.     printf("删除成功!!!\n");  
  98.     return ;  
  99. }  
  100.   
  101. void Insearch_Dlist(DLnode head,Elemtype e)      ///双向按元素查找  
  102. {  
  103.     DLnode *p=NULL;  
  104.     int len=1;  
  105.     if(Empty_Dlist(head))  
  106.     {  
  107.         printf("对不起,链表是空的,无法完成查找操作!!!\n");  
  108.         return ;  
  109.     }  
  110.     p=head.next;  
  111.     while(p)  
  112.     {  
  113.         if(p->data==e)  
  114.         {  
  115.             printf("你要查找的元素位于链表的第%d位置上.\n",len);  
  116.             return ;  
  117.         }  
  118.         len++;  
  119.         p=p->next;  
  120.     }  
  121.     printf("对不起,你要查找的元素不存在,请重新输入!!!\n");  
  122.     return ;  
  123. }  
  124.   
  125. void Modify_Dlist(DLnode *head,Elemtype where,Elemtype e)      //双向按位置修改    
  126. {  
  127.     DLnode *p=NULL;  
  128.     int len=1;  
  129.     if(Empty_Dlist(*head))  
  130.     {  
  131.         printf("对不起,链表是空的,无法完成修改操作!!!\n");  
  132.         return ;  
  133.     }  
  134.     p=head->next;  
  135.     if(where>Length_Dlist(*head)||where<0)          
  136.     {  
  137.         printf("对不起,你修改的位置是不合法的,请重新输入!!!\n");  
  138.         return ;  
  139.     }  
  140.     while(len<where)  
  141.     {  
  142.         p=p->next;  
  143.         len++;  
  144.     }  
  145.     p->data=e;  
  146.     printf("修改成功!\n");  
  147.     return ;  
  148. }  
  149.   
  150. void Print_Dlist(Dlnode head)          //双向的打印   
  151. {  
  152.     Dlnode p=head->next;  
  153.     if(p==NULL)  
  154.     {  
  155.         printf("对不起,当前链表已空,无法完成打印操作!!!\n");  
  156.         return ;  
  157.     }  
  158.     while(p)  
  159.     {  
  160.         printf("%d ",p->data);  
  161.         p=p->next;  
  162.     }  
  163.     printf("\n");  
  164.     return ;  
  165. }  
  166.   
  167. void Destory_Dlist(Dlnode head)            //双向的销毁-不包括头节点    
  168. {  
  169.     Dlnode p=head,q=NULL;  
  170.     while(p->next)  
  171.     {  
  172.         p=p->next;  
  173.     }  
  174.     while(p!=head)  
  175.     {  
  176.         p->prior->next=NULL;  
  177.         q=p;  
  178.         p=p->prior;    
  179.         free(q);  
  180.     }  
  181.     printf("销毁成功!!!\n");  
  182. }  
  183.   
  184. void instruction(Dlnode head)  
  185. {  
  186.     int n,m,t,a,b,len1,index;  
  187.     printf("\t\t1、初始操作\n");  
  188.     printf("\t\t2、新增操作\n");              //为什么不能在这里定义head指针---因为每次调用功能函数后,head指针又被重新初始化了      
  189.     printf("\t\t3、删除操作\n");  
  190.     printf("\t\t4、查找操作\n");  
  191.     printf("\t\t5、修改操作\n");  
  192.     printf("\t\t6、销毁操作\n");  
  193.     printf("\t\t7、求长操作\n");  
  194.     printf("\t\t8、打印操作\n");  
  195.     printf("\t\t9、退出程序\n");  
  196.     printf("请输入你所需要完成的指令:\n");  
  197.     do{  
  198.         scanf("%d",&n);  
  199.         if(n<1||n>9)  
  200.             printf("对不起,你输入的指令编号是无效的,请重新输入!!!\n");  
  201.     }while(n<1||n>9);  
  202.     switch(n)  
  203.     {  
  204.         case 1:  
  205.             Init_Dlist(head);            //初始化操作  
  206.             printf("已完成双向链表初始化,请输入你要添加的元素个数!\n");  
  207.             scanf("%d",&n);  
  208.             while(n--)  
  209.             {  
  210.                 int x;  
  211.                 scanf("%d",&x);  
  212.                 Insert_Dlist(head,x);  
  213.             }  
  214.             printf("完成建表操作!\n");  
  215.             break;  
  216.         case 2:                                  //新增操作  
  217.             if(!head)  
  218.             {  
  219.                 printf("对不起,请先完成初始化操作再做该选择!!!\n");  
  220.                 break;  
  221.             }  
  222.             printf("请输入你要添加的元素个数!\n");  
  223.             scanf("%d",&n);  
  224.             while(n--)  
  225.             {  
  226.                 int x;  
  227.                 scanf("%d",&x);  
  228.                 Insert_Dlist(head,x);  
  229.             }  
  230.             printf("增添成功!\n");  
  231.             break;  
  232.         case 3:  
  233.             printf("请输入你所要删除的节点的位置:\n");  
  234.             scanf("%d",&n);  
  235.             Delete_Dlist(head,n);                             //删除操作  
  236.             break;  
  237.         case 4:  
  238.             printf("请输入你所要查找的元素:\n");  
  239.             scanf("%d",&m);  
  240.             Insearch_Dlist(*head,m);                       //查找操作   
  241.             break;  
  242.         case 5:  
  243.             printf("请输入你更改的元素队列位置:\n");          //修改操作   
  244.             do{  
  245.                 scanf("%d",&a);  
  246.                 if(a<1||a>Length_Dlist(*head))  
  247.                     printf("对不起,你所输入的元素位置不在区域内,请重新输入!!!\n");  
  248.             }while(a<1||a>Length_Dlist(*head));  
  249.             printf("请输入修改后的值:\n");  
  250.             scanf("%d",&b);  
  251.             Modify_Dlist(head,a,b);  
  252.             break;  
  253.         case 6:  
  254.             Destory_Dlist(head);            //销毁操作   
  255.             break;  
  256.         case 7:  
  257.             len1=Length_Dlist(*head);             //返回链长操作   
  258.             printf("当前链队列的长度为:%d\n",len1);  
  259.             break;  
  260.         case 8:  
  261.             Print_Dlist(head);        //打印操作   
  262.             break;  
  263.         case 9:                   //退出操作   
  264.             return;  
  265.         default:  
  266.             instruction(head);  
  267.             break;  
  268.     }  
  269.     instruction(head);  
  270. }
0 0