【第四周】項目4-建設雙鏈表算法庫

#ifndef DLINKLIST_H_INCLUDED    
#define DLINKLIST_H_INCLUDED    
typedef 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    

#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;    
    }    
}    

#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;    
}    

發佈了41 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章