【SDUT】2054数据结构实验之链表九:双向链表

news/2024/8/26 4:58:19

问题描述:

学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内存中找到下一个位置,这是一个不会轻易断裂的链。但单链表有一个弱点——不能回指。比如在链表中有两个节点A,B,他们的关系是B是A的后继,A指向了B,便能轻易经A找到B,但从B却不能找到A。一个简单的想法便能轻易解决这个问题——建立双向链表。在双向链表中,A有一个指针指向了节点B,同时,B又有一个指向A的指针。这样不仅能从链表头节点的位置遍历整个链表所有节点,也能从链表尾节点开始遍历所有节点。对于给定的一列数据,按照给定的顺序建立双向链表,按照关键字找到相应节点,输出此节点的前驱节点关键字及后继节点关键字。

输入:

第一行两个正整数n(代表节点个数),m(代表要找的关键字的个数)。第二行是n个数(n个数没有重复),利用这n个数建立双向链表。接下来有m个关键字,每个占一行。

输出:

对给定的每个关键字,输出此关键字前驱节点关键字和后继节点关键字。如果给定的关键字没有前驱或者后继,则不输出。
注意:每个给定关键字的输出占一行。
一行输出的数据之间有一个空格,行首、行末无空格。

示例输入:

10 3
1 2 3 4 5 6 7 8 9 0
3
5
0

示例输出:

2 4
4 6
9

解决方案:
增设一个pre指针。然后输出的时候设置一个flag调整输出格式即可。

AC代码:

#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct LNode{
    int val;
    struct LNode *next;
    struct LNode *pre;
}LNode,*LinkList;

void create(LinkList L,int n){
    for(int i = 0; i < n; i++){
        if(i==0){
            cin>>L->val;
        }
        else{
            LNode *tmp = new LNode;
            cin>>tmp->val;
            tmp->pre = L;
            tmp->next = NULL;
            L->next = tmp;
            L = tmp;
        }
    }
}
void find(LinkList L,int target){
    bool flag = true;
    while(L){
        if(L->val == target){
            if(L->pre){
                cout<<L->pre->val;
                flag = false;
            }
            if(L->next){
                if(flag)
                    cout<<L->next->val;
                else
                    cout<<" "<<L->next->val;
            }
            cout<<endl;
            return;
        }
        L = L->next;
    }
}
void print(LinkList L){
    bool flag = true;
    while(L->next){
        if(flag){
            flag = false;
//            cout<<L->next->val;
            printf("%d",L->next->val);
        }
        else{
//            cout<<' '<<L->next->val;
            printf(" %d",L->next->val);
        }
        L = L->next;
    }
    cout<<endl;
}
int main(){
    int n,num;
    LinkList L = new LNode;
    L->pre = NULL;
    L->next = NULL;
    cin>>n>>num;
    create(L,n);
    int target;
    for(int i = 0; i < num; i++) {
        cin>>target;
        find(L, target);
    }
    return 0;
}

http://www.niftyadmin.cn/n/3873755.html

相关文章

run cuda samples ubuntu_linux(ubuntu)安装cuda toolkit

nvidia 官方文档nvidia 对不同系统的支持查看是否有支持cuda的GPU:lspci | grep -i nvidia如果没有&#xff0c;安装驱动sudo apt install nvidia-driver-440查看linux版本是否支持uname -m && cat /etc/*release比如我的显示结果如下&#xff1a;x86_64 DISTRIB_IDUbu…

WCF开发框架形成之旅--WCF应用常见问题处理

本文继续前面几篇关于WCF开发框架的随笔&#xff0c;继续介绍WCF的一些经验和知识&#xff0c;其中主要介绍在使用WCF开发中碰到的问题以及解决方法&#xff0c;为自己做个记号&#xff0c;也为后来者提供解决思路&#xff0c;其中包括有动态修改 WCF配置内容、规范WCF客户端的…

全双工、半双工的区别

全双工&#xff08;Full Duplex&#xff09;是指在发送数据的同时也能够接收数据&#xff0c;两者同步进行&#xff0c;这好像我们平时打电话一样&#xff0c;说话的同时也能够听到对方的声音。目前的网卡一般都支持全双工。 半双工&#xff08;Half Duplex&#xff09;&#x…

制作带关闭按钮的广告_电脑广告弹窗太多,这一招就搞定

在互联网爆发的今天&#xff0c;基本可以说是人手一台手机&#xff0c;一台电脑&#xff0c;在平时使用的过程中&#xff0c;是否对于各种弹窗广告很烦&#xff1f;关了一会又弹出来了&#xff0c;应该怎样彻底关闭呢&#xff1f;下面讲解一下关于关闭搜狗输入法带来的广告及弹…

qDebug的用法

qDebug用于在控制台输出调试信息&#xff0c;主要有以下几种用法。 1、类似c的cout函数 QString str"world"; qDebug()<<"hello "<<str<<"!"<<endl; 注&#xff1a;此处endl起到的作用有两个&#xff1a; a、等同于…

【SDUT】2124 串结构练习——字符串连接

问题描述&#xff1a; 给定两个字符串string1和string2&#xff0c;将字符串string2连接在string1的后面&#xff0c;并将连接后的字符串输出。 连接后字符串长度不超过110。 输入&#xff1a; 输入包含多组数据&#xff0c;每组测试数据包含两行&#xff0c;第一行代表stri…

共享单车数据爬取_Kaggle共享单车数据可视化分析

导读&#xff1a;本文分两部分&#xff1a;1.描述分析部分&#xff0c;着重进行数据的可视化分析&#xff0c;使用ppt制成图文形式方便阅读&#xff1b;2.具体操作部分&#xff0c;呈现完整的数据分析流程和全部代码。---------------------------------------华丽的分割线----…

leetcode刷题——复制带随机指针的链表

思维导图&#xff1a; 题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点…