鱼C论坛

 找回密码
 立即注册
查看: 920|回复: 0

[技术交流] 用C++实现了一个链表类,附上可执行代码

[复制链接]
发表于 2020-8-10 21:29:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 爱学习520 于 2020-8-10 21:33 编辑

上午发了一个Vector类,昨天做了一天,即可动态扩容的数组,今天做了一个链表,刚刚写完链表类,附上链表类的代码和main的测试案例,有什么可以优化的地方欢迎提出来,共同进步。明天接着写,争取把二叉搜索树写完

链表LinkList类
  1. #include<iostream>
  2. using namespace std;

  3. #define    Index_Error     -1    //索引错误

  4. template<class T_ELE>
  5. class LinkList
  6. {
  7. //私有结构体、函数
  8. private:
  9.         typedef struct Node
  10.         {
  11.                 T_ELE data;
  12.                 struct Node* pNext;
  13.         }NODE,*PNODE;

  14.         //以下的索引都是从1开始的,而非0
  15.         PNODE GetIndexPreviousNode(int index)
  16.         {
  17.                 PNODE p = pHead->pNext;
  18.                 //因为下面的for循环是考虑index从2开始的,所以这里考虑只有一个结点的情况
  19.                 if (index == 1)
  20.                         return pHead;
  21.                 for (int i = 0; i < index -2; i++)
  22.                         p = p->pNext;
  23.                 return p;
  24.         }
  25.         PNODE GetIndexCurrentNode(int index)
  26.         {
  27.                 PNODE p = pHead->pNext;
  28.                 for (int i = 0; i < index - 1; i++)
  29.                         p = p->pNext;
  30.                 return p;
  31.         }       
  32.         PNODE GetIndexNectNode(int index)
  33.         {
  34.                 PNODE p = pHead->pNext;
  35.                 for (int i = 0; i < index ; i++)
  36.                         p = p->pNext;
  37.                 return p;
  38.         }

  39. //私有成员
  40. private:
  41.         PNODE pHead;
  42.         PNODE pTail;
  43.         int Length;

  44. //构造、析构函数
  45. public:
  46.         LinkList() :pHead (nullptr),pTail(nullptr),Length(0)
  47.         {
  48.                 //申请一块空的节点,仅作为后续使用方便
  49.                 pHead =pTail= new NODE;
  50.                 pHead->pNext = nullptr;
  51.                 pTail->pNext = nullptr;
  52.         }

  53.         ~LinkList()
  54.         {
  55.                 Clear();
  56.         }

  57. //链表类的函数功能
  58. public:
  59.         //向当前链表插入元素
  60.         void Insert(T_ELE Element)
  61.         {
  62.                 //申请新空间,存放元素
  63.                 PNODE cur = new NODE;
  64.                 cur->data = Element;
  65.                 //将新节点连接到之前的结点上
  66.                 pTail->pNext = cur;
  67.                 cur->pNext = nullptr;
  68.                 //修改类成员其他对应的参数
  69.                 pTail = cur;
  70.                 Length++;       
  71.         }

  72.         //向指定索引的位置插入元素
  73.         int Insert(int index,T_ELE Element)
  74.         {
  75.                 //判断是否在正确区间
  76.                 if (index<1 || index>Length + 1)
  77.                 {
  78.                         cout << index << "不在该链表区域,插入失败!!!" << endl;
  79.                         return Index_Error;
  80.                 }
  81.                        
  82.                 //新申请一块空间
  83.                 PNODE pNew=new NODE;
  84.                 pNew->data = Element;
  85.                 //插入操作
  86.                 PNODE temp = GetIndexPreviousNode(index)->pNext;
  87.                 GetIndexPreviousNode(index)->pNext=pNew;
  88.                 pNew->pNext = temp;
  89.                 //其他对应的成员值的修改
  90.                 Length++;
  91.         }
  92.         //向指定索引位置删除元素
  93.         int Delete(int index)
  94.         {
  95.                 //判断删除区间是否有误
  96.                 if (index<1 || index>Length)
  97.                 {
  98.                         cout << index << "不在链表区域,删除失败!!!" << endl;
  99.                         return -1;
  100.                 }
  101.                 //删除操作
  102.                 PNODE temp = GetIndexPreviousNode(index)->pNext;
  103.                 GetIndexPreviousNode(index)->pNext = GetIndexPreviousNode(index)->pNext->pNext;
  104.                 delete temp;
  105.                 //修改类成员对应的值
  106.                 Length--;

  107.                        
  108.         }
  109.         //判断链表是否为空
  110.         bool IsEmpty()
  111.         {
  112.                 if (pHead->pNect == nullptr)
  113.                 {
  114.                         cout << "链表为空" << endl;
  115.                         return false;
  116.                 }
  117.                 return true;
  118.         }
  119.         //清除链表
  120.         void Clear()
  121.         {
  122.                 PNODE p= pHead->pNext;
  123.                 for (int i = 0; i < Length; i++)
  124.                 {
  125.                         PNODE temp = p->pNext;
  126.                         delete p;
  127.                         p = temp;
  128.                 }
  129.                 //修改对应的成员变量值
  130.                 Length = 0;
  131.         }
  132.         //遍历链表

  133.         void Traverse()
  134.         {
  135.                 PNODE p=pHead->pNext;
  136.                 for(int i=0;i<Length;i++,p=p->pNext)
  137.                 cout << p->data << endl;
  138.         }

  139. };
复制代码


main测试LinkList类,测试用例
  1. #include "LinkList.cpp"

  2. //测试LinkList
  3. int main()
  4. {
  5.     LinkList<int> p;
  6.     p.Insert(1);
  7.     p.Insert(2);
  8.     p.Insert(3);
  9.     p.Insert(4);
  10.     p.Insert(5);
  11.     p.Insert(6);
  12.     p.Insert(7);

  13.     //插入测试,以下每行分开测试,不然链表长度增加后失去测试效果
  14.     cout << "插入测试开始......" << endl;
  15.     //p.Insert(0, 520);
  16.     //p.Insert(1, 520);
  17.     //p.Insert(4, 520);
  18.     //p.Insert(8, 520);
  19.     //p.Insert(9, 520);

  20.     //测试删除
  21.     //p.Delete(0);
  22.     //p.Delete(1);
  23.     //p.Delete(4);
  24.     //p.Delete(7);
  25.     //p.Delete(8);
  26.         
  27.     p.Traverse();
  28.    
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 17:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表