这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » (C++版)链表(一)——实现单向链表创建、插入、删除等相关操作

共2条 1/1 1 跳转至

(C++版)链表(一)——实现单向链表创建、插入、删除等相关操作

高工
2018-01-27 20:18:59     打赏

 用C++实现链表操作,下面就直接上代码:


[cpp] view plain copy
  1. <span style="font-size:18px;">#include <iostream>  

  2. #include <stdlib.h>  

  3. using namespace std;  

  4.   

  5. //结点类  

  6. class Node {  

  7. public:  

  8.     int data;  

  9.     Node *pNext;  

  10. };  

  11.   

  12. //单向链表类  

  13. class LinkList {  

  14. public:  

  15.     LinkList() {  

  16.         //头结点不参与计数  

  17.         head = new Node;  

  18.         head->data = 0;  

  19.         head->pNext = NULL;  

  20.     }  

  21.     ~LinkList() { delete head; }  

  22.     void CreateLinkList(int n);             //创建链表  

  23.     void InsertNode(int position, int d);   //在指定位置插入结点  

  24.     void TraverseLinkList();                //遍历链表  

  25.     bool IsEmpty();                         //判断链表是否为空  

  26.     int GetLength();                        //链表长度  

  27.     void DeleteNode(int position);          //删除指定位置结点  

  28.     void DeleteLinkList();                  //删除整个链表  

  29. private:  

  30.     Node *head;  

  31. };  

  32.   

  33. void LinkList::CreateLinkList(int n) {  

  34.     if (n < 0) {  

  35.         cout << "输入结点个数错误!" << endl;  

  36.         exit(EXIT_FAILURE);  

  37.     }  

  38.     else {  

  39.         Node *pnew, *ptemp;  

  40.         ptemp = head;  

  41.         int i = n;    

  42.         while (n-- > 0) {  

  43.             pnew = new Node;  

  44.             cout << "输入第" << i - n << "个结点值:";  

  45.             cin >> pnew->data;  

  46.             pnew->pNext = NULL;  

  47.             ptemp->pNext = pnew;  

  48.             ptemp = pnew;     

  49.         }  

  50.     }  

  51. }  

  52. //postion从1开始计数,到链表长度加1结束,头结点后的结点称为第一个结点  

  53. void LinkList::InsertNode(int position, int d) {  

  54.     if (position < 0 || position > GetLength() + 1) {  

  55.         cout << "输入位置错误!" << endl;  

  56.         exit(EXIT_FAILURE);  

  57.     }  

  58.     else {  

  59.         Node *pnew, *ptemp;  

  60.         ptemp = head;  

  61.         pnew = new Node;  

  62.         pnew->data = d;  

  63.         pnew->pNext = NULL;  

  64.   

  65.         while (position-- > 1)  

  66.             ptemp = ptemp->pNext;  

  67.         pnew->pNext = ptemp->pNext;  

  68.         ptemp->pNext = pnew;  

  69.     }  

  70. }  

  71.   

  72. void LinkList::TraverseLinkList() {  

  73.     Node *p = head->pNext;   

  74.     while (p != NULL) {  

  75.         cout << p->data << " ";  

  76.         p = p->pNext;  

  77.     }  

  78.     cout << endl;  

  79. }  

  80.   

  81. bool LinkList::IsEmpty() {  

  82.     if (head->pNext == NULL)  

  83.         return true;  

  84.     else  

  85.         return false;  

  86. }  

  87.   

  88. int LinkList::GetLength() {  

  89.     Node *p = head->pNext;  

  90.     int n = 0;  

  91.     while (p != NULL) {  

  92.         n++;  

  93.         p = p->pNext;  

  94.     }  

  95.     return n;  

  96. }  

  97. //position只能从1开始到链表长度结束  

  98. void LinkList::DeleteNode(int position) {  

  99.     if (position < 0 || position > GetLength()) {  

  100.         cout << "输入位置错误!" << endl;  

  101.         exit(EXIT_FAILURE);  

  102.     }  

  103.     else {        

  104.         Node *ptemp = head, *pdelete;  

  105.         while (position-- > 1)  

  106.             ptemp = ptemp->pNext;  

  107.         pdelete = ptemp->pNext;  

  108.         ptemp->pNext = pdelete->pNext;  

  109.         delete pdelete;  

  110.         pdelete = NULL;  

  111.     }  

  112. }  

  113.   

  114. void LinkList::DeleteLinkList() {  

  115.     Node *pdelete = head->pNext, *ptemp;  

  116.     while(pdelete != NULL) {  

  117.         ptemp = pdelete->pNext;  

  118.         head->pNext = ptemp;  

  119.         delete pdelete;  

  120.         pdelete = ptemp;  

  121.     }  

  122. }  

  123.   

  124. //测试函数  

  125. int main() {  

  126.     LinkList l;  

  127.     int position = 0, value = 0, n = 0;  

  128.     bool flag = false;  

  129.   

  130.     cout << "请输入需要创建单向链表的结点个数:";  

  131.     cin >> n;  

  132.     l.CreateLinkList(n);  

  133.   

  134.     cout << "打印链表值如下:";  

  135.     l.TraverseLinkList();  

  136.   

  137.     cout << "请输入插入结点的位置和值:";  

  138.     cin >> position >> value;  

  139.     l.InsertNode(position, value);  

  140.       

  141.     cout << "打印链表值如下:";  

  142.     l.TraverseLinkList();  

  143.   

  144.     cout << "请输入要删除结点的位置:";  

  145.     cin >> position;  

  146.     l.DeleteNode(position);  

  147.   

  148.     cout << "打印链表值如下:";  

  149.     l.TraverseLinkList();  

  150.   

  151.     l.DeleteLinkList();  

  152.     flag = l.IsEmpty();  

  153.     if (flag)  

  154.         cout << "删除链表成功!" << endl;  

  155.     else  

  156.         cout << "删除链表失败!" << endl;  

  157.   

  158.     return 0;  

  159. }</span




专家
2018-01-28 10:56:30     打赏
2楼

不错,很经典的源码。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]