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

来源:互联网 发布:和俄罗斯女人啪啪知乎 编辑:程序博客网 时间:2024/06/06 08:49
/*    * Copyright (c)2016,烟台大学计算机与控制工程学院    * All rights reserved.    * 文件名称:项目.cpp    * 作    者:姜延锴    * 完成日期:2016年9月25日    * 版 本 号:v1.0     *问题描述:算法库包括两个文件:  * 头文件:dlinklist.h,包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明;  * 源文件:dlinklist.cpp,包含实现各种算法的函数的定义  * 请采用程序的多文件组织形式,建立如上的两个文件,另外再建立一个源文件(如main.cpp),编制main函数,完成相关的测试工作。    *输入描述:无    *程序输出:输出利用头插法和尾插法建立的链表    */  

头文件dlinklist.h代码:

<span style="font-size: 18px;">//循环双链表基本运算函数    </span><span style="font-size:18px;">#include "dlinklist.h"    void CreateListF(CDLinkList *&L,ElemType a[],int n) //头插法建立循环双链表    {        CDLinkList *s;        int i;        L=(CDLinkList *)malloc(sizeof(CDLinkList));     //创建头结点        L->next=NULL;        for (i=0; i<n; i++)        {            s=(CDLinkList *)malloc(sizeof(CDLinkList));//创建新结点            s->data=a[i];            s->next=L->next;            //将*s插在原开始结点之前,头结点之后            if (L->next!=NULL) L->next->prior=s;            L->next=s;            s->prior=L;        }        s=L->next;        while (s->next!=NULL)           //查找尾结点,由s指向它            s=s->next;        s->next=L;                      //尾结点next域指向头结点        L->prior=s;                     //头结点的prior域指向尾结点            }    void CreateListR(CDLinkList *&L,ElemType a[],int n) //尾插法建立循环双链表    {        CDLinkList *s,*r;        int i;        L=(CDLinkList *)malloc(sizeof(CDLinkList));  //创建头结点        L->next=NULL;        r=L;                    //r始终指向尾结点,开始时指向头结点        for (i=0; i<n; i++)        {            s=(CDLinkList *)malloc(sizeof(CDLinkList));//创建新结点            s->data=a[i];            r->next=s;            s->prior=r; //将*s插入*r之后            r=s;        }        r->next=L;              //尾结点next域指向头结点        L->prior=r;             //头结点的prior域指向尾结点    }    void InitList(CDLinkList *&L) //初始化循环双链表    {        L=(CDLinkList *)malloc(sizeof(CDLinkList));     //创建头结点        L->prior=L->next=L;    }    void DestroyList(CDLinkList *&L)  //销毁    {        CDLinkList *p=L,*q=p->next;        while (q!=L)        {            free(p);            p=q;            q=p->next;        }        free(p);    }    bool ListEmpty(CDLinkList *L) //判断是否为空    {        return(L->next==L);    }    int ListLength(CDLinkList *L) //求链表长度    {        CDLinkList *p=L;        int i=0;        while (p->next!=L)        {            i++;            p=p->next;        }        return(i);    }    void DispList(CDLinkList *L)  //输出链表    {        CDLinkList *p=L->next;        while (p!=L)        {            printf("%d ",p->data);            p=p->next;        }        printf("\n");    }    bool GetElem(CDLinkList *L,int i,ElemType &e)  //取链表元素    {        int j=0;        CDLinkList *p;        if (L->next!=L)     //双链表不为空表时        {            if (i==1)            {                e=L->next->data;                return true;            }            else            //i不为1时            {                p=L->next;                while (j<i-1 && p!=L)                {                    j++;                    p=p->next;                }                if (p==L)                    return false;                else                {                    e=p->data;                    return true;                }            }        }        else                //双链表为空表时            return 0;    }    int LocateElem(CDLinkList *L,ElemType e)  //查找元素    {        int n=1;        CDLinkList *p=L->next;        while (p!=NULL && p->data!=e)        {            n++;            p=p->next;        }        if (p==NULL)            return(0);        else            return(n);    }    bool ListInsert(CDLinkList *&L,int i,ElemType e)  //插入节点    {        int j=0;        CDLinkList *p=L,*s;        if (p->next==L)                 //原双链表为空表时        {            s=(CDLinkList *)malloc(sizeof(CDLinkList)); //创建新结点*s            s->data=e;            p->next=s;            s->next=p;            p->prior=s;            s->prior=p;            return true;        }        else if (i==1)                  //原双链表不为空表但i=1时        {            s=(CDLinkList *)malloc(sizeof(CDLinkList)); //创建新结点*s            s->data=e;            s->next=p->next;            p->next=s;  //将*s插入到*p之后            s->next->prior=s;            s->prior=p;            return true;        }        else        {            p=L->next;            while (j<i-2 && p!=L)            {                j++;                p=p->next;            }            if (p==L)               //未找到第i-1个结点                return false;            else                    //找到第i-1个结点*p            {                s=(CDLinkList *)malloc(sizeof(CDLinkList)); //创建新结点*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(CDLinkList *&L,int i,ElemType &e)  //删除节点    {        int j=0;        CDLinkList *p=L,*q;        if (p->next!=L)                 //原双链表不为空表时        {            if (i==1)                   //i==1时            {                q=L->next;              //删除第1个结点                e=q->data;                L->next=q->next;                q->next->prior=L;                free(q);                return true;            }            else                        //i不为1时            {                p=L->next;                while (j<i-2 && 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 0;  //不存在第i个结点                    e=q->data;                    p->next=q->next;        //从单链表中删除*q结点                    if (p->next!=NULL) p->next->prior=p;                    free(q);                //释放*q结点                    return true;                }            }        }        else            return false;   //原双链表为空表时    }    </span>
源文件main.cpp代码:

<span style="font-size:18px;">#include "dlinklist.h"    int main()    {        CDLinkList *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;    }   </span><span style="font-size: 18px;"> </span>


知识点总结:

   通过多文件组织建立双链表的算法库

心得

自己通过建立算法库能够解决很多问题,心里很开心






0 0