队列类链式存储
代码:
linkqueue.hpp
main.cpp
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 // 队列类测试程序 #include <iostream> #include <cstdio> #include "linkqueue.hpp" using namespace std; struct Student { char name[32]; int age; }; void play() { Student s1, s2, s3; s1.age = 21; s2.age = 22; s3.age = 23; LinkQueue<Student> lq; // 创建队列 lq.append(s1); // 入队列 lq.append(s2); lq.append(s3); Student tmp; lq.header(tmp); cout << "header of queue: " << tmp.age << endl; cout << "length of queue: " << lq.length() << endl; while (lq.length() > 0) { lq.retieve(tmp); cout << tmp.age << " "; } cout << endl; lq.clear(); } int main() { play(); return 0; }
栈类链式存储
linkstack.hpp
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 // 栈类 #pragma once #include "linklist.hpp" template <typename T> class LinkStack { public: LinkStack(); ~LinkStack(); public: int clear(); int push(T &t); int pop(T &t); int top(T &t); int size(); protected: LinkList<T> *m_list; }; template <typename T> LinkStack<T>::LinkStack() { m_list = new LinkList < T > ; } template <typename T> LinkStack<T>::~LinkStack() { clear(); delete m_list; m_list = NULL; } template <typename T> int LinkStack<T>::clear() { T t; while (m_list->getLen() > 0) { m_list->del(0, t); } return 0; } template <typename T> int LinkStack<T>::push(T &t) { return m_list->insert(t, 0); } template <typename T> int LinkStack<T>::pop(T &t) { return m_list->del(0, t); } template <typename T> int LinkStack<T>::top(T &t) { return m_list->get(0, t); } template <typename T> int LinkStack<T>::size() { return m_list->getLen(); }main.cpp
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 // 链式存储栈类的测试程序 #include <iostream> #include <cstdio> #include "linkstack.hpp" using namespace std; struct Student { char name[32]; int age; }; void play() { Student s1, s2, s3; s1.age = 21; s2.age = 22; s3.age = 23; LinkStack<Student> ls; // 创建栈 // 入栈 ls.push(s1); ls.push(s2); ls.push(s3); // 获取栈顶元素 Student tmp; ls.top(tmp); cout << "top of stack: " << tmp.age << endl; cout << "size of stack: " << ls.size() << endl; // 出栈 while (ls.size() > 0) { ls.pop(tmp); } ls.clear(); } int main() { play(); return 0; }linklist.h
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 // 链表类 #pragma once #include <iostream> #include <cstdio> using namespace std; template <typename T> struct Node { T t; Node<T> *next; }; template <typename T> class LinkList { public: LinkList(); ~LinkList(); public: int clear(); int insert(T &t, int pos); int get(int pos, T &t); int del(int pos, T &t); int getLen(); protected: Node<T> *header; int length; }; template <typename T> LinkList<T>::LinkList() { header = new Node < T > ; header->next = NULL; length = 0; } template <typename T> LinkList<T>::~LinkList() { Node<T> *tmp = NULL; while (header) { tmp = header->next; delete header; header = tmp; } } template <typename T> int LinkList<T>::clear() { ~LinkList(); LinkList(); return 0; } template <typename T> int LinkList<T>::insert(T &t, int pos) { Node<T> *cur = NULL; // 对pos的容错处理 if (pos >= length) { pos = length; } cur = header; for (int i = 0; i < pos; ++i) { cur = cur->next; } // 把上层应用的t结点缓存到容器中 Node<T> *node = new Node < T > ; node->next = NULL; node->t = t; // 把t缓存到容器中 node->next = cur->next; cur->next = node; ++length; return 0; } template <typename T> int LinkList<T>::get(int pos, T &t) { Node<T> *cur = NULL; if (pos >= length) { return -1; } cur = header; for (int i = 0; i < pos; ++i) { cur = cur->next; } t = cur->next->t; // 把pos位置的结点赋值给t return 0; } template <typename T> int LinkList<T>::del(int pos, T &t) { Node<T> *cur = NULL; if (pos >= length) { return -1; } cur = header; for (int i = 0; i < pos; ++i) { cur = cur->next; } Node<T> *ret = NULL; ret = cur->next; t = ret->t; // 把缓存的结点给上层应用t // 删除操作 cur->next = ret->next; --length; delete ret; // 注意释放内存,因为insert的时候new Node<T> return 0; } template <typename T> int LinkList<T>::getLen() { return length; }