C++ 實現連結串列
阿新 • • 發佈:2018-11-08
轉載自: https://blog.csdn.net/starstar1992/article/details/59808706
#include <cstdlib> #include<iostream> using namespace std; typedef struct node{ int data; struct node* next; }NODE; class Linklist{ public: Linklist(){head = nullptr;} ~Linklist(); bool clearSqList(); bool isEmpty() {return head == nullptr;}; int Length(); bool GetElem(int i, int* e); int LocateElem(int e); bool PriorElem(int cur_e, int* pre_e); bool NextElem(int cur_e, int* next_e); bool Insert(int i, int e); bool Delete(int i, int* e); NODE* Reverse(); private: NODE* head; }; //清空函式 bool Linklist::clearSqList() { NODE *p = head; while(head){ p = head; head = head->next; delete(p); } return true; } //解構函式 Linklist::~Linklist() { NODE *p = head; while(head){ p = head; head = head->next; delete p; } } //獲取連結串列長度 int Linklist::Length() { NODE* p = head; //不能直接用head迴圈 int len = 0; while( p!= nullptr){ len++; p = p->next; } return len; } //獲取指定位置元素 bool Linklist::GetElem(int i, int *e) { //*e是返回的元素 int j = 0; NODE* p = head; while(j < i && p){ p = p->next; j++; } if (p == nullptr) return false; *e = p->data; return true; } //查詢元素位置 int Linklist::LocateElem(int e) { int loc = 0; NODE* p = head; while(p->data != e && p){ p = p->next; loc++; } if (p->data == e) return loc; else return -1; } //獲取前驅節點 bool Linklist::PriorElem(int cur_e, int *pre_e) { NODE* p = head; if (p->data == cur_e) return false; while(p->next->data != cur_e && p->next){ p = p->next; } if(p->next->data == cur_e) { *pre_e = p->data; return true; } else return false; } //獲取後繼節點 bool Linklist::NextElem(int cur_e, int *next_e) { NODE* p = head; if(head == nullptr || head->next == nullptr) return false; while(p->next != nullptr){ if(p->data == cur_e) { *next_e = p->next->data; return true; } else p = p->next; } return false; } bool Linklist::Insert(int i, int e) { NODE* p = head; NODE* s = head; int loc = 0; if(i == 0){ s = (NODE*)malloc(sizeof(NODE)); s->data = e; s->next = p; head = s; return true; } while(p && loc < i - 1){ p = p->next; loc++; } if(p == nullptr) return false; s = (NODE*)malloc(sizeof(NODE)); s->data = e; s->next = p->next; p->next = s; return true; } //刪除指定位置元素 bool Linklist::Delete(int i, int *e) { NODE* p = head; int loc = 0; if(i == 0){ *e = head->data; head = head->next; delete p; p = nullptr; return true; } while( p && loc < i-1){ loc++; p = p->next; } if(p == nullptr) return false; NODE* s; s = p->next; p->next = p->next->next; *e = s->data; delete s; s = NULL; return true; return false; } //反轉連結串列 NODE *Linklist::Reverse() { if(head == nullptr || head->next == nullptr) return head; NODE *p = head, *q = head->next, *r; head->next = nullptr; while(q){ r = q->next; q->next = p; p = q; q = r; } head = p; return head; } int main() { int a = 0; int *p = &a; Linklist li; li.Insert(0, 5); li.Insert(1, 4); li.Insert(2, 12); li.Insert(3, 5); li.Insert(3, 6); li.Insert(1, 7); cout <<"連結串列長度"<< li.Length()<<endl; cout << "各個元素的值是: "; for (int i = 0;i < li.Length();i++)//遍歷該連結串列 { if (li.GetElem(i, p)) cout << *p<<" "; } cout << endl; cout << "反轉後各個元素的值是: "; NODE* re_li=li.Reverse(); while (re_li) { cout << re_li->data << " "; re_li = re_li->next; } cout << endl; }