实现双链表各种基本运算的算法

/**
*    实验题目:
*        实现双链表各种基本运算的算法
*    实验内容:
*        设计一个程序,实现双链表的各种基本运算,并在此基础上设计一个
*    主程序完成如下功能:
*    1、初始化双链表h。
*    2、依次采用尾插法插入a、b、c、d、e元素。
*    3、输出双链表h。
*    4、输出双链表h长度。
*    5、判断双链表h是否为空。
*    6、输出双链表h的第3个元素。
*    7、输出元素a的位置。
*    8、在第4个元素位置上插入f元素。
*    9、输出双链表h。
*    10、删除h的第三个元素。
*    11、输出双链表h。
*    12、释放双链表h。
*/
#include <stdio.h>
#include <malloc.h>

typedef char ElemType;
typedef struct DNode        // 定义双链表结点类型
{
    ElemType data;          // 数据域
    struct DNode *prior;    // 指向前驱结点
    struct DNode *next;     // 指向后继结点
}DLinkList;


/*---------------------初始化双链表L------------------*/
void InitList(DLinkList *&L)
{
    L = (DLinkList *)malloc(sizeof(DLinkList));         // 创建头结点
    L->prior = L->next = NULL;
}

/*------------------释放双链表L------------------------*/
void DestroyList(DLinkList *&L)
{
    DLinkList *p = L, *q = p->next;

    while(q != NULL)
    {
        free(p);
        p = q;
        q = p->next;
    }
    free(p);
}

/*----------------------判断双链表L是否为空表------------------*/
int ListEmpty(DLinkList *L)
{
    return (L->next == NULL);
}

/*----------------------返回双链表L的元素个数------------------*/
int ListLength(DLinkList *L)
{
    int i = 0;
    DLinkList *p = L;

    while(p->next != NULL)
    {
        i++;
        p = p->next;
    }

    return (i);
}

/*-----------------------输出双链表L-----------------------*/
void DispList(DLinkList *L)
{
    DLinkList *p = L->next;

    while(p != NULL)
    {
        printf("%c ", p->data);
        p = p->next;
    }
    printf("\n");
}

/*-------------------获取双链表L中第i个元素-------------------*/
int 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 0;
    else
    {
        e = p->data;                // 提取数据元素
        return 1;
    }
}

/*-----------------------在双链表L中查找元素e---------------------*/
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;
}

/*--------------------在双链表L中第i个位置上插入元素e----------------------*/
int 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 0;
    else                                // 找到第i-1个结点
    {
        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 1;
    }
}

/*-----------------在双链表L中删除第i个元素----------------------*/
int 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 0;
    else                                    // 找到第i-1个结点
    {
        q = p->next;                        // q指向要删除的结点
        if(q == NULL)                       // 不存在第i个结点
            return 0;
        e = q->data;
        p->next = q->next;                  // 从链表中删除q结点
        if(p->next != NULL)
            p->next->prior = p;
        free(q);                            // 释放q结点
        return 1;
    }
}

int main(void)
{

    DLinkList *h;
    ElemType e;

    printf("(1)初始化双链表h\n");
    InitList(h);

    printf("(2)依次采用尾插法插入a、b、c、d、e元素\n");
    ListInsert(h, 1, 'a');
    ListInsert(h, 2, 'b');
    ListInsert(h, 3, 'c');
    ListInsert(h, 4, 'd');
    ListInsert(h, 5, 'e');
    printf("(3)输出双链表h:");
    DispList(h);
    printf("(4)双链表h长度 = %d\n", ListLength(h));
    printf("(5)双链表h为%s\n", (ListEmpty(h) ? "空" : "非空"));
    GetElem(h, 3, e);
    printf("(6)双链表h的第3个元素 = %c\n", e);
    printf("(7)元素a的位置 = %d\n", LocateElem(h, 'a'));
    printf("(8)在第4个元素位置上插入f元素\n");
    ListInsert(h, 4, 'f');
    printf("(9)输出单链表h:");
    DispList(h);
    printf("(10)删除h的第三个元素\n");
    ListDelete(h, 3, e);
    printf("(11)输出双链表h:");
    DispList(h);
    printf("(12)释放双链表h\n");
    DestroyList(h);

    return 0;
}
测试结果:

(1)初始化双链表h
(2)依次采用尾插法插入a、b、c、d、e元素
(3)输出双链表h:a b c d e
(4)双链表h长度 = 5
(5)双链表h为非空
(6)双链表h的第3个元素 = c
(7)元素a的位置 = 1
(8)在第4个元素位置上插入f元素
(9)输出单链表h:a b c f d e
(10)删除h的第三个元素
(11)输出双链表h:a b f d e
(12)释放双链表h

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值