码迷,mamicode.com
首页 > 其他好文 > 详细

【Weiss】【第03章】链表例程

时间:2015-03-11 07:04:04      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

这种基础例程,如之前所提,会有一个实现和一个简单的测试代码。

链表其实没什么可说的,其实包括后面的栈和队列也没什么可说的,直接放代码吧。

下面这个是测试代码

技术分享
 1 #include <iostream>
 2 #include "linklist.cpp"
 3 using namespace std;
 4 using namespace linklist;
 5 template class List<int>;
 6 int main(void)
 7 {
 8     List<int> number;
 9 
10     //测试插入
11     cout << "/*additem()*/" << endl;
12     number.additem(2);
13     number.additem(3);
14     number.additem(5);
15     number.additem(7);
16     number.additem(11);
17     number.traverse();
18     cout << "\n/*end*/\n\n"<< flush;
19 
20     //测试获取长度
21     cout << "/*length()*/" << endl;
22     cout << number.size() << endl;
23     cout << "/*end*/\n\n" << flush;
24 
25     //测试获得头元素
26     cout << "/*getfirst()*/" << endl;
27     cout << number.getfirst() << endl;
28     cout << "/*end*/\n\n" << flush;
29 
30     //测试删除存在的元素
31     cout << "/*remove()*/" << endl;
32     number.remove(5);
33     number.traverse();
34     cout << "\n/*end*/\n\n" << flush;
35 
36     //测试删除不存在的元素
37     cout << "/*remove()*/" << endl;
38     number.remove(13);
39     cout << "/*end*/\n\n" << flush;
40 
41     //测试清空,并测试从空表中删除元素
42     cout << "/*clear(),remove()*/" << endl;
43     number.clear();
44     number.remove(2);
45     cout << "/*end*/\n\n" << flush;
46 
47     system("pause");
48 }
linklist_driver

 

主体

  1 #include <iostream>
  2 using namespace std;
  3 #ifndef LINKLIST
  4 #define LINKLIST
  5 
  6 namespace linklist
  7 {
  8 
  9 //链表节点模板
 10 template <typename T> struct Node
 11 {
 12     Node<T>() : next(nullptr){}
 13     Node<T>(const T &item, Node<T>* ptr = nullptr) : data(item), next(ptr){}
 14     T data;
 15     Node<T>* next;
 16 };
 17 //头节点及链表主体操作
 18 template <typename T> class List
 19 {
 20 //构造函数
 21 public:
 22     List<T>() : length(0), front(nullptr){}
 23 //接口
 24 public:
 25     //返回长度
 26     unsigned int size()const{ return length; }
 27     //返回头指针
 28     Node<T>* begin()const{ return front; }
 29     //判断是否为空
 30     bool empty()const{ return length == 0; }
 31     //获得头元素
 32     T getfirst()const{ return front->data; }
 33     //#查找元素所在地址
 34     Node<T>* find(const T &item)const;
 35     //#尾部加入新元素
 36     bool additem(const T &item);
 37     //#删除指定元素
 38     bool remove(const T &item);
 39     //#遍历并输出链表元素
 40     void traverse()const;
 41     //清空链表
 42     void clear();
 43 
 44 //辅助函数
 45 private:
 46     //#查找元素前驱
 47     Node<T>* find_prev(const T& item)const;
 48 //数据
 49 private:
 50     unsigned int length;
 51     Node<T>* front;
 52 };
 53 
 54 //如果元素为头元素或元素不存在则返回nullptr,否则返回前驱
 55 template <typename T> Node<T>* List<T>::find_prev(const T& item)const
 56 {
 57     if (length == 0)
 58         return nullptr;
 59     if (front->data == item)
 60         return nullptr;
 61     for (Node<T>* iter = front; iter->next != nullptr; iter = iter->next)
 62     {
 63         if (iter->next->data == item)
 64             return iter;
 65     }
 66     return nullptr;
 67 }
 68 //调用find_prev,如果元素存在则返回地址,不存在则返回nullptr
 69 template <typename T> Node<T>* List<T>::find(const T &item)const
 70 {
 71     Node<T>* iter = find_prev(item);
 72     if (length == 0)
 73         return nullptr;
 74     if (front->data == item)
 75         return front;
 76     return iter->next;
 77 }
 78 template <typename T> bool List<T>::additem(const T &item)
 79 {
 80     Node<T>* pnew = new Node<T>(item);
 81     if (length == 0)
 82         front = pnew;
 83     else
 84     {
 85         Node<T>* iter = front;
 86         while (iter->next != nullptr)
 87             iter = iter->next;
 88         iter->next = pnew;
 89     }
 90     ++length;
 91     return true;
 92 }
 93 template <typename T> bool List<T>::remove(const T &item)
 94 {
 95     if (length == 0)                    //先判断链表是否空避免front->data未定义
 96     {
 97         cout << "No data!" << endl;
 98         return false;
 99     }
100     Node<T>* iter = find_prev(item);
101     if (iter == nullptr && front->data != item)
102     {
103         cout << "Can not find!" << endl;
104         return false;
105     }
106     Node<T>* save;
107     if (front->data == item)
108     {
109         save = front;
110         front = front->next;
111         free(save);
112     }
113     else
114     {
115         save = iter->next;
116         iter->next = iter->next->next;
117         free(save);
118     }
119     --length;
120     return true;
121 }
122 template <typename T> void List<T>::traverse()const
123 {
124     if (length != 0)
125     {
126         for (Node<T>* iter = front; iter != nullptr; iter = iter->next)
127             cout << iter->data << ends;
128     }
129 }
130 template <typename T> void List<T>::clear()
131 {
132     Node<T>* iter;
133     while (front != nullptr)
134     {
135         iter = front;
136         front = front->next;
137         delete iter;
138     }
139     front = nullptr;
140     length = 0;
141 }
142 }
143 #endif

 

【Weiss】【第03章】链表例程

标签:

原文地址:http://www.cnblogs.com/catnip/p/4328889.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!