第4周项目4- 建设双链表算法库

来源:互联网 发布:在家健身 知乎 编辑:程序博客网 时间:2024/06/06 00:20

问题及代码:

/* *Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目4.cbp *作    者:陈光辉 *完成日期:2016年9月23日 *版 本 号:v1.0 * *问题描述:算法库包括两个文件:            头文件:dlinklist.h,包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明;            源文件:dlinklist.cpp,包含实现各种算法的函数的定义            请采用程序的多文件组织形式,建立如上的两个文件,另外再建立一个源文件(如main.cpp),编制main函数,完成相关的测试工作。 *输入描述:无 *程序输出:调整后的链表 */ 

  • cdlinklist.h头文件代码
#ifndef CDLINKLIST_H_INCLUDED  #define CDLINKLIST_H_INCLUDED  #include <stdio.h>  #include <malloc.h>    //循环双链表基本运算函数  typedef int ElemType;  typedef struct DNode        //定义双链表结点类型  {      ElemType data;      struct DNode *prior;    //指向前驱结点      struct DNode *next;     //指向后继结点  } CDLinkList;    void CreateListF(CDLinkList *&L,ElemType a[],int n); //头插法建立循环双链表  void CreateListR(CDLinkList *&L,ElemType a[],int n); //尾插法建立循环双链表  void InitList(CDLinkList *&L); //初始化循环双链表  void DestroyList(CDLinkList *&L);  //销毁  bool ListEmpty(CDLinkList *L); //判断是否为空  int ListLength(CDLinkList *L); //求链表长度  void DispList(CDLinkList *L);  //输出链表  bool GetElem(CDLinkList *L,int i,ElemType &e);  //取链表元素  int LocateElem(CDLinkList *L,ElemType e);  //查找元素  bool ListInsert(CDLinkList *&L,int i,ElemType e);  //插入节点  bool ListDelete(CDLinkList *&L,int i,ElemType &e);  //删除节点    #endif // CDLINKLIST_H_INCLUDED 
  • cdlinklist.cpp文件代码
//循环双链表基本运算函数  #include "cdlinklist.h"  void CreateListF(CDLinkList *&L,ElemType a[],int n) //头插法建立循环双链表  {      CDLinkList *s;      int i;      L=(CDLinkList *)malloc(sizeof(CDLinkList));     //创建头结点      L->next=NULL;      for (i=0; i<n; i++)      {          s=(CDLinkList *)malloc(sizeof(CDLinkList));//创建新结点          s->data=a[i];          s->next=L->next;            //将*s插在原开始结点之前,头结点之后          if (L->next!=NULL) L->next->prior=s;          L->next=s;          s->prior=L;      }      s=L->next;      while (s->next!=NULL)           //查找尾结点,由s指向它          s=s->next;      s->next=L;                      //尾结点next域指向头结点      L->prior=s;                     //头结点的prior域指向尾结点      }  void CreateListR(CDLinkList *&L,ElemType a[],int n) //尾插法建立循环双链表  {      CDLinkList *s,*r;      int i;      L=(CDLinkList *)malloc(sizeof(CDLinkList));  //创建头结点      L->next=NULL;      r=L;                    //r始终指向尾结点,开始时指向头结点      for (i=0; i<n; i++)      {          s=(CDLinkList *)malloc(sizeof(CDLinkList));//创建新结点          s->data=a[i];          r->next=s;          s->prior=r; //将*s插入*r之后          r=s;      }      r->next=L;              //尾结点next域指向头结点      L->prior=r;             //头结点的prior域指向尾结点  }  void InitList(CDLinkList *&L) //初始化循环双链表  {      L=(CDLinkList *)malloc(sizeof(CDLinkList));     //创建头结点      L->prior=L->next=L;  }  void DestroyList(CDLinkList *&L)  //销毁  {      CDLinkList *p=L,*q=p->next;      while (q!=L)      {          free(p);          p=q;          q=p->next;      }      free(p);  }  bool ListEmpty(CDLinkList *L) //判断是否为空  {      return(L->next==L);  }  int ListLength(CDLinkList *L) //求链表长度  {      CDLinkList *p=L;      int i=0;      while (p->next!=L)      {          i++;          p=p->next;      }      return(i);  }  void DispList(CDLinkList *L)  //输出链表  {      CDLinkList *p=L->next;      while (p!=L)      {          printf("%d ",p->data);          p=p->next;      }      printf("\n");  }  bool GetElem(CDLinkList *L,int i,ElemType &e)  //取链表元素  {      int j=0;      CDLinkList *p;      if (L->next!=L)     //双链表不为空表时      {          if (i==1)          {              e=L->next->data;              return true;          }          else            //i不为1时          {              p=L->next;              while (j<i-1 && p!=L)              {                  j++;                  p=p->next;              }              if (p==L)                  return false;              else              {                  e=p->data;                  return true;              }          }      }      else                //双链表为空表时          return 0;  }  int LocateElem(CDLinkList *L,ElemType e)  //查找元素  {      int n=1;      CDLinkList *p=L->next;      while (p!=NULL && p->data!=e)      {          n++;          p=p->next;      }      if (p==NULL)          return(0);      else          return(n);  }  bool ListInsert(CDLinkList *&L,int i,ElemType e)  //插入节点  {      int j=0;      CDLinkList *p=L,*s;      if (p->next==L)                 //原双链表为空表时      {          s=(CDLinkList *)malloc(sizeof(CDLinkList)); //创建新结点*s          s->data=e;          p->next=s;          s->next=p;          p->prior=s;          s->prior=p;          return true;      }      else if (i==1)                  //原双链表不为空表但i=1时      {          s=(CDLinkList *)malloc(sizeof(CDLinkList)); //创建新结点*s          s->data=e;          s->next=p->next;          p->next=s;  //将*s插入到*p之后          s->next->prior=s;          s->prior=p;          return true;      }      else      {          p=L->next;          while (j<i-2 && p!=L)          {              j++;              p=p->next;          }          if (p==L)               //未找到第i-1个结点              return false;          else                    //找到第i-1个结点*p          {              s=(CDLinkList *)malloc(sizeof(CDLinkList)); //创建新结点*s              s->data=e;              s->next=p->next;    //将*s插入到*p之后              if (p->next!=NULL) p->next->prior=s;              s->prior=p;              p->next=s;              return true;          }      }  }  bool ListDelete(CDLinkList *&L,int i,ElemType &e)  //删除节点  {      int j=0;      CDLinkList *p=L,*q;      if (p->next!=L)                 //原双链表不为空表时      {          if (i==1)                   //i==1时          {              q=L->next;              //删除第1个结点              e=q->data;              L->next=q->next;              q->next->prior=L;              free(q);              return true;          }          else                        //i不为1时          {              p=L->next;              while (j<i-2 && p!=NULL)              {                  j++;                  p=p->next;              }              if (p==NULL)                //未找到第i-1个结点                  return false;              else                        //找到第i-1个结点*p              {                  q=p->next;              //q指向要删除的结点                  if (q==NULL) return 0;  //不存在第i个结点                  e=q->data;                  p->next=q->next;        //从单链表中删除*q结点                  if (p->next!=NULL) p->next->prior=p;                  free(q);                //释放*q结点                  return true;              }          }      }      else          return false;   //原双链表为空表时  }  

main.cpp代码:

#include "cdlinklist.h"  int main()  {      CDLinkList *A;      ElemType a[]= {1, 3, 2, 9, 0, 4, 5 ,6, 7, 8};      InitList(A);      CreateListF(A, a, 10);      printf("length: %d\n", ListLength(A));      ListInsert(A, 4, 12);      printf("After Insert: ");      DispList(A);      DestroyList(A);      return 0;  }  
cdlinklist.h是单链表的一个算法库集合,里面声明了常用到的各个功能函数。
cdlinklist.cpp对应cdlinklist.h中声明的各个功能函数,给出了各个功能函数的实现方法。
main.cpp中根据需要添加各个函数,以便实现相应功能。 

运行结果:





0 0
原创粉丝点击