整个数据结构分为三个部分,Node类,LinkList类,SeqList类,Main函数,其中Main函数是测试两种链表的代码书写是否成立,LinkList类中的每个结点都是一个Node的实例,SeqList类单独成一例,用数组存储,已经写成模板的形式,我忘了以前不知道在哪里看过说用类模板的时候不能够将声明单独出来放在头文件中,所以我把声明和实现放在一起了。
Node.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
| template<typename T> class Node { public: Node() {} Node(T data, Node<T> *ptr) :data(data), next(ptr) {} ~Node() {} T getData(); void setData(T newData); Node<T> *getNext(); void setNext(Node<T> *ptr); private: T data; Node<T> *next; }; template<typename T> T Node<T>::getData() { return data; } template<typename T> void Node<T>::setData(T newData) { data = newData; } template<typename T> Node<T> *Node<T>::getNext() { return next; } template<typename T> void Node<T>::setNext(Node<T> *ptr) { next = ptr; }
|
LinkList.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 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 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
| #include<iostream> #include"Node.cpp" template<typename T> class LinkList { public: LinkList(); LinkList(T array[], int n); ~LinkList(); void printList(); void Insert(int i, T x); int Length(); T Get(int i); Node<T> *getFirst() { return first; }; int Locate(T x); T Delete(int i); void reverse(); void add(T x); private: Node<T> *first; }; template<typename T> LinkList<T>::LinkList() { first = new Node<T>(); first->setNext(NULL); } template<typename T> LinkList<T>::LinkList(T array[], int n) { first = new Node<T>(); first->setNext(NULL); Node<T> *s, *r; r = first; for (int i = 0; i < n; i++) { s = new Node<T>; s->setData(array[i]); r->setNext(s); r = s; } } template<typename T> LinkList<T>::~LinkList() { while (first != NULL) { Node<T> *q = first; first = first->getNext(); delete q; } } template<typename T> void LinkList<T>::printList() { Node<T> *p = first->getNext(); while (p != NULL) { cout << p->getData() << " "; p = p->getNext(); } cout << endl; } template<typename T> void LinkList<T>::Insert(int index, T x) { Node<T> *p = first; Node<T> *s; int count = 0; while (p != NULL && count < index - 1) { p = p->getNext(); count++; } if (p == NULL) { throw "在插入的位置前面有空结点,不能在所需序号处插入结点!"; } else { s = new Node<T>; s->setData(x); s->setNext(p->getNext()); p->setNext(s); } } template<typename T> int LinkList<T>::Length() { int count = 0; Node<T> *p = first->getNext(); while (p != NULL) { count++; p = p->getNext(); } return count; } template<typename T> T LinkList<T>::Get(int index) { Node<T> *p = first->getNext(); int count = 1; while (p != NULL && count < index) { p = p->getNext(); count++; } if (p == NULL) { throw "该位置为空结点!"; } else { return p->getData(); } } template<typename T> int LinkList<T>::Locate(T x) { Node<T> *p = first->getNext(); int count = 1; while (p != NULL) { if (p->getData() == x) { return count; } p = p->getNext(); count++; } return 0; } template<typename T> T LinkList<T>::Delete(int index) { Node<T> *p = first; int count = 0; while (p != NULL && count < index - 1) { p = p->getNext(); count++; } if (p == NULL || p->getNext() == NULL) { throw "被删的结点不存在!"; } else { Node<T> *q = p->getNext(); T x = q->getData(); p->setNext(q->getNext()); delete q; return x; } } template<typename T> void LinkList<T>::reverse() { Node<T> *p = first; Node<T> *q = p->getNext(); Node<T> *r; while (q->getNext() != NULL) { r = q->getNext(); if (q == first->getNext()) { q->setNext(NULL); p = q; q = r; } else { q->setNext(p); p = q; q = r; } } q->setNext(p); first->setNext(q); } template<typename T> void LinkList<T>::add(T x) { int length = Length(); Insert(length+1, x); }
|
SeqList.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 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
| #include<iostream> const int MaxSize = 10; template<typename T> class SeqList { public: SeqList() { length = 0; } SeqList(T array[], int n); ~SeqList() {} int Length() { return length; } T Get(int index); int Locate(T x); void Insert(int index, T x); T Delete(int index); void PrintList(); void reverse(); private: T data[MaxSize]; int length; }; template<typename T> SeqList<T>::SeqList(T array[], int n) { if (n > MaxSize) { throw "数组的长度大于顺序表的长度!"; } else { for (int i = 0; i < n; i++) { data[i] = array[i]; } length = n; } } template<typename T> T SeqList<T>::Get(int index) { if (index < 1 || index > length) { throw "索引值不正确!"; } else { return data[index - 1]; } } template<typename T> int SeqList<T>::Locate(T x) { for (int i = 0; i < length; i++) { if (data[i] == x) { return i + 1; } } return 0; } template<typename T> void SeqList<T>::Insert(int index, T x) { if (length >= MaxSize) { throw"顺序表已满!"; } else if (index < 1 || index > length + 1) { throw"索引值超出当前已有数据位置!"; } else { for (int j = length; j >= index; j--) { data[j] = data[j - 1]; } data[index - 1] = x; length++; } } template<typename T> T SeqList<T>::Delete(int index) { if (length == 0) { throw "顺序表长度为0!"; } else if(index < 1 || index > length) { throw"索引表超出当前已有数据位置!"; } else { T x = data[index - 1]; for (int j = index; j < length; j++) { data[j - 1] = data[j]; } length--; return x; } } template<typename T> void SeqList<T>::PrintList() { for (int i = 0; i < length; i++) { cout << data[i] << " "; } cout << endl; } template<typename T> void SeqList<T>::reverse() { for (int i = 0; i < length / 2 + 1; i++) { T temp = data[i]; data[i] = data[length - 1 - i]; data[length - 1 - i] = temp; } }
|
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 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
| #include"LinkList.cpp" #include"SeqList.cpp" using namespace std; 单链表main函数 */ int main() { int array1[] = { 1,3,5,7,9,10,12,14,16,18,20 }; int array2[] = { 2,4,6,8,11,13,15,16,17,19,20 }; LinkList<int> List1(array1, 11); List1.printList(); LinkList<int> List2(array2, 11); List2.printList(); system("pause"); return 0; } 顺序表main函数 */
|