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

双链表算法库算法库采用程序的多文件组织形式,包括两个文件:


 

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_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
 

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;


运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值