【第四周项目4】建设双链表算法库

来源:互联网 发布:ajax跨域请求不是json 编辑:程序博客网 时间:2024/06/05 08:59
/*        Copyright (c)2017,烟台大学计算机与控制工程学院        All rights reserved.        文件名称:13.cpp         作    者:尚文哲       完成日期:2017年9月28日         问题描述:双链表算法库算法库采用程序的多文件组织形式,包括两个文件:            1.头文件:dlinklist.h,包含定义双链表数据结构的代码、宏定义、要实现算法的函数的声明;             2.源文件:linklist.cpp,包含实现各种算法的函数的定义    */   

(1)头文件    #include<stdio.h>    #include<malloc.h>    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); //删除一个节点      (2)各个函数的代码    [cpp] view plain copy  #include"list.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;            if(L->next!=NULL)                L->next->prior;            L->next=s;            s->prior=L;        }    }    void CreateListR(DLinkList *&L,ElemType a[],int n)//尾插法建双链表    {           DLinkList *s,*r;        int i;        L=(DLinkList *)malloc(sizeof(DLinkList));        r=L;        for(i=0;i<n;i++)        {            s=(DLinkList *)malloc(sizeof(DLinkList));            s->data=a[i];            r->next=s;            s->prior=r;            r=s;        }        r->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)测验函数的代码    [cpp] view plain copy  #include"list.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;    }   

原创粉丝点击