理论基础 —— 线性表 —— 双向链表
生活随笔
收集整理的這篇文章主要介紹了
理论基础 —— 线性表 —— 双向链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【實現類】
template <class T> struct Node{//結點T data;//數據域Node *llink;//左指針Node *rlink;//右指針 };template <class T> class doubleList{ private:Node<T> *first;//頭指針 public:doubleList();//無參構造函數doubleList();//有參構造函數~doubleList();//析構函數void insertElement(T x);//在雙鏈表中插入值為x的元素T deleteElement(T x);//刪除雙鏈表中值為x的元素void Sort(int len);//冒泡排序void print();//按序號依次輸出雙鏈表各元素 };【構造函數】
1.無參構造函數
對于無參構造函數,只需建一個頭結點,令其左右指針分別為空即可
template <class T> linkList<T>::doubleLink(){//無參構造函數first=new Node<T>;//頭指針指向頭結點first->llink=NULL;//左指針為空first->rlink=NULL;//右指針為空 }2.有參構造函數
1)頭插法
template <class T> linkList<T>::doubleLink(T a[],int n){first=new Node;//頭指針指向頭結點first->llink=NULL;//左指針為空first->rlink=NULL;//右指針為空Node *s;//新結點for(int i=1;i<=n;i++){s=new Node;s->data=a[i];//數據域s->rlink=first->rlink;first->rlink=s;s->llink=first;if(s->rlink!=NULL)//下個結點不為空s->rlink->llink=s;//下一個節點指向自己} }2)尾插法?
template <class T> linkList<T>::doubleLink(T a[],int n){first=new Node<T>;//頭指針指向頭結點Node *r=first;//尾指針first->llink=NULL;//左指針為空first->rlink=NULL;//右指針為空Node<T> *s;//新結點for(int i=0;i<n;i++){s=new Node<T>;s->data=a[i];//數據域r->rlink=s;s->llink=r;r=s;}r->rlink=NULL; }【析構函數】
對于析構函數,與單鏈表的析構函數相同,僅需使用右指針 rlink 不斷指向下一結點,釋放存儲空間即可
template <class T> doubleLink<T>::~doubleLink(){Node<T> *p,*q;//工作指針p=first;//從頭開始while(p!=NULL){q=p->rlink;//指向下一結點delete p;//釋放當前結點空間p=q;//令當前節點指向下一結點} }【插入】
在雙向鏈表中插入一個結點,對指針的操作順序有很多,但由于雙向鏈表實質上可看作兩條反向的單鏈表,所以插入操作的核心是:先處理每個方向的遠端指針,再處理近端指針
原則上,插入一個結點需要連接 4 個指針,但考慮插入時的特殊情況,即在空表或表尾插入一個結點時,新結點的右指針指向為空,此時只需連接 3 個指針
void doubleList<T>:: insertElement(T x){//在雙表中插入值為x的元素Node<T> *s=new Node<T>;//新結點s->data=x;//新結點數據域賦值為xs->rlink=p->rlink;//新結點s的右指針指向工作結點p之后的結點s->llink=p;//新結點s的左指針指向工作結點pp->rlink=s;//工作結點p的右指針指向新結點sif(s->rlink!=NULL)//不為表尾或空時s->rlink->llink=s;//新結點s的右指針的左指針指向新結點s }【刪除】
對于刪除操作,其與插入操作相似,在刪除時需要判斷是否為表尾結點
bool doubleList<T>::deleteElement(T x){//刪除雙鏈表中值為x的元素Node<T> *p;//工作指針p=first->rlink;while(p!=NULL){if(p->data==x){if(p->rlink==NULL)//p為表尾元素p->llink->rlink=NULL;else{//p不為表尾元素p->llink->rlink=p->rlink;p->rlink->llink=p->llink;}delete p;//釋放空間return true;//刪除成功}p=p->rlink;}return false;//刪除失敗 }【冒泡排序】
int doubleList<T>::void Sort(int len){//冒泡排序Node<T> *p;//工作指針for(int i=0;i<len-1;i++){//len-1輪p=first->rlink;for(int j=0;j<len-i-1;j++){//len-i次T tempA=p->data;//當前數據T tempB=p->rlink->data;//下一結點數據if(tempA>tempB){//比較T temp=p->data;p->data=p->rlink->data;p->rlink->data=temp;}p=p->rlink;//指向下一結點}} }【輸出】
雙鏈表的遍歷輸出,與單鏈表相同,僅需使用右指針 rlink 不斷指向下一結點,輸出數據域即可
template <class T> void doubleLink<T>::print(){Node<T> *p;//工作指針p=first->rlink;//從第一個結點開始while(p!=NULL){cout<<(p->data)<<endl;//輸出數據域p=p->rlink;//指向下一結點} }?
總結
以上是生活随笔為你收集整理的理论基础 —— 线性表 —— 双向链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算术(HDU-6715)
- 下一篇: 图论 —— 网络流 —— 基本概念与建模