第四周项目4-建立双链表算法库

来源:互联网 发布:vx软件 编辑:程序博客网 时间:2024/05/16 17:12
双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:dlinklist.h,包含定义双链表数据结构的代码、宏定义、要实现算法的函数的声明;[cpp] view plaincopyprint?01.#ifndef DLINKLIST_H_INCLUDED   02.#define DLINKLIST_H_INCLUDED   03.typedef int ElemType;  04.typedef struct DNode        //定义双链表结点类型   05.{  06.    ElemType data;  07.    struct DNode *prior;    //指向前驱结点   08.    struct DNode *next;     //指向后继结点   09.} DLinkList;  10.void CreateListF(DLinkList *&L,ElemType a[],int n);//头插法建双链表   11.void CreateListR(DLinkList *&L,ElemType a[],int n);//尾插法建双链表   12.void InitList(DLinkList *&L); //初始化双链表   13.void DestroyList(DLinkList *&L); //销毁双链表   14.bool ListEmpty(DLinkList *L); //判断链表是否为空   15.int ListLength(DLinkList *L); //求链表的长度   16.void DispList(DLinkList *L); //输出链表   17.bool GetElem(DLinkList *L,int i,ElemType &e); //获取节点的值   18.int LocateElem(DLinkList *L,ElemType e); //查找一个节点   19.bool ListInsert(DLinkList *&L,int i,ElemType e) ;//插入一个节点   20.bool ListDelete(DLinkList *&L,int i,ElemType &e); //删除一个节点   21.  22.  23.#endif // DLINKLIST_H_INCLUDED  #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,包含实现各种算法的函数的定义[cpp] view plaincopyprint?01.#include <stdio.h>   02.#include <malloc.h>   03.#include "dlinklist.h"   04.void CreateListF(DLinkList *&L,ElemType a[],int n)  05.//头插法建双链表   06.{  07.    DLinkList *s;  08.    int i;  09.    L=(DLinkList *)malloc(sizeof(DLinkList));   //创建头结点   10.    L->prior=L->next=NULL;  11.    for (i=0; i<n; i++)  12.    {  13.        s=(DLinkList *)malloc(sizeof(DLinkList));//创建新结点   14.        s->data=a[i];  15.        s->next=L->next;            //将*s插在原开始结点之前,头结点之后   16.        if (L->next!=NULL) L->next->prior=s;  17.        L->next=s;  18.        s->prior=L;  19.    }  20.}  21.void CreateListR(DLinkList *&L,ElemType a[],int n)  22.//尾插法建双链表   23.{  24.    DLinkList *s,*r;  25.    int i;  26.    L=(DLinkList *)malloc(sizeof(DLinkList));   //创建头结点   27.    L->prior=L->next=NULL;  28.    r=L;                    //r始终指向终端结点,开始时指向头结点   29.    for (i=0; i<n; i++)  30.    {  31.        s=(DLinkList *)malloc(sizeof(DLinkList));//创建新结点   32.        s->data=a[i];  33.        r->next=s;  34.        s->prior=r; //将*s插入*r之后   35.        r=s;  36.    }  37.    r->next=NULL;           //终端结点next域置为NULL   38.}  39.void InitList(DLinkList *&L)  40.{  41.    L=(DLinkList *)malloc(sizeof(DLinkList));   //创建头结点   42.    L->prior=L->next=NULL;  43.}  44.void DestroyList(DLinkList *&L)  45.{  46.    DLinkList *p=L,*q=p->next;  47.    while (q!=NULL)  48.    {  49.        free(p);  50.        p=q;  51.        q=p->next;  52.    }  53.    free(p);  54.}  55.bool ListEmpty(DLinkList *L)  56.{  57.    return(L->next==NULL);  58.}  59.int ListLength(DLinkList *L)  60.{  61.    DLinkList *p=L;  62.    int i=0;  63.    while (p->next!=NULL)  64.    {  65.        i++;  66.        p=p->next;  67.    }  68.    return(i);  69.}  70.void DispList(DLinkList *L)  71.{  72.    DLinkList *p=L->next;  73.    while (p!=NULL)  74.    {  75.        printf("%d ",p->data);  76.        p=p->next;  77.    }  78.    printf("\n");  79.}  80.bool GetElem(DLinkList *L,int i,ElemType &e)  81.{  82.    int j=0;  83.    DLinkList *p=L;  84.    while (j<i && p!=NULL)  85.    {  86.        j++;  87.        p=p->next;  88.    }  89.    if (p==NULL)  90.        return false;  91.    else  92.    {  93.        e=p->data;  94.        return true;  95.    }  96.}  97.int LocateElem(DLinkList *L,ElemType e)  98.{  99.    int n=1;  100.    DLinkList *p=L->next;  101.    while (p!=NULL && p->data!=e)  102.    {  103.        n++;  104.        p=p->next;  105.    }  106.    if (p==NULL)  107.        return(0);  108.    else  109.        return(n);  110.}  111.bool ListInsert(DLinkList *&L,int i,ElemType e)  112.{  113.    int j=0;  114.    DLinkList *p=L,*s;  115.    while (j<i-1 && p!=NULL)  116.    {  117.        j++;  118.        p=p->next;  119.    }  120.    if (p==NULL)    //未找到第i-1个结点   121.        return false;  122.    else            //找到第i-1个结点*p   123.    {  124.        s=(DLinkList *)malloc(sizeof(DLinkList));   //创建新结点*s   125.        s->data=e;  126.        s->next=p->next;        //将*s插入到*p之后   127.        if (p->next!=NULL) p->next->prior=s;  128.        s->prior=p;  129.        p->next=s;  130.        return true;  131.    }  132.}  133.bool ListDelete(DLinkList *&L,int i,ElemType &e)  134.{  135.    int j=0;  136.    DLinkList *p=L,*q;  137.    while (j<i-1 && p!=NULL)  138.    {  139.        j++;  140.        p=p->next;  141.    }  142.    if (p==NULL)                //未找到第i-1个结点   143.        return false;  144.    else                        //找到第i-1个结点*p   145.    {  146.        q=p->next;              //q指向要删除的结点   147.        if (q==NULL)  148.            return false;       //不存在第i个结点   149.        e=q->data;  150.        p->next=q->next;        //从单链表中删除*q结点   151.        if (p->next!=NULL) p->next->prior=p;  152.        free(q);                //释放*q结点   153.        return true;  154.    }  155.}  #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函数,完成相关的测试工作。  测试工作可以采用“渐进”的思路,每次涉及的函数应该尽可能少。   例如,下面的设计,测试了部分函数:[cpp] view plaincopyprint?01.#include <stdio.h>   02.#include "dlinklist.h"   03.  04.int main()  05.{  06.    DLinkList *A;  07.    ElemType a[]= {1, 3, 2, 9, 0, 4, 5 ,6, 7, 8};  08.    InitList(A);  09.    CreateListF(A, a, 10);  10.    printf("length: %d\n", ListLength(A));  11.    ListInsert(A, 4, 12);  12.    printf("After Insert: ");  13.    DispList(A);  14.    DestroyList(A);  15.    return 0;


运行结果:

 

0 0
原创粉丝点击