bo2-6.cpp 具有實用意義的線性鏈表(存儲結構由c2-5.h定義)的24個基本操作

 
  1.  // bo2-6.cpp 具有實用意義的線性鏈表(存儲結構由c2-5.h定義)的24個基本操作
  2.  void MakeNode(Link &p,ElemType e)
  3.  { // 分配由p指向的值爲e的結點。若分配失敗,則退出
  4.    p=(Link)malloc(sizeof(LNode));
  5.    if(!p)
  6.      exit(ERROR);
  7.    p->data=e;
  8.  }
  9.  void FreeNode(Link &p)
  10.  { // 釋放p所指結點
  11.    free(p);
  12.    p=NULL;
  13.  }
  14.  void InitList(LinkList &L)
  15.  { // 構造一個空的線性鏈表L
  16.    Link p;
  17.    p=(Link)malloc(sizeof(LNode)); // 生成頭結點
  18.    if(p)
  19.    {
  20.      p->next=NULL;
  21.      L.head=L.tail=p;
  22.      L.len=0;
  23.    }
  24.    else
  25.      exit(ERROR);
  26.  }
  27.  void ClearList(LinkList &L)
  28.  { // 將線性鏈表L重置爲空表,並釋放原鏈表的結點空間
  29.    Link p,q;
  30.    if(L.head!=L.tail) // 不是空表
  31.    {
  32.      p=q=L.head->next;
  33.      L.head->next=NULL;
  34.      while(p!=L.tail)
  35.      {
  36.        p=q->next;
  37.        free(q);
  38.        q=p;
  39.      }
  40.      free(q);
  41.      L.tail=L.head;
  42.      L.len=0;
  43.    }
  44.  }
  45.  void DestroyList(LinkList &L)
  46.  { // 銷燬線性鏈表L,L不再存在
  47.    ClearList(L); // 清空鏈表
  48.    FreeNode(L.head);
  49.    L.tail=NULL;
  50.    L.len=0;
  51.  }
  52.  void InsFirst(LinkList &L,Link h,Link s) // 形參增加L,因爲需修改L
  53.  { // h指向L的一個結點,把h當做頭結點,將s所指結點插入在第一個結點之前
  54.    s->next=h->next;
  55.    h->next=s;
  56.    if(h==L.tail) // h指向尾結點
  57.      L.tail=h->next; // 修改尾指針
  58.    L.len++;
  59.  }
  60.  Status DelFirst(LinkList &L,Link h,Link &q) // 形參增加L,因爲需修改L
  61.  { // h指向L的一個結點,把h當做頭結點,刪除鏈表中的第一個結點並以q返回。
  62.    // 若鏈表爲空(h指向尾結點),q=NULL,返回FALSE
  63.    q=h->next;
  64.    if(q) // 鏈表非空
  65.    {
  66.      h->next=q->next;
  67.      if(!h->next) // 刪除尾結點
  68.        L.tail=h; // 修改尾指針
  69.      L.len--;
  70.      return OK;
  71.    }
  72.    else
  73.      return FALSE; // 鏈表空
  74.  }
  75.  void Append(LinkList &L,Link s)
  76.  { // 將指針s(s->data爲第一個數據元素)所指(彼此以指針相鏈,以NULL結尾)的
  77.    // 一串結點鏈接在線性鏈表L的最後一個結點之後,並改變鏈表L的尾指針指向新的尾結點
  78.    int i=1;
  79.    L.tail->next=s;
  80.    while(s->next)
  81.    {
  82.      s=s->next;
  83.      i++;
  84.    }
  85.    L.tail=s;
  86.    L.len+=i;
  87.  }
  88.  Position PriorPos(LinkList L,Link p)
  89.  { // 已知p指向線性鏈表L中的一個結點,返回p所指結點的直接前驅的位置。若無前驅,則返回NULL
  90.    Link q;
  91.    q=L.head->next;
  92.    if(q==p) // 無前驅
  93.      return NULL;
  94.    else
  95.    {
  96.      while(q->next!=p) // q不是p的直接前驅
  97.        q=q->next;
  98.      return q;
  99.    }
  100.  }
  101.  Status Remove(LinkList &L,Link &q)
  102.  { // 刪除線性鏈表L中的尾結點並以q返回,改變鏈表L的尾指針指向新的尾結點
  103.    Link p=L.head;
  104.    if(L.len==0) // 空表
  105.    {
  106.      q=NULL;
  107.      return FALSE;
  108.    }
  109.    while(p->next!=L.tail)
  110.      p=p->next;
  111.    q=L.tail;
  112.    p->next=NULL;
  113.    L.tail=p;
  114.    L.len--;
  115.    return OK;
  116.  }
  117.  void InsBefore(LinkList &L,Link &p,Link s)
  118.  { // 已知p指向線性鏈表L中的一個結點,將s所指結點插入在p所指結點之前,
  119.    // 並修改指針p指向新插入的結點
  120.    Link q;
  121.    q=PriorPos(L,p); // q是p的前驅
  122.    if(!q) // p無前驅
  123.      q=L.head;
  124.    s->next=p;
  125.    q->next=s;
  126.    p=s;
  127.    L.len++;
  128.  }
  129.  void InsAfter(LinkList &L,Link &p,Link s)
  130.  { // 已知p指向線性鏈表L中的一個結點,將s所指結點插入在p所指結點之後,
  131.    // 並修改指針p指向新插入的結點
  132.    if(p==L.tail) // 修改尾指針
  133.      L.tail=s;
  134.    s->next=p->next;
  135.    p->next=s;
  136.    p=s;
  137.    L.len++;
  138.  }
  139.  void SetCurElem(Link p,ElemType e)
  140.  { // 已知p指向線性鏈表中的一個結點,用e更新p所指結點中數據元素的值
  141.    p->data=e;
  142.  }
  143.  ElemType GetCurElem(Link p)
  144.  { // 已知p指向線性鏈表中的一個結點,返回p所指結點中數據元素的值
  145.    return p->data;
  146.  }
  147.  Status ListEmpty(LinkList L)
  148.  { // 若線性鏈表L爲空表,則返回TRUE,否則返回FALSE
  149.    if(L.len)
  150.      return FALSE;
  151.    else
  152.      return TRUE;
  153.  }
  154.  int ListLength(LinkList L)
  155.  { // 返回線性鏈表L中元素個數
  156.    return L.len;
  157.  }
  158.  Position GetHead(LinkList L)
  159.  { // 返回線性鏈表L中頭結點的位置
  160.    return L.head;
  161.  }
  162.  Position GetLast(LinkList L)
  163.  { // 返回線性鏈表L中最後一個結點的位置
  164.    return L.tail;
  165.  }
  166.  Position NextPos(Link p)
  167.  { // 已知p指向線性鏈表L中的一個結點,返回p所指結點的直接後繼的位置。若無後繼,則返回NULL
  168.    return p->next;
  169.  }
  170.  Status LocatePos(LinkList L,int i,Link &p)
  171.  { // 返回p指示線性鏈表L中第i個結點的位置,並返回OK,i值不合法時返回ERROR。i=0爲頭結點
  172.    int j;
  173.    if(i<0||i>L.len)
  174.      return ERROR;
  175.    else
  176.    {
  177.      p=L.head;
  178.      for(j=1;j<=i;j++)
  179.        p=p->next;
  180.      return OK;
  181.    }
  182.  }
  183.  Position LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType))
  184.  { // 返回線性鏈表L中第1個與e滿足函數compare()判定關係的元素的位置,
  185.    // 若不存在這樣的元素,則返回NULL
  186.    Link p=L.head;
  187.    do
  188.      p=p->next;
  189.    while(p&&!(compare(p->data,e))); // 沒到表尾且沒找到滿足關係的元素
  190.    return p;
  191.  }
  192.  void ListTraverse(LinkList L,void(*visit)(ElemType))
  193.  { // 依次對L的每個數據元素調用函數visit()
  194.    Link p=L.head->next;
  195.    int j;
  196.    for(j=1;j<=L.len;j++)
  197.    {
  198.      visit(p->data);
  199.      p=p->next;
  200.    }
  201.    printf("/n");
  202.  }
  203.  void OrderInsert(LinkList &L,ElemType e,int (*comp)(ElemType,ElemType))
  204.  { // 已知L爲有序線性鏈表,將元素e按非降序插入在L中。(用於一元多項式)
  205.    Link o,p,q;
  206.    q=L.head;
  207.    p=q->next;
  208.    while(p!=NULL&&comp(p->data,e)<0) // p不是表尾且元素值小於e
  209.    {
  210.      q=p;
  211.      p=p->next;
  212.    }
  213.    o=(Link)malloc(sizeof(LNode)); // 生成結點
  214.    o->data=e; // 賦值
  215.    q->next=o; // 插入
  216.    o->next=p;
  217.    L.len++; // 表長加1
  218.    if(!p) // 插在表尾
  219.      L.tail=o; // 修改尾結點
  220.  }
  221.  Status LocateElem(LinkList L,ElemType e,Position &q,int(*compare)(ElemType,ElemType))
  222.  { // 若升序鏈表L中存在與e滿足判定函數compare()取值爲0的元素,則q指示L中
  223.    // 第一個值爲e的結點的位置,並返回TRUE;否則q指示第一個與e滿足判定函數
  224.    // compare()取值>0的元素的前驅的位置。並返回FALSE。(用於一元多項式)
  225.    Link p=L.head,pp;
  226.    do
  227.    {
  228.      pp=p;
  229.      p=p->next;
  230.    }while(p&&(compare(p->data,e)<0)); // 沒到表尾且p->data.expn<e.expn
  231.    if(!p||compare(p->data,e)>0) // 到表尾或compare(p->data,e)>0
  232.    {
  233.      q=pp;
  234.      return FALSE;
  235.    }
  236.    else // 找到
  237.    {
  238.      q=p;
  239.      return TRUE;
  240.    }
  241.  }
發佈了41 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章