bo2-1.cpp 順序表示的線性表(存儲結構由c2-1.h定義)的基本操作(12個)

  1.  // bo2-1.cpp 順序表示的線性表(存儲結構由c2-1.h定義)的基本操作(12個),包括算法2.3,2.4,2.5,2.6
  2.  void InitList(SqList &L) // 算法2.3
  3.  { // 操作結果:構造一個空的順序線性表L
  4.    L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
  5.    if(!L.elem)
  6.      exit(OVERFLOW); // 存儲分配失敗
  7.    L.length=0; // 空表長度爲0
  8.    L.listsize=LIST_INIT_SIZE; // 初始存儲容量
  9.  }
  10.  void DestroyList(SqList &L)
  11.  { // 初始條件:順序線性表L已存在。操作結果:銷燬順序線性表L
  12.    free(L.elem);
  13.    L.elem=NULL;
  14.    L.length=0;
  15.    L.listsize=0;
  16.  }
  17.  void ClearList(SqList &L)
  18.  { // 初始條件:順序線性表L已存在。操作結果:將L重置爲空表
  19.    L.length=0;
  20.  }
  21.  Status ListEmpty(SqList L)
  22.  { // 初始條件:順序線性表L已存在。操作結果:若L爲空表,則返回TRUE,否則返回FALSE
  23.    if(L.length==0)
  24.      return TRUE;
  25.    else
  26.      return FALSE;
  27.  }
  28.  int ListLength(SqList L)
  29.  { // 初始條件:順序線性表L已存在。操作結果:返回L中數據元素個數
  30.    return L.length;
  31.  }
  32.  Status GetElem(SqList L,int i,ElemType &e)
  33.  { // 初始條件:順序線性表L已存在,1≤i≤ListLength(L)。操作結果:用e返回L中第i個數據元素的值
  34.    if(i<1||i>L.length)
  35.      return ERROR;
  36.    e=*(L.elem+i-1);
  37.    return OK;
  38.  }
  39.  int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
  40.  { // 初始條件:順序線性表L已存在,compare()是數據元素判定函數(滿足爲1,否則爲0)
  41.    // 操作結果:返回L中第1個與e滿足關係compare()的數據元素的位序。
  42.    //           若這樣的數據元素不存在,則返回值爲0。算法2.6
  43.    ElemType *p;
  44.    int i=1; // i的初值爲第1個元素的位序
  45.    p=L.elem; // p的初值爲第1個元素的存儲位置
  46.    while(i<=L.length&&!compare(*p++,e))
  47.      ++i;
  48.    if(i<=L.length)
  49.      return i;
  50.    else
  51.      return 0;
  52.  }
  53.  Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
  54.  { // 初始條件:順序線性表L已存在
  55.    // 操作結果:若cur_e是L的數據元素,且不是第一個,則用pre_e返回它的前驅,
  56.    //           否則操作失敗,pre_e無定義
  57.    int i=2;
  58.    ElemType *p=L.elem+1;
  59.    while(i<=L.length&&*p!=cur_e)
  60.    {
  61.      p++;
  62.      i++;
  63.    }
  64.    if(i>L.length)
  65.      return INFEASIBLE; // 操作失敗
  66.    else
  67.    {
  68.      pre_e=*--p;
  69.      return OK;
  70.    }
  71.  }
  72.  Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
  73.  { // 初始條件:順序線性表L已存在
  74.    // 操作結果:若cur_e是L的數據元素,且不是最後一個,則用next_e返回它的後繼,
  75.    //           否則操作失敗,next_e無定義
  76.    int i=1;
  77.    ElemType *p=L.elem;
  78.    while(i<L.length&&*p!=cur_e)
  79.    {
  80.      i++;
  81.      p++;
  82.    }
  83.    if(i==L.length)
  84.      return INFEASIBLE; // 操作失敗
  85.    else
  86.    {
  87.      next_e=*++p;
  88.      return OK;
  89.    }
  90.  }
  91.  Status ListInsert(SqList &L,int i,ElemType e) // 算法2.4
  92.  { // 初始條件:順序線性表L已存在,1≤i≤ListLength(L)+1
  93.    // 操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1
  94.    ElemType *newbase,*q,*p;
  95.    if(i<1||i>L.length+1) // i值不合法
  96.      return ERROR;
  97.    if(L.length>=L.listsize) // 當前存儲空間已滿,增加分配
  98.    {
  99.      if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType))))
  100.        exit(OVERFLOW); // 存儲分配失敗
  101.      L.elem=newbase; // 新基址
  102.      L.listsize+=LIST_INCREMENT; // 增加存儲容量
  103.    }
  104.    q=L.elem+i-1; // q爲插入位置
  105.    for(p=L.elem+L.length-1;p>=q;--p) // 插入位置及之後的元素右移
  106.      *(p+1)=*p;
  107.    *q=e; // 插入e
  108.    ++L.length; // 表長增1
  109.    return OK;
  110.  }
  111.  Status ListDelete(SqList &L,int i,ElemType &e) // 算法2.5
  112.  { // 初始條件:順序線性表L已存在,1≤i≤ListLength(L)
  113.    // 操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1
  114.    ElemType *p,*q;
  115.    if(i<1||i>L.length) // i值不合法
  116.      return ERROR;
  117.    p=L.elem+i-1; // p爲被刪除元素的位置
  118.    e=*p; // 被刪除元素的值賦給e
  119.    q=L.elem+L.length-1; // 表尾元素的位置
  120.    for(++p;p<=q;++p) // 被刪除元素之後的元素左移
  121.      *(p-1)=*p;
  122.    L.length--; // 表長減1
  123.    return OK;
  124.  }
  125.  void ListTraverse(SqList L,void(*vi)(ElemType&))
  126.  { // 初始條件:順序線性表L已存在
  127.    // 操作結果:依次對L的每個數據元素調用函數vi()
  128.    //           vi()的形參加'&',表明可通過調用vi()改變元素的值
  129.    ElemType *p;
  130.    int i;
  131.    p=L.elem;
  132.    for(i=1;i<=L.length;i++)
  133.      vi(*p++);
  134.    printf("/n");
  135.  }
發佈了41 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章