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

来源:互联网 发布:报告式资产负债表 知乎 编辑:程序博客网 时间:2024/06/11 02:40

问题:

/* *Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目4.cbp *作    者:杨雅鑫 *完成日期:2016年9月16日 *版 本 号:v1.0 * *问题描述:算法库包括两个文件:            头文件:dlinklist.h,包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明;            源文件:dlinklist.cpp,包含实现各种算法的函数的定义            请采用程序的多文件组织形式,建立如上的两个文件,另外再建立一个源文件(如main.cpp),编制main函数,完成相关的测试工作。 *输入描述:无 *程序输出:调整后的链表 */  

dlinklist.h头文件代码:

#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

linklist.cpp代码:

#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;    }}

 main.cpp代码:

#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;  }
运行结果:


知识点总结:
通过单链表进一步了解双链表,发现相似与不同。
学习心得:
要想学好双链表,必须要掌握好单链表的知识基础。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机屏幕自己乱点怎么办 电脑开机出现f1f2怎么办 普通话证书身份证号有误怎么办 湖南身份证在深圳怎么办 超市快过期东西怎么办 超市打碎了东西怎么办 毕业证与身份证号不符怎么办 家里电路坏了怎么办 深圳户口没房怎么办 深圳租凭合同怎么办 房屋续租水电费怎么办 二手房买到凶宅怎么办 公租房退休之后怎么办 深圳公务员无房怎么办 深圳安居房回执遗失怎么办 社保网注册不了怎么办 深圳怎么办少儿医保卡 少儿没缴纳医保怎么办 上海辞职后社保怎么办 辞职去上学社保怎么办 辞职后异地社保怎么办 个人不想交社保怎么办 离职去异地社保怎么办 离职到外省社保怎么办 辞职去外省社保怎么办 永康光伏补贴怎么办? 找到工作后档案怎么办 夫妻离婚后户口怎么办 异地档案辞职后怎么办 去网吧没有招聘怎么办 建筑工地老板不给钱怎么办 2018高压电工证怎么办 深圳户口怎么办户口卡 在深圳找不到工作怎么办 亲戚户口不迁出怎么办 深圳集体户口准生证怎么办 天津集体户口怎么办准生证 深圳集体户离职户口怎么办 解析包出现错误怎么办 信息登记号没有怎么办 博士非211 985怎么办