12_4.c
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 12_4.cpp                    */
  3. /*    链结串列类别实作                      */
  4. /* ======================================== */
  5. #include <iostream.h>
  6. struct llink                      /* 串列结构宣告      */
  7. {  
  8.     int data;                     /* 串列资料          */
  9.     llink *next;                  /* 指向下一个资料    */ 
  10. };
  11. class linklist                    /* Linklist类别宣告  */
  12. {
  13. private:
  14.     llink *first;                 /* 串列的开始指标    */
  15. public:
  16.     linklist() { first = NULL; }  /* 建构函数          */
  17.     void insertNode(int d);       /* 成员函数的宣告    */
  18.     void deleteNode(int d); 
  19.     void printLlist();
  20.     int search(int d);
  21. };
  22. /* ---------------------------------------- */
  23. /*  成员函数: 在串列开头插入节点            */
  24. /* ---------------------------------------- */
  25. void linklist::insertNode(int d)
  26. {
  27.     /* 建立节点记忆体 */
  28.     llink *newnode = new llink;
  29.     newnode->data = d;            /* 建立节点内容      */
  30.     newnode->next = first;        /* 连结节点          */
  31.     first = newnode;              /* 指向新节点        */
  32. }
  33. /* ---------------------------------------- */
  34. /*  成员函数: 删除指定资料的节点            */
  35. /* ---------------------------------------- */
  36. void linklist::deleteNode(int d)
  37. {
  38.     llink *current = first;       /* 建立目前的串列指标 */
  39.     llink *last= current;         /* 建立前一个串列指标 */
  40.     if ( current == NULL )        /* 检查串列是否是空的 */
  41.        return;
  42.     else{
  43.        while ( current != NULL )  /* 走访串列节点的回路 */
  44.        {
  45.            /* 是否找到资料且是第一个节点 */
  46.    if (current->data == d && current == first )
  47.            {
  48.       first = current->next; /* 重设串列指标    */
  49.               delete current;        /* 释放串列节点    */
  50.               return; 
  51.            }     /* 是否找到资料且不是第一个节点 */
  52.    else if (current->data == d && current != first )
  53.            {
  54.                 /* 前一个指标连接下一个指标 */
  55. last->next = current->next;
  56.                 delete current;      /* 释放串列节点    */
  57.                 return;
  58.    }
  59.            else
  60. last = current;    /* 保留前一个串列指标 */
  61.    current = current->next;/* 下一个节点         */
  62.        }
  63.     }
  64. }
  65. /* ---------------------------------------- */
  66. /*  成员函数: 走访搜寻指定的资料            */
  67. /* ---------------------------------------- */
  68. int linklist::search(int d){
  69.     llink *current = first;       /* 建立目前的串列指标 */
  70.     while ( current != NULL )     /* 搜寻主回路         */
  71.     {
  72. if ( current->data == d ) /* 是否找到资料       */
  73.            return 1;              /* 找到               */
  74. current = current->next;  /* 下一个节点         */
  75.     }
  76.     return 0;                     /* 没有找到           */
  77. }
  78. /* ---------------------------------------- */
  79. /*  成员函数: 列印串列资料                  */
  80. /* ---------------------------------------- */
  81. void linklist::printLlist()
  82. {
  83.     llink *current = first;       /* 建立目前的串列指标 */
  84.     while ( current != NULL )     /* 列印主回路         */
  85.     {
  86.         /* 列印节点资料 */
  87. cout << "[" << current->data << "]";
  88. current = current->next;  /* 下一个节点         */
  89.     }
  90.     cout << "n";
  91. }
  92. /* ---------------------------------------- */
  93. /*  主程式: 建立串列物件和测试成员函数      */
  94. /* ---------------------------------------- */
  95. void main()
  96. {
  97.     linklist Li;                    /* 建立物件           */
  98.     int i,temp;
  99.     int llist[6] = { 1, 2, 3, 4, 5, 6 }; /* 阵列内容      */
  100.     for ( i = 0; i < 6; i++ )       /* 建立串列节点的回路 */
  101.         Li.insertNode(llist[i]);    /* 插入节点           */
  102.     cout << "原来的链表: ";
  103.     Li.printLlist();                /* 列印原来串列       */
  104.     cout << "请输入节点内容: ";     /* 输出字串           */
  105.     cin >> temp;                    /* 输入节点资料       */
  106.     /* 搜寻指定的节点资料 */
  107.     if ( Li.search(temp) ) 
  108.        cout << "链表包含节点[" << temp << "]!n";
  109.     Li.deleteNode(temp);            /* 删除节点           */
  110.     cout << "删除后的链表: ";
  111.     Li.printLlist();                /* 列印删除後串列     */
  112. }