c++模板連結串列實現
阿新 • • 發佈:2019-01-08
簡介:主要是利用模板實現連結串列的操作。模板的使用,使得程式的開發量大大地減少。
可以先定義一個連結串列LinkList,之後可以定義自己的類了(例如:Student類),使用時就可以這樣呼叫了
LinkList<Student> L;
下面便是連結串列的實現:
LinkList.cpp
student.cpptemplate<class Type> struct Node { Type data; struct Node *next; }; template<class Type> class LinkList { private: Node<Type> *head;//頭指標 public: LinkList(); int InsertLinkList(); Node<Type> *GetLinkList(int pos); int DelLinkList(int pos); void PrintLinkList(); ~LinkList(); }; //建立連結串列 template<class Type> LinkList<Type>::LinkList() { head = new Node<Type>; head->next = NULL; } //連結串列插入 頭插入 template<class Type> int LinkList<Type>::InsertLinkList() { Node<Type> *insertElement = new Node<Type>; insertElement->data.Input();//插入結點資料的輸入 insertElement->next = head->next; head->next = insertElement; return 1; } //取連結串列結點 template<class Type> Node<Type>* LinkList<Type>::GetLinkList(int pos) { Node<Type> *p = head; int point = 0; while ((p != NULL) && (point < pos)) { p = p->next; point++; } return point == pos ? p : NULL; } //列印連結串列結點 template<class Type> void LinkList<Type>::PrintLinkList() { Node<Type> *p; p = head->next; if (p == NULL) cout << "表空!" << endl; while (p) { // cout << p->data <<setw(2); p->data.Print(); p = p->next; } cout << endl; } //刪除連結串列結點 template<class Type> int LinkList<Type>::DelLinkList(int pos) { Node<Type> *p, *delElememt; int point = 1; p = GetLinkList(pos - 1); if (p == NULL) { cout << "position error!" << endl; return -1; } else if (p->next == NULL) { cout << "this position is not exist" << endl; return -1; } else { delElememt = p->next; p->next = delElememt->next; delete delElememt; return 1; } } template<class Type> LinkList<Type>::~LinkList() { Node<Type> *p, *cur; cur = head->next; while (1) { if (cur == NULL) break; else { p = cur; cur = cur->next; delete p; p = NULL; } } delete head; head = NULL; }
class Stu { private: char *name; int id; public: Stu(); Stu(char *na, int ID); ~Stu(); void Input(); void Print(); }; #if 1 Stu::Stu() { name = NULL; } Stu::Stu(char *na, int ID) { name = new char[strlen(na) + 1]; strcpy(name, na); id = ID; } Stu::~Stu() { delete[]name; } void Stu::Input() { cout << "please input name and ID of student" << endl; name = new char[20]; cin >> name >> id; } void Stu::Print() { cout << "student:" << id << " name: " << name << endl; } #endif
當真正使用的時候,只需要定義自己的類及其成員函式的實現,然後呼叫就ok了,很方便吧!void menu() { cout << "********************" << endl; cout << "1---------------插入" << endl; cout << "2---------------刪除" << endl; cout << "3---------------顯示" << endl; cout << "0---------------退出" << endl; cout << "********************" << endl; cout << "請選擇" << endl; } int main(void) { LinkList<Stu> L; //例如,就像這樣來呼叫 int choice; int m = 1; while (m) { menu(); cin >> choice; switch (choice) { case 1: { int ret = L.InsertLinkList(); if (ret == 1) { cout << "insert successful!" << endl; } else { cout << "insert failure!" << endl; } break; } case 2: { int pos; cout << "請輸入要刪除的位置!" << endl; cin >> pos; if (L.DelLinkList(pos) == 1) { cout << "delete successful!" << endl; } else { cout << "delete failure!" << endl; } break; } case 3: { cout << "資訊:" << endl; L.PrintLinkList(); break; } case 0: { m = 0; break; } default: { cout << "輸入錯誤,請重新輸入!" << endl; break; } } } system("pause"); return 0; }