雙鏈表的實現,雙鏈表實現
跟單鏈表有點像,主要區別就在建表,插入元素,刪除元素這裡。
雙鏈表資料結構為:
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;}
運行結果如下: