雙鏈表的實現,雙鏈表實現

來源:互聯網
上載者:User

雙鏈表的實現,雙鏈表實現

跟單鏈表有點像,主要區別就在建表,插入元素,刪除元素這裡。

雙鏈表資料結構為:

typedef struct  DNode{ElemType data;        //節點資料 struct DNode* prior;   //指向前一節點指標 struct DNode* next;    //指向後一節點指標 }DLinkList;
實現下列函數:

void CreateListF(DLinkList *&L,ElemType a[],int n);  //頭插法建表void CreateListR(DLinkList *&L,ElemType a[],int n); //尾插法建表void InitList(DLinkList *&L);  //初始化鏈表void DestroyList(DLinkList *&L);  //銷毀鏈表int ListEmpty(DLinkList *L);  //判斷鏈表是否為空白int ListLength(DLinkList *L);  //求鏈表長度void DispList(DLinkList *L);  //輸出鏈表int GetElem(DLinkList *L,int i,ElemType &e);  //求鏈表裡第i個節點的值,並賦值給e int LocateElem(DLinkList *L,ElemType e); //求與e值相等的第一個元素的序號 int InsertElem(DLinkList *&L,int i,ElemType e); //插入元素int DeleteElem(DLinkList *&L,int i,ElemType &e); //刪除元素 
具體實現代碼:

#include<stdio.h>#include<stdlib.h>#include<iostream>#define ElemType float#define GET_ARRAY_LEN(array)   (sizeof(array)/sizeof(array[0]))using namespace std; typedef struct  DNode{ElemType data;        //節點資料 struct DNode* prior;   //指向前一節點指標 struct DNode* next;    //指向後一節點指標 }DLinkList;void CreateListF(DLinkList *&L,ElemType a[],int n);  //頭插法建表void CreateListR(DLinkList *&L,ElemType a[],int n); //尾插法建表void InitList(DLinkList *&L);  //初始化鏈表void DestroyList(DLinkList *&L);  //銷毀鏈表int ListEmpty(DLinkList *L);  //判斷鏈表是否為空白int ListLength(DLinkList *L);  //求鏈表長度void DispList(DLinkList *L);  //輸出鏈表int GetElem(DLinkList *L,int i,ElemType &e);  //求鏈表裡第i個節點的值,並賦值給e int LocateElem(DLinkList *L,ElemType e); //求與e值相等的第一個元素的序號 int InsertElem(DLinkList *&L,int i,ElemType e); //插入元素int DeleteElem(DLinkList *&L,int i,ElemType &e); //刪除元素 void CreateListF(DLinkList* &L,ElemType a[],int n){L=(DLinkList *)malloc(sizeof(DLinkList));L->prior=L->next=NULL;DLinkList *p=L;for(int i=0;i<n;i++){DLinkList* addNumber=(DLinkList* )malloc(sizeof(DLinkList));addNumber->data=a[i];if(p->next!=NULL){addNumber->prior=p->next->prior;addNumber->next=p->next;p->next->prior=addNumber;p->next=addNumber; } else {addNumber->prior=p;addNumber->next=NULL;p->next=addNumber;}} }void CreateListR(DLinkList* &L,ElemType a[],int n){L=(DLinkList *)malloc(sizeof(DLinkList));L->prior=L->next=NULL;DLinkList *p=L;for(int i=0;i<n;i++){DLinkList* addNumber=(DLinkList *)malloc(sizeof(DLinkList));addNumber->data=a[i];addNumber->prior=p;addNumber->next=NULL;p->next=addNumber;p=p->next; } }void InitList(DLinkList* &L){L=(DLinkList *)malloc(sizeof(DLinkList));L->prior=L->next=NULL;} void DestroyList(DLinkList* &L){DLinkList* p=L;DLinkList* q=L->next;while(q!=NULL){free(p);p=q;q=q->next;}free(p);}int  ListEmpty(DLinkList* L){return(L->next==NULL);}int ListLength(DLinkList* L){int count=0;DLinkList* p=L->next;while(p!=NULL){count++;p=p->next;}return count;}void DispList(DLinkList* L){DLinkList* p=L->next;while(p!=NULL){cout<<p->data<<" ";p=p->next;}cout<<endl;}int GetElem(DLinkList* L,int i,ElemType &e){DLinkList* p=L;int j=0;while(j<i&&p!=NULL){p=p->next;j++;}if(i<1||p==NULL)return -1;else{e=p->data;return 1;}}int LocateElem(DLinkList* L,ElemType e){DLinkList* p=L->next;int i=1;while((!(-1e-9<p->data-e&&p->data-e<1e-9))&&p!=NULL){p=p->next;i++;}if(p==NULL)return -1;else return i;}int InsertElem(DLinkList* &L,int i,ElemType e){DLinkList* p=L->next;int j=1;while(j<i&&p!=NULL){j++;p=p->next;}if((p==NULL&&i>j+1)||i<1)return -1;else{DLinkList* addNumber=(DLinkList *)malloc(sizeof(DLinkList));addNumber->data=e;addNumber->prior=p->prior;addNumber->next=p;p->prior->next=addNumber;p->prior=addNumber;return 1;}  }int DeleteElem(DLinkList* &L,int i,ElemType &e){DLinkList* p=L->next;int j=1;while(j<i&&p!=NULL){j++;p=p->next; }if(i<1||p==NULL)return -1;else{e=p->data;if(p->next!=NULL){p->next->prior=p->prior;p->prior->next=p->next;free(p);}else{p->prior->next=NULL;free(p);}return 1;} }int main(){DLinkList *L=NULL;float a[]={3.4,8.7,1,3,9.7,4,5.6,3};ElemType e;CreateListF(L,a,GET_ARRAY_LEN(a));DispList(L);DestroyList(L);CreateListR(L,a,GET_ARRAY_LEN(a));    DispList(L);    GetElem(L,4,e);    cout<<e<<endl;    cout<<LocateElem(L,e)<<endl;    DeleteElem(L,3,e);    DispList(L);    InsertElem(L,1,78.4);    DispList(L);    cout<<ListLength(L);return 0;}

運行結果如下:


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.