func2-1.cpp && func2-2.cpp && func2-3.cpp

      1.  // func2-3.cpp 几个常用的函数
      2.  Status equal(ElemType c1,ElemType c2)
      3.  { // 判断是否相等的函数
      4.    if(c1==c2)
      5.      return TRUE;
      6.    else
      7.      return FALSE;
      8.  }
      9.  int comp(ElemType a,ElemType b)
      10.  { // 根据a<、=或>b,分别返回-1、0或1
      11.    if(a==b)
      12.      return 0;
      13.    else
      14.      return (a-b)/abs(a-b);
      15.  }
      16.  void print(ElemType c)
      17.  {
      18.    printf("%d ",c);
      19.  }
      20.  void print2(ElemType c)
      21.  {
      22.    printf("%c ",c);
      23.  }
      24.  void print1(ElemType &c)
      25.  {
      26.    printf("%d ",c);
      27.  }
       // func2-2.cpp 实现算法2.15、2.16的程序,main2-31.cpp和main2-32.cpp调用
    1.  int Malloc(SLinkList space) // 算法2.15
    2.  { // 若备用链表非空,则返回分配的结点下标(备用链表的第一个结点),否则返回0
    3.    int i=space[0].cur;
    4.    if(i) // 备用链表非空
    5.      space[0].cur=space[i].cur; // 备用链表的头结点指向原备用链表的第二个结点
    6.    return i; // 返回新开辟结点的坐标
    7.  }
    8.  void Free(SLinkList space,int k) // 算法2.16
    9.  { // 将下标为k的空闲结点回收到备用链表(成为备用链表的第一个结点)
    10.    space[k].cur=space[0].cur; // 回收结点的"游标"指向备用链表的第一个结点
    11.    space[0].cur=k; // 备用链表的头结点指向新回收的结点
    12.  }
     // func2-1.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的扩展操作(3个)
  1.  // algo2-6.cpp和bo7-2.cpp用到
  2.  void InsertAscend(LinkList &L,ElemType e,int(*compare)(ElemType,ElemType))
  3.  { // 按关键字非降序将e插入表L。函数compare()返回值为:形参1的关键字-形参2的关键字
  4.    LinkList q=L;
  5.    if(!L||compare(e,L->data)<=0) // 链表空或e的关键字小于等于首结点的关键字
  6.      ListInsert(L,1,e); // 将e插在表头,在bo2-8.cpp中
  7.    else
  8.    {
  9.      while(q->next&&compare(q->next->data,e)<0) // q不是尾结点且q的下一结点关键字<e的关键字
  10.        q=q->next;
  11.      ListInsert(q,2,e); // 插在q所指结点后(将q作为头指针)
  12.    }
  13.  }
  14.  LinkList Point(LinkList L,ElemType e,Status(*equal)(ElemType,ElemType),LinkList &p)
  15.  { // 查找表L中满足条件的结点。如找到,返回指向该结点的指针,p指向该结点的前驱(若该结点是
  16.    // 首元结点,则p=NULL)。如表L中无满足条件的结点,则返回NULL,p无定义。
  17.    // 函数equal()的两形参的关键字相等,返回OK;否则返回ERROR
  18.    int i,j;
  19.    i=LocateElem(L,e,equal);
  20.    if(i) // 找到
  21.    {
  22.      if(i==1) // 是首元结点
  23.      {
  24.        p=NULL;
  25.        return L;
  26.      }
  27.      p=L;
  28.      for(j=2;j<i;j++)
  29.        p=p->next;
  30.      return p->next;
  31.    }
  32.    return NULL; // 没找到
  33.  }
  34.  Status DeleteElem(LinkList &L,ElemType &e,Status(*equal)(ElemType,ElemType))
  35.  { // 删除表L中满足条件的结点,并返回TRUE;如无此结点,则返回FALSE。
  36.    // 函数equal()的两形参的关键字相等,返回OK;否则返回ERROR
  37.    LinkList p,q;
  38.    q=Point(L,e,equal,p);
  39.    if(q) // 找到此结点,且q指向该结点
  40.    {
  41.      if(p) // 该结点不是首元结点,p指向其前驱
  42.        ListDelete(p,2,e); // 将p作为头指针,删除第2个结点
  43.      else // 该结点是首元结点
  44.        ListDelete(L,1,e);
  45.      return TRUE;
  46.    }
  47.    return FALSE;
  48.  }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值