資料結構之自建演算法庫——雙鏈表,資料結構自建演算法

來源:互聯網
上載者:User

資料結構之自建演算法庫——雙鏈表,資料結構自建演算法

本文針對資料結構基礎系列網路課程(2):線性表中第12課時雙鏈表。

按照“0207將演算法變程式”[視頻]部分建議的方法,建設自己的專業基礎設施演算法庫。

  雙鏈表演算法庫演算法庫採用程式的多檔案組織形式,包括兩個檔案:
  
  1.標頭檔:dlinklist.h,包含定義雙鏈表資料結構的代碼、宏定義、要實現演算法的函數的聲明;

#ifndef DLINKLIST_H_INCLUDED#define DLINKLIST_H_INCLUDEDtypedef int ElemType;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); //銷毀雙鏈表bool ListEmpty(DLinkList *L); //判斷鏈表是否為空白int ListLength(DLinkList *L); //求鏈表的長度void DispList(DLinkList *L); //輸出鏈表bool GetElem(DLinkList *L,int i,ElemType &e); //擷取節點的值int LocateElem(DLinkList *L,ElemType e); //尋找一個節點bool ListInsert(DLinkList *&L,int i,ElemType e) ;//插入一個節點bool ListDelete(DLinkList *&L,int i,ElemType &e); //刪除一個節點#endif // DLINKLIST_H_INCLUDED

2.源檔案:linklist.cpp,包含實現各種演算法的函數的定義

#include <stdio.h>#include <malloc.h>#include "dlinklist.h"void CreateListF(DLinkList *&L,ElemType a[],int n)//頭插法建雙鏈表{    DLinkList *s;    int i;    L=(DLinkList *)malloc(sizeof(DLinkList));   //建立頭結點    L->prior=L->next=NULL;    for (i=0; i<n; i++)    {        s=(DLinkList *)malloc(sizeof(DLinkList));//建立新結點        s->data=a[i];        s->next=L->next;            //將*s插在原開始結點之前,頭結點之後        if (L->next!=NULL) L->next->prior=s;        L->next=s;        s->prior=L;    }}void CreateListR(DLinkList *&L,ElemType a[],int n)//尾插法建雙鏈表{    DLinkList *s,*r;    int i;    L=(DLinkList *)malloc(sizeof(DLinkList));   //建立頭結點    L->prior=L->next=NULL;    r=L;                    //r始終指向終端結點,開始時指向頭結點    for (i=0; i<n; i++)    {        s=(DLinkList *)malloc(sizeof(DLinkList));//建立新結點        s->data=a[i];        r->next=s;        s->prior=r; //將*s插入*r之後        r=s;    }    r->next=NULL;           //終端結點next域置為NULL}void InitList(DLinkList *&L){    L=(DLinkList *)malloc(sizeof(DLinkList));   //建立頭結點    L->prior=L->next=NULL;}void DestroyList(DLinkList *&L){    DLinkList *p=L,*q=p->next;    while (q!=NULL)    {        free(p);        p=q;        q=p->next;    }    free(p);}bool ListEmpty(DLinkList *L){    return(L->next==NULL);}int ListLength(DLinkList *L){    DLinkList *p=L;    int i=0;    while (p->next!=NULL)    {        i++;        p=p->next;    }    return(i);}void DispList(DLinkList *L){    DLinkList *p=L->next;    while (p!=NULL)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n");}bool GetElem(DLinkList *L,int i,ElemType &e){    int j=0;    DLinkList *p=L;    while (j<i && p!=NULL)    {        j++;        p=p->next;    }    if (p==NULL)        return false;    else    {        e=p->data;        return true;    }}int LocateElem(DLinkList *L,ElemType e){    int n=1;    DLinkList *p=L->next;    while (p!=NULL && p->data!=e)    {        n++;        p=p->next;    }    if (p==NULL)        return(0);    else        return(n);}bool ListInsert(DLinkList *&L,int i,ElemType e){    int j=0;    DLinkList *p=L,*s;    while (j<i-1 && p!=NULL)    {        j++;        p=p->next;    }    if (p==NULL)    //未找到第i-1個結點        return false;    else            //找到第i-1個結點*p    {        s=(DLinkList *)malloc(sizeof(DLinkList));   //建立新結點*s        s->data=e;        s->next=p->next;        //將*s插入到*p之後        if (p->next!=NULL) p->next->prior=s;        s->prior=p;        p->next=s;        return true;    }}bool ListDelete(DLinkList *&L,int i,ElemType &e){    int j=0;    DLinkList *p=L,*q;    while (j<i-1 && p!=NULL)    {        j++;        p=p->next;    }    if (p==NULL)                //未找到第i-1個結點        return false;    else                        //找到第i-1個結點*p    {        q=p->next;              //q指向要刪除的結點        if (q==NULL)            return false;       //不存在第i個結點        e=q->data;        p->next=q->next;        //從單鏈表中刪除*q結點        if (p->next!=NULL) p->next->prior=p;        free(q);                //釋放*q結點        return true;    }}

  3.在建立演算法庫過程中,為了完成測試,再同一項目(project)中建立一個源檔案(如main.cpp),編製main函數,完成相關的測試工作。
  測試工作可以採用“漸進”的思路,每次涉及的函數應該儘可能少。
  例如,下面的設計,測試了部分函數:

#include <stdio.h>#include "dlinklist.h"int main(){    DLinkList *A;    ElemType a[]= {1, 3, 2, 9, 0, 4, 5 ,6, 7, 8};    InitList(A);    CreateListF(A, a, 10);    printf("length: %d\n", ListLength(A));    ListInsert(A, 4, 12);    printf("After Insert: ");    DispList(A);    DestroyList(A);    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.