第四周项-建立双链表算法库

  1. /*         
  2. Copyright (c)2017,烟台大学计算机与控制工程学院         
  3. All rights reserved.         
  4. 文件名称:13.cpp          
  5. 作    者:常路        
  6. 完成日期:2017年9月28日         
  7.   
  8. 问题描述:双链表算法库算法库采用程序的多文件组织形式,包括两个文件:    
  9.          1.头文件:dlinklist.h,包含定义双链表数据结构的代码、宏定义、要实现算法的函数的声明;   
  10.            2.源文件:linklist.cpp,包含实现各种算法的函数的定义     
  11. */     

[csharp]  view plain  copy
  1. (1)头文件      
  2. #include<stdio.h>      
  3. #include<malloc.h>      
  4. typedef int ElemType;      
  5. typedef struct DNode        //定义双链表结点类型      
  6. {      
  7.     ElemType data;      
  8.     struct DNode *prior;    //指向前驱结点      
  9.     struct DNode *next;     //指向后继结点      
  10. } DLinkList;      
  11. void CreateListF(DLinkList *&L,ElemType a[],int n);//头插法建双链表      
  12. void CreateListR(DLinkList *&L,ElemType a[],int n);//尾插法建双链表      
  13. void InitList(DLinkList *&L); //初始化双链表      
  14. void DestroyList(DLinkList *&L); //销毁双链表      
  15. bool ListEmpty(DLinkList *L); //判断链表是否为空      
  16. int ListLength(DLinkList *L); //求链表的长度      
  17. void DispList(DLinkList *L); //输出链表      
  18. bool GetElem(DLinkList *L,int i,ElemType &e); //获取节点的值      
  19. int LocateElem(DLinkList *L,ElemType e); //查找一个节点      
  20. bool ListInsert(DLinkList *&L,int i,ElemType e) ;//插入一个节点      
  21. bool ListDelete(DLinkList *&L,int i,ElemType &e); //删除一个节点      
  22.     
  23. (2)各个函数的代码    
  24.     
  25. [cpp] view plain copy    
  26. #include"list.h"      
  27. void CreateListF(DLinkList *&L,ElemType a[],int n)//头插法建双链表      
  28. {      
  29.     DLinkList *s;      
  30.     int i;      
  31.     L=(DLinkList *)malloc(sizeof(DLinkList));      
  32.     L->prior=L->next=NULL;      
  33.     for(i=0;i<n;i++)      
  34.     {      
  35.         s=(DLinkList *)malloc(sizeof(DLinkList));      
  36.         s->data=a[i];      
  37.         s->next=L->next;      
  38.         if(L->next!=NULL)      
  39.             L->next->prior;      
  40.         L->next=s;      
  41.         s->prior=L;      
  42.     }      
  43. }      
  44. void CreateListR(DLinkList *&L,ElemType a[],int n)//尾插法建双链表      
  45. {         
  46.     DLinkList *s,*r;      
  47.     int i;      
  48.     L=(DLinkList *)malloc(sizeof(DLinkList));      
  49.     r=L;      
  50.     for(i=0;i<n;i++)      
  51.     {      
  52.         s=(DLinkList *)malloc(sizeof(DLinkList));      
  53.         s->data=a[i];      
  54.         r->next=s;      
  55.         s->prior=r;      
  56.         r=s;      
  57.     }      
  58.     r->next=NULL;      
  59. }      
  60.       
  61. void InitList(DLinkList *&L)//初始化双链表      
  62. {      
  63.     L=(DLinkList *)malloc(sizeof(DLinkList));   //创建头结点      
  64.     L->prior=L->next=NULL;      
  65. }      
  66.       
  67. void DestroyList(DLinkList *&L) //销毁双链表      
  68. {      
  69.     DLinkList *p=L,*q=p->next;      
  70.     while (q!=NULL)      
  71.     {      
  72.         free(p);      
  73.         p=q;      
  74.         q=p->next;      
  75.     }      
  76.     free(p);      
  77. }      
  78.       
  79.       
  80. bool ListEmpty(DLinkList *L) //判断链表是否为空      
  81. {      
  82.     return(L->next==NULL);      
  83. }      
  84.       
  85. int ListLength(DLinkList *L) //求链表的长度      
  86. {      
  87.     DLinkList *p=L;      
  88.     int i=0;      
  89.     while (p->next!=NULL)      
  90.     {      
  91.         i++;      
  92.         p=p->next;      
  93.     }      
  94.     return(i);      
  95. }      
  96.       
  97. void DispList(DLinkList *L) //输出链表      
  98. {      
  99.     DLinkList *p=L->next;      
  100.     while (p!=NULL)      
  101.     {      
  102.         printf("%d ",p->data);      
  103.         p=p->next;      
  104.     }      
  105.     printf("\n");      
  106. }      
  107.       
  108. bool GetElem(DLinkList *L,int i,ElemType &e) //获取节点的值      
  109.     {      
  110.     int j=0;      
  111.     DLinkList *p=L;      
  112.     while (j<i && p!=NULL)      
  113.     {      
  114.         j++;      
  115.         p=p->next;      
  116.     }      
  117.     if (p==NULL)      
  118.         return false;      
  119.     else      
  120.     {      
  121.         e=p->data;      
  122.         return true;      
  123.     }      
  124. }      
  125.       
  126. int LocateElem(DLinkList *L,ElemType e) //查找一个节点      
  127. {      
  128.     int n=1;      
  129.     DLinkList *p=L->next;      
  130.     while (p!=NULL && p->data!=e)      
  131.     {      
  132.         n++;      
  133.         p=p->next;      
  134.     }      
  135.     if (p==NULL)      
  136.         return(0);      
  137.     else      
  138.         return(n);      
  139. }      
  140. bool ListInsert(DLinkList *&L,int i,ElemType e)      
  141.       
  142. {      
  143.     int j=0;      
  144.     DLinkList *p=L,*s;      
  145.     while (j<i-1 && p!=NULL)      
  146.     {      
  147.         j++;      
  148.         p=p->next;      
  149.     }      
  150.     if (p==NULL)    //未找到第i-1个结点      
  151.         return false;      
  152.     else            //找到第i-1个结点*p      
  153.     {      
  154.         s=(DLinkList *)malloc(sizeof(DLinkList));   //创建新结点*s      
  155.         s->data=e;      
  156.         s->next=p->next;        //将*s插入到*p之后      
  157.         if (p->next!=NULL) p->next->prior=s;      
  158.         s->prior=p;      
  159.         p->next=s;      
  160.         return true;      
  161.     }      
  162. }      
  163. bool ListDelete(DLinkList *&L,int i,ElemType &e)      
  164. {      
  165.     int j=0;      
  166.     DLinkList *p=L,*q;      
  167.     while (j<i-1 && p!=NULL)      
  168.     {      
  169.         j++;      
  170.         p=p->next;      
  171.     }      
  172.     if (p==NULL)                //未找到第i-1个结点      
  173.         return false;      
  174.     else                        //找到第i-1个结点*p      
  175.     {      
  176.         q=p->next;              //q指向要删除的结点      
  177.         if (q==NULL)      
  178.             return false;       //不存在第i个结点      
  179.         e=q->data;      
  180.         p->next=q->next;        //从单链表中删除*q结点      
  181.         if (p->next!=NULL) p->next->prior=p;      
  182.         free(q);                //释放*q结点      
  183.         return true;      
  184.     }      
  185. }      
  186.     
  187. (3)测验函数的代码    
  188.     
  189. [cpp] view plain copy    
  190. #include"list.h"      
  191. int main()      
  192. {      
  193.     DLinkList *A;      
  194.     ElemType a[]= {1, 3, 2, 9, 0, 4, 5 ,6, 7, 8};      
  195.     InitList(A);      
  196.     CreateListF(A, a, 10);      
  197.     printf("length: %d\n", ListLength(A));      
  198.     ListInsert(A, 4, 12);      
  199.     printf("After Insert: ");      
  200.     DispList(A);      
  201.     DestroyList(A);      
  202.     return 0;      
  203. }     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值