【資料結構】1-1 線性表
阿新 • • 發佈:2018-11-19
//單鏈表.cpp #include"LinkList.h" #include<iostream> template<class T> LinkList<T>::LinkList() { head = new Node<T>; head->link = NULL; } template<class T> void LinkList<T>::Clear() { if (head != NULL) { Node<T> *p; p = head->link;while (p != NULL) { Node<T> *del = p; p = p->link; delete del; } head=NULL; } } template<class T> LinkList<T>::LinkList(T data[], int mSize) { head = new Node<T>; head->data = data[0]; head->link = NULL; Node<T> *end = head; //頭結點建立並初始化完畢 for (int i = 1; i < mSize; i++) { Node<T> *p = new Node<T>; p->data = data[i]; p->link = NULL; end->link = p; end = p; } } template<class T> bool LinkList<T>::Insert(int pos, constT&x) { int cont = 1; Node<T> *p = head; bool flag = false; while (p != NULL&&cont<=pos-1) { if (cont == pos - 1) { Node<T> *add = new Node<T>; add->data = x; add->link = p->link; p->link = add; flag = true; break; } else { cont++; p = p->link; } } return flag; } template<class T> bool LinkList<T>::Remove(int pos, T&x) { int cont = 1; Node<T> *p = head; bool flag = false; while (p != NULL && cont <= pos - 1) { if (cont == pos - 1) { Node<T> *del = p->link; p->link = p->link->link; x=del->data; delete del; flag = true; break; } else { cont++; p = p->link; } } return flag; } template<class T> bool LinkList<T>::Replace(int pos, const T&x) { int cont = 1; Node<T> *p = head; bool flag = false; while (p != NULL && cont <= pos) { if (cont == pos) { p->data = x; flag = true; break; } else { cont++; p = p->link; } } return flag; } template<class T> int LinkList<T>::Length()const { int cont = 0; Node<T> *p = head; while (p != NULL) { cont++; p = p->link; } return cont; } template<class T> bool LinkList<T>::IsEmpty() const { return head == NULL; } template<class T> void LinkList<T>::Output() const { Node<T> *p = head; int cont = 0; while (p != NULL) { cout << p->data << " "; p = p->link; cont++; if (cont % 10 == 0) cout << endl; } cout << endl; } template<class T> bool LinkList<T>::search(const T&x) const { bool flag = false; Node<T> *p = head; while (p != NULL) { if (p->data == x) { flag = true; break; } p = p->link; } return flag; }
標頭檔案:
//LinkList.h #include<iostream> using namespace std; template<class T> struct Node //結點結構 { T data; //結點資料 Node*link; Node() { link = NULL; } Node(T e, Node *next = NULL) { data = e; link = next; } }; template<class T> class LinkList //帶表頭結點的單鏈表類 { private: Node<T> *head; //連結串列指標 public: LinkList(); //構造帶表頭結點的空單鏈表 LinkList(T data[], int mSize);//構造有mSize個元素的單鏈表 ~LinkList() { Clear(); } //解構函式 bool Insert(int pos, const T&x); //在單鏈表第pos個元素前插入元素x bool Remove(int pos, T&x); //刪除單鏈表第pos個元素 bool Replace(int pos, const T&x); //將修改單鏈表第pos個元素為x int Length()const; //求表長 bool IsEmpty() const; //判空操作 void Clear(); //清空操作 void Output() const; //輸出連結串列 bool search(const T&x) const;//查詢元素x在表中是否存在 };
測試程式碼:
//測試.cpp #include"單鏈表.cpp" #include<ctime> void menu()//模擬選單選項 { cout << "********************************************************" << endl; cout << "* 1 ------------輸出連結串列 *" << endl; cout << "* 2 ------------插入元素 *" << endl; cout << "* 3 ------------刪除元素 *" << endl; cout << "* 4 ------------銷燬連結串列 *" << endl; cout << "* 5 ------------查詢 *" << endl; cout << "* 0 ------------退出系統 *" << endl; cout << "********************************************************" << endl; } const int N = 20; int main() { srand((unsigned)time(NULL));//以系統當前時間初始化隨機數發生器 int data[N]; for (int i = 0; i < N; i++) data[i]=rand()%100;//用隨機數發生器產生100以內的整數 LinkList<int> L(data, N);//建立N個元素的單鏈表 menu(); while (1) //模擬選單工作方式 { int select; cout << "請輸入您的選擇:"; cin >> select; switch (select) { case 1: //輸出單鏈表 if (L.IsEmpty()) { cout << "連結串列為空!" << endl; } else L.Output(); break; case 2: //插入 int pos, elem; cout << "請輸入插入位置:"; cin >> pos; cout << "插入元素:"; cin >> elem; if (L.Insert(pos, elem)) //插入成功 cout << "在第" << pos << "個元素前成功插入" << elem << endl; else //插入失敗 cout << "插入位置不合法!" << endl; break; case 3: //刪除 cout << "請輸入刪除位置:"; cin >> pos; int x; if (L.Remove(pos, x))//刪除單鏈表的第pos個元素 cout << "單鏈表的第" << pos << "個元素" << x << "已被刪除。" << endl; else cout << "刪除位置不合法!" << endl; break; case 4: //銷燬連結串列 char OK; cout << "確定要銷燬連結串列嗎?(y/n)" << endl; cin >> OK; if (OK == 'y' || OK == 'Y') L.Clear(); break; case 5: //查詢 cout << "請輸入查詢元素:"; cin >> elem; if (L.search(elem)) cout << "查詢成功!" << endl; else cout << "查詢失敗!" << endl; break; case 0: //退出 exit(0); default: cout << "您輸入的選項有誤,請重新輸入:"; } } return 0; }
測試結果: