一个简单的链表类

  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4. class Linklist
  5. {
  6. private:
  7.     typedef struct NODE
  8.     {
  9.         int data;
  10.         NODE* next;
  11.         NODE(int data, NODE* next)
  12.         {
  13.             this->data = data;
  14.             this->next = next;
  15.         }
  16.     };
  17.     
  18. private:
  19.     NODE* head;
  20.     
  21. public:
  22.     //默认构造函数
  23.     Linklist(int n=10)
  24.     {
  25.         NODE* p = new NODE(-1,0);
  26.         head = p;
  27.         
  28.         int i = 0;
  29.         while (i<n)
  30.         {
  31.             int k = 0;
  32.             cout << "input the NODE of " << i+1 << ":";
  33.             cin >> k;
  34.             
  35.             NODE* t_ptr = new NODE(k,0);
  36.             p->next = t_ptr;
  37.             p = p->next;
  38.             i++;
  39.         }   
  40.     }
  41.     
  42.     //析构函数
  43.     ~Linklist()
  44.     {
  45.         stack<NODE*> ptr_stack;
  46.         NODE* ptr = head;
  47.         while (0 != ptr)
  48.         {
  49.             ptr_stack.push(ptr);
  50.             ptr = ptr->next;
  51.         }
  52.         while (!ptr_stack.empty())
  53.         {
  54.             delete ptr_stack.top();
  55.             ptr_stack.pop();
  56.         }
  57.     }
  58.     //打印链表
  59.     void display()
  60.     {
  61.         NODE* p = head->next;
  62.         while (0 != p)
  63.         {
  64.             cout << (p->data) << endl;
  65.             p = p->next;
  66.         }
  67.     }
  68.     
  69.     //链表反转
  70.     void antitone()
  71.     {
  72.         stack<NODE*> ptr_stack;
  73.         NODE* ptr = head->next;
  74.         while (ptr)
  75.         {
  76.             ptr_stack.push(ptr);
  77.             ptr = ptr->next;
  78.         }
  79.         head->next = ptr_stack.top();
  80.         ptr_stack.pop();
  81.         ptr = head->next;
  82.         ptr->next = 0;
  83.         
  84.         while (!ptr_stack.empty())
  85.         {
  86.             ptr->next = ptr_stack.top();
  87.             ptr_stack.pop();
  88.             ptr = ptr->next;
  89.             ptr->next = 0;
  90.         }
  91.     }
  92.     
  93.     //数据data第一次出现的后面插入一个节点 
  94.     bool insertNODE(int data)
  95.     {
  96.         NODE* ptr = get_ptr(data);
  97.         if (ptr)
  98.         {
  99.             cout << "input the data of you wanna insert:";
  100.             int k = 0;
  101.             cin >> k;
  102.             NODE* node = new NODE(k,0);
  103.             node->next = ptr->next;
  104.             ptr->next = node;
  105.             return true;
  106.         }
  107.         return false;
  108.     }
  109.     
  110.     //获得节点的个数
  111.     int getDataNum()
  112.     {
  113.         NODE* ptr = head->next;
  114.         int num=0;
  115.         while(ptr)
  116.         {
  117.             num++;
  118.             ptr = ptr->next;
  119.         }
  120.         return num;
  121.     }
  122.     
  123.     //链表排序
  124.     void sort()
  125.     {
  126.         int num = getDataNum();
  127.         int* arr = new int[num];
  128.         NODE* ptr = head->next;
  129.         
  130.         for (int i = 0; i<num; i++)
  131.         {
  132.             arr[i] = ptr->data;
  133.             ptr = ptr->next;
  134.         }
  135.         
  136.         //冒泡
  137.         for (int i=0; i<num; i++)
  138.             for (int j=i+1; j<num; j++)
  139.                 if(arr[i]>arr[j])
  140.                 {
  141.                     int tmp = arr[j];
  142.                     arr[j] = arr[i];
  143.                     arr[i] = tmp;
  144.                 }
  145.         
  146.         ptr = head->next;
  147.         for (int i=0; i< num; i++)
  148.         {
  149.             ptr->data = arr[i];
  150.             ptr = ptr->next;
  151.         }
  152.         delete []arr;
  153.     }
  154.     
  155.     //删除data第一次出现的节点
  156.     bool deleteNODE(int data)
  157.     {
  158.         NODE* ptr_1 = head;
  159.         NODE* ptr_2 = head->next;
  160.         
  161.         while (ptr_2 && (ptr_2->data != data))
  162.         {
  163.             ptr_1 = ptr_1->next;
  164.             ptr_2 = ptr_2->next;
  165.         }
  166.         
  167.         if (ptr_2)
  168.         {
  169.             ptr_1->next = ptr_1->next->next;
  170.             delete ptr_2;
  171.             return true;
  172.         }
  173.         return false;
  174.     }
  175.     
  176. private:
  177.     //获得数据为data第一次出现的节点的指针值
  178.     NODE* get_ptr(int data)
  179.     {
  180.         NODE* ptr = head->next;
  181.         while (ptr&&((ptr->data) != data))
  182.             ptr = ptr->next;
  183.         if (!ptr)
  184.             return 0;
  185.         return ptr;
  186.     }
  187. };
  188. int main()
  189. {
  190.     Linklist linklist = Linklist(20);
  191.     linklist.display();
  192.     linklist.sort();
  193.     cout << "---------/n";
  194.     linklist.display();
  195.     return 0;
  196. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值