【第四周】项目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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章