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

  1. /* 
  2.  *Copyright (c) 2015,烟台大学计算机学院 
  3.  *All rights reserved. 
  4.  *文件名称:danlianbiao.cpp 
  5.  *作者:臧晓彤 
  6.  *完成日期:2015年10月12日 
  7.  *版本号:vc++6.0 
  8.  * 
  9.  *问题描述:建设双链表算法库 
  10.  *输入描述:无 
  11.  *程序输出:无
  12. */  
    #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
    #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;
        }
    }
    #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;
    }

  13. 运行结果:

  14. 知识点总结:双链表和单链表不同,每个节点都有两个指针域,一个为前驱结点,另一个为后继结点。双链表的优点在于可以从任意一个节点去找寻它前一个节点,较为简单,而单链表只能从头结点开始找。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值