找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2461|回复: 0

【C++】C++模板实现的单向链表

[复制链接]
发表于 2014-12-8 18:03:32 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

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

×
C++模板实现的单向链表,实现了链表的初始化创建,元素插入,元素链表末尾添加,元素删除,链表清空
Lists.h
  1. //Lists.h
  2. #ifndef DDXXLISTS_H
  3. #define DDXXLISTS_H
  4. #include <iostream>
  5. using namespace std;
  6. template<typename Type>
  7. class Lists
  8. {
  9. public:
  10.         Lists();
  11.         Lists(int nSize);
  12.         ~Lists();
  13. public:
  14.         struct Node
  15.         {
  16.                 Type  e;
  17.                 Node* next;
  18.                 Node()
  19.                 {
  20.                 }
  21.                 Node(Type _e)
  22.                 {
  23.                         e = _e;
  24.                         next = NULL;
  25.                 }
  26.         };
  27. public:
  28.         bool insert(Type e,int pos);
  29.         bool add(Type e);
  30.         bool erase(int pos);
  31.         void clear();
  32.         bool isEmpty();
  33.         int getLength();
  34.         void print();
  35. private:
  36.         Node* m_head;
  37.         int m_nLength;
  38. };

  39. template<typename Type> Lists<Type>::Lists()
  40. {
  41.         Node *pPos = new Node;
  42.         pPos->next = NULL;
  43.         m_head = pPos;
  44.         m_nLength = 0;
  45. }

  46. template<typename Type> Lists<Type>::Lists(int nSize)
  47. {
  48.         m_nLength = nSize;
  49.         Node *pPos = new Node;
  50.         pPos->next = NULL;
  51.         m_head = pPos;
  52.         m_nLength = nSize;
  53.        
  54.         for (int i=0;i<m_nLength;i++)
  55.         {
  56.                 pPos->next = new Node;
  57.                 pPos = pPos->next;
  58.         }
  59. }

  60. template<typename Type> bool Lists<Type>::insert(Type e,int pos)
  61. {
  62.         if (pos >= m_nLength)
  63.         {
  64.                 cout<<"The position to insert out of range"<<endl;
  65.                 return false;
  66.         }
  67.         else
  68.         {
  69.                 Node *ptr = m_head;
  70.                 int cnt = 0;
  71.                 while(cnt <= pos)
  72.                 {
  73.                         ptr = ptr->next;
  74.                         cnt++;
  75.                 }
  76.                 Node *pNew = new Node(e);
  77.                 pNew->next = ptr->next;
  78.                 ptr->next = pNew;

  79.                 m_nLength++;
  80.                 return true;
  81.         }
  82. }

  83. template<typename Type> bool Lists<Type>::add(Type e)
  84. {
  85.         Node *pNew = new Node(e);
  86.         if (pNew == NULL)
  87.         {
  88.                 cout<<"allocate memory for new node failed"<<endl;
  89.                 return false;
  90.         }
  91.         else
  92.         {
  93.                 Node *ptr = m_head;
  94.                 while(ptr->next != NULL)
  95.                 {
  96.                         ptr = ptr->next;
  97.                 }
  98.                 ptr->next = pNew;
  99.                 pNew->next = NULL;
  100.                 m_nLength++;
  101.                 return true;
  102.         }
  103. }

  104. template<typename Type> bool  Lists<Type>::erase(int pos)
  105. {
  106.         if (pos >= m_nLength)
  107.         {
  108.                 cout<<"The position to delete out of range"<<endl;
  109.                 return false;
  110.         }
  111.         else
  112.         {
  113.                 Node *ptr = m_head;
  114.                 int i = 0;
  115.                 while( i<pos )
  116.                 {
  117.                         ptr = ptr->next;
  118.                         i++;
  119.                 }
  120.                 Node *pdel = ptr->next;
  121.                 ptr->next = ptr->next->next;
  122.                 delete pdel;
  123.                 pdel = NULL;
  124.                 m_nLength--;

  125.                 return true;
  126.         }
  127. }

  128. template<typename Type> void Lists<Type>::print()
  129. {
  130.         if(m_nLength ==0)
  131.                 cout<<"The list is empty"<<endl;
  132.         Node *ptr = m_head;
  133.         while(ptr->next!= NULL)
  134.         {
  135.                 ptr = ptr->next;
  136.                 cout<<"element value:"<<ptr->e<<endl;
  137.         }
  138. }

  139. template<typename Type> int Lists<Type>::getLength()
  140. {
  141.         return m_nLength;
  142. }
  143. template<typename Type> bool Lists<Type>::isEmpty()
  144. {
  145.         return m_head->next == NULL;
  146. }

  147. template<typename Type> void Lists<Type>::clear()
  148. {
  149.         Node *ptr = m_head->next;
  150.         Node *ptmp = NULL;
  151.         while(ptr != NULL)
  152.         {
  153.                 ptmp = ptr;
  154.                 ptr = ptr->next;
  155.                 delete ptmp;
  156.                 ptmp = NULL;
  157.                 m_nLength--;
  158.         }
  159.         m_head->next = NULL;

  160. }
  161. template<typename Type> Lists<Type>::~Lists()
  162. {
  163.         Node *ptr = m_head;
  164.         Node *ptmp = NULL;
  165.         while(ptr->next != NULL)
  166.         {
  167.                 ptmp = ptr;
  168.                 ptr = ptr->next;
  169.                 delete ptmp;
  170.                 ptmp = NULL;
  171.         }
  172.         delete ptr;
  173.         ptr = NULL;
  174. }
  175. #endif
复制代码
main.cpp
  1. //main.cpp
  2. #include <iostream>
  3. #include "Lists.h"
  4. using namespace std;
  5. void main()
  6. {
  7.         cout<<"*************************Test list init***************************"<<endl;
  8.         Lists<int> Lisa;
  9.         cout<<"List's length is:"<<Lisa.getLength()<<endl;
  10.         cout<<"List is empty:"<<Lisa.isEmpty()<<endl;

  11.         cout<<"*************************Test list add element********************"<<endl;
  12.         Lisa.add(1);
  13.         Lisa.add(2);
  14.         Lisa.add(3);
  15.         Lisa.add(4);
  16.         Lisa.add(5);
  17.         Lisa.print();
  18.         cout<<"List's length is:"<<Lisa.getLength()<<endl;
  19.         cout<<"List is empty:"<<Lisa.isEmpty()<<endl;

  20.         cout<<"*************************Test list insert*************************"<<endl;
  21.         Lisa.insert(-1,0);
  22.         Lisa.insert(11,2);
  23.         Lisa.insert(100,6);
  24.         Lisa.print();
  25.         cout<<"List's length is:"<<Lisa.getLength()<<endl;
  26.         cout<<"List is empty:"<<Lisa.isEmpty()<<endl;

  27.         cout<<"*************************Test list erase**************************"<<endl;
  28.         Lisa.erase(0);
  29.         Lisa.erase(2);
  30.         Lisa.erase(5);
  31.         Lisa.print();
  32.         cout<<"List's length is:"<<Lisa.getLength()<<endl;
  33.         cout<<"List is empty:"<<Lisa.isEmpty()<<endl;

  34.         cout<<"*************************Test list clear**************************"<<endl;
  35.         Lisa.clear();
  36.         Lisa.print();
  37.         cout<<"List's length is:"<<Lisa.getLength()<<endl;
  38.         cout<<"List is empty:"<<Lisa.isEmpty()<<endl;
  39. }
复制代码
程序运行结果:
1.png
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-23 21:41 , Processed in 0.033423 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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