【数据结构入门训练DAY-7】双向循环链表

文章目录


前言

本次数据结构入门训练主要训练到以下内容:

  1. 学习了双向循环链表的创建,插入和删除
  2. 训练解题思维

一、题目

双向链表是在结点中既保存了后一个结点指针又保存了前一个结点指针的链表。这种链表较单向链表而言能够快速查找某一结点的前后结点。

输入格式

输入数据只有一组,包含很多行。每行有1~3个整数。第一个整数如果是0,则表示输出双向链表中的所有元素;第一个整数如果是1,表示插入1个整数,其后跟2个整数i、e代表在第i个位置插入e;第一个整数如果是2,表示删除1个整数,其后跟1个整数i,表示删除的位置为i。
起始双向链表为空表。保证链表中每个元素不会重复,同时所有的操作都合法。

输出格式

当需要输出双向链表中的所有元素时输出,每次输出一行。整数间用一个空格隔开。

样例输入

1 1 2
0
1 2 7
0
2 1
0
1 2 4
1 3 5
1 2 6
0
2 3
0

样例输出

2
2 7
7
7 6 4 5
7 6 5

二、解题思路

           今天的题目是循环链表的一种,我先创建了一个循环链表的结构体,定义了俩指针;然后我创建了链表InitList_Dul();这次我写了一个查找函数GetList()用来查找是否存在元素;然后我继续去编写链表的插入函数InertList_Dul(),目的是用来插入对应位置的元素;然后就是删除函数DelteList_Dul(),用来删除对应那个位置的元素;输出本来打算使用一个函数写的,但是写了好一阵,依然没有结果,如果各位有什么建议,欢迎指出。

#include <iostream>
using namespace std;

typedef int ElemType;
typedef struct DulNode {
    ElemType data;
    struct DulNode *prior;
    struct DulNode *next;
}DulNode,*DuLinkList;
void InitList_Dul(DuLinkList &L) {
    L=(DuLinkList)malloc(sizeof(DulNode));
    L->prior=L;
    L->next=L;
}
DuLinkList GetList(DuLinkList L,int i) {
    DuLinkList p;
    p=L->next;
    int j=1;
    while (p !=L && j<i) {
        p=p->next;
        j++;
    }
    if (p==L && j<i) {
        return nullptr;
    }
    else {
        return p;
    }
}
// int Visit(ElemType data) {
//     cout << data << " ";
//     return 1;
// }
int InertList_Dul(DuLinkList L, int i, ElemType e) {
    DuLinkList p, s;
    if (!(p = GetList(L, i))) {
        return -1;
    }
    if (!(s = (DuLinkList)malloc(sizeof(DulNode)))) {
        return -1;
    }
    s->data = e;
    s->prior = p->prior;
    s->next = p;
    s->prior->next = s;
    p->prior = s;
    return 1;
}

int DelteList_Dul(DuLinkList &L,int i,ElemType &e) {
    DuLinkList p;
    if (!(p = GetList(L,i))) {
        return -1;
    }
    e=p->data;
    p->prior->next=p->next;
    p->next->prior=p->prior;
    free(p);
    return 1;
}
int main() {
    int n;
    DuLinkList root;
    InitList_Dul(root);
    while (cin>>n) {
        if (n == 0) {
            DuLinkList p =root->next;
            bool isFirst = true;
            while (p != root) {
                if (isFirst) {
                    cout << p->data;
                    isFirst = false;
                } else {
                    cout << " " << p->data;
                }
                p = p->next;
            }
            cout << endl;
        }else if (n==1) {
            int i,e;
            cin>>i>>e;
            InertList_Dul(root,i,e);
        }else if (n==2) {
            int i;
            ElemType e;
            cin>>i;
            DelteList_Dul(root,i,e);
        }
    }
}

总结

今天的题目我在按照题中的样例推演了一下后就有思路了,但是今天链表的插入出了点问题,漏了点步骤,当时一直纳闷为啥没有输出,后续查了一下才发现问题;然后就是输出函数没有想出来,有点小遗憾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值