bo2-5.cpp 带头结点的双向循环链表(存储结构由c2-4.h定义)的基本操作(14个)

  1.  // bo2-5.cpp 带头结点的双向循环链表(存储结构由c2-4.h定义)的基本操作(14个),包括算法2.18,2.19
  2.  void InitList(DuLinkList &L)
  3.  { // 产生空的双向循环链表L
  4.    L=(DuLinkList)malloc(sizeof(DuLNode));
  5.    if(L)
  6.      L->next=L->prior=L;
  7.    else
  8.      exit(OVERFLOW);
  9.  }
  10.  void DestroyList(DuLinkList &L)
  11.  { // 操作结果:销毁双向循环链表L
  12.    DuLinkList q,p=L->next; // p指向第一个结点
  13.    while(p!=L) // p没到表头
  14.    {
  15.      q=p->next;
  16.      free(p);
  17.      p=q;
  18.    }
  19.    free(L);
  20.    L=NULL;
  21.  }
  22.  void ClearList(DuLinkList L) // 不改变L
  23.  { // 初始条件:L已存在。操作结果:将L重置为空表
  24.    DuLinkList q,p=L->next; // p指向第一个结点
  25.    while(p!=L) // p没到表头
  26.    {
  27.      q=p->next;
  28.      free(p);
  29.      p=q;
  30.    }
  31.    L->next=L->prior=L; // 头结点的两个指针域均指向自身
  32.  }
  33.  Status ListEmpty(DuLinkList L)
  34.  { // 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
  35.    if(L->next==L&&L->prior==L)
  36.      return TRUE;
  37.    else
  38.      return FALSE;
  39.  }
  40.  int ListLength(DuLinkList L)
  41.  { // 初始条件:L已存在。操作结果:返回L中数据元素个数
  42.    int i=0;
  43.    DuLinkList p=L->next; // p指向第一个结点
  44.    while(p!=L) // p没到表头
  45.    {
  46.      i++;
  47.      p=p->next;
  48.    }
  49.    return i;
  50.  }
  51.  Status GetElem(DuLinkList L,int i,ElemType &e)
  52.  { // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
  53.    int j=1; // j为计数器
  54.    DuLinkList p=L->next; // p指向第一个结点
  55.    while(p!=L&&j<i) // 顺指针向后查找,直到p指向第i个元素或p指向头结点
  56.    {
  57.      p=p->next;
  58.      j++;
  59.    }
  60.    if(p==L||j>i) // 第i个元素不存在
  61.      return ERROR;
  62.    e=p->data; // 取第i个元素
  63.    return OK;
  64.  }
  65.  int LocateElem(DuLinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
  66.  { // 初始条件:L已存在,compare()是数据元素判定函数
  67.    // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
  68.    //           若这样的数据元素不存在,则返回值为0
  69.    int i=0;
  70.    DuLinkList p=L->next; // p指向第1个元素
  71.    while(p!=L)
  72.    {
  73.      i++;
  74.      if(compare(p->data,e)) // 找到这样的数据元素
  75.        return i;
  76.      p=p->next;
  77.    }
  78.    return 0;
  79.  }
  80.  Status PriorElem(DuLinkList L,ElemType cur_e,ElemType &pre_e)
  81.  { // 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
  82.    //           前驱,否则操作失败,pre_e无定义
  83.    DuLinkList p=L->next->next; // p指向第2个元素
  84.    while(p!=L) // p没到表头
  85.    {
  86.      if(p->data==cur_e)
  87.      {
  88.        pre_e=p->prior->data;
  89.        return TRUE;
  90.      }
  91.      p=p->next;
  92.    }
  93.    return FALSE;
  94.  }
  95.  Status NextElem(DuLinkList L,ElemType cur_e,ElemType &next_e)
  96.  { // 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
  97.    //           否则操作失败,next_e无定义
  98.    DuLinkList p=L->next->next; // p指向第2个元素
  99.    while(p!=L) // p没到表头
  100.    {
  101.      if(p->prior->data==cur_e)
  102.      {
  103.        next_e=p->data;
  104.        return TRUE;
  105.      }
  106.      p=p->next;
  107.    }
  108.    return FALSE;
  109.  }
  110.  DuLinkList GetElemP(DuLinkList L,int i) // 另加
  111.  { // 在双向链表L中返回第i个元素的地址。i为0,返回头结点的地址。若第i个元素不存在,
  112.    // 返回NULL(算法2.18、2.19要调用的函数)
  113.    int j;
  114.    DuLinkList p=L; // p指向头结点
  115.    if(i<0||i>ListLength(L)) // i值不合法
  116.      return NULL;
  117.    for(j=1;j<=i;j++)
  118.      p=p->next;
  119.    return p;
  120.  }
  121.  Status ListInsert(DuLinkList L,int i,ElemType e)
  122.  { // 在带头结点的双链循环线性表L中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1
  123.    // 改进算法2.18,否则无法在第表长+1个结点之前插入元素
  124.    DuLinkList p,s;
  125.    if(i<1||i>ListLength(L)+1) // i值不合法
  126.      return ERROR;
  127.    p=GetElemP(L,i-1); // 在L中确定第i个元素前驱的位置指针p
  128.    if(!p) // p=NULL,即第i个元素的前驱不存在(设头结点为第1个元素的前驱)
  129.      return ERROR;
  130.    s=(DuLinkList)malloc(sizeof(DuLNode));
  131.    if(!s)
  132.      return OVERFLOW;
  133.    s->data=e;
  134.    s->prior=p; // 在第i-1个元素之后插入
  135.    s->next=p->next;
  136.    p->next->prior=s;
  137.    p->next=s;
  138.    return OK;
  139.  }
  140.  Status ListDelete(DuLinkList L,int i,ElemType &e) // 算法2.19
  141.  { // 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长
  142.    DuLinkList p;
  143.    if(i<1) // i值不合法
  144.      return ERROR;
  145.    p=GetElemP(L,i);  // 在L中确定第i个元素的位置指针p
  146.    if(!p) // p=NULL,即第i个元素不存在
  147.      return ERROR;
  148.    e=p->data;
  149.    p->prior->next=p->next;
  150.    p->next->prior=p->prior;
  151.    free(p);
  152.    return OK;
  153.  }
  154.  void ListTraverse(DuLinkList L,void(*visit)(ElemType))
  155.  { // 由双链循环线性表L的头结点出发,正序对每个数据元素调用函数visit()
  156.    DuLinkList p=L->next; // p指向头结点
  157.    while(p!=L)
  158.    {
  159.      visit(p->data);
  160.      p=p->next;
  161.    }
  162.    printf("/n");
  163.  }
  164.  void ListTraverseBack(DuLinkList L,void(*visit)(ElemType))
  165.  { // 由双链循环线性表L的头结点出发,逆序对每个数据元素调用函数visit()。另加
  166.    DuLinkList p=L->prior; // p指向尾结点
  167.    while(p!=L)
  168.    {
  169.      visit(p->data);
  170.      p=p->prior;
  171.    }
  172.    printf("/n");
  173.  }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值