链表的有序构建和查找/构建链表【数据结构】

链表的有序构建和查找

题目描述

单链表结点的存储结构包含两部分:数据、下一结点指针(默认为空)。

单链表包含头结点,存储实际数据的结点位置从1开始。

现输入一批无序的整数队列,编写程序完成以下要求

1)构建单链表并且把数据按递增顺序插入到链表中,并且统计非空指针发生变化的次数。

例如在初始只包含头结点的单链表中,依次插入3和2,当把3插入时,是头结点的next指针发生变化,初始头结点的next指针是空的,现在指向3的结点,所以不计入指针变化次数。

当把2插入时,它是插入到头结点和3结点之间,这时候头结点的next指针从指向3变成指向2,因此这次计入指针变化次数。

总之,如果是把一个空的next指针指向新的结点,则不计入变化次数;如果是把一个非空next指针修改指向新结点则计入变化次数。

2)实现对单链表的元素查找。输入一个链表位置,返回该位置对应的数据。如果位置非法则输出提示信息,看样例。

要求:必须使用单链表结构实现上述要求,并且不能用第三方算法库或容器类对象

输入

第一行:第一个数字n表示样本数目,其后跟n个样本。

第二行:查找测试次数m 后跟m个待查找的位置。

输出

第一行输出构建链表过程中,非空指针变化的总次数,格式看样本

第二行输出单链表创建后,从头到尾依次输出链表中元素数据

第三行到第n+1行,对每个查找位置,若结点存在,输出结点数据;否则输出error

输入样例1

6 1 8 5 2 4 3

4 0 2 10 6

输出样例1

非空指针变化4次

1 2 3 4 5 8

error

2

error

8

构建链表

主要是构建链表的过程,while循环那里看一下,先设置头指针指向的头结点是不存储数据的,第一个数据放到头指针的下一个

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
struct node
{
    int value;
    node* next=NULL;
};
int main()
{
    int n;
    scanf("%d",&n);
    //new了的就不是NULL
    node* list=new node;
    int change=0;
    for(int i=0;i<n;i++)
    {
        node* now=list;
        //先新建该节点
        node* th=new node;
        int a2;
        scanf("%d",&a2);
        th->value=a2;
        //思路:找到第一个比该数大的插到其前面
        while(1)
        {
            if(now->next==NULL) 
            {
                now->next=th;
                break;
            }
            if(now->next->value>a2)
            {
                th->next=now->next;
                now->next=th;
                change++;
                break;
            }
            now=now->next;
        }
    }
    cout<<"非空指针变化"<<change<<"次"<<endl;
    list=list->next;
    cout<<list->value;
    node* no=list->next;
    int a[205];
    int index=2;
    a[1]=list->value;
    while(no!=NULL)
    {
        printf(" %d",no->value);
        a[index++]=no->value;
        no=no->next;
    }
    cout<<endl;
    int m;
    cin>>m;
    for(int i=0;i<m;i++)
    {
        int x;
        scanf("%d",&x);
        if(x<1||x>n)
        {
            printf("error\n");
            continue;
        }
        printf("%d\n",a[x]);
    }
    return 0;
}
相关推荐
YL200404261 小时前
027合并两个有序链表
java·数据结构·算法·链表
炽烈小老头1 小时前
【每天学习一点算法 2026/05/10】合并K个排序链表
学习·算法·链表
Zephyr_02 小时前
java数据结构
java·数据结构
xieliyu.2 小时前
Java手搓二叉树:基础遍历与核心操作全解析
java·开发语言·数据结构·学习
期待のcode3 小时前
Redis数据类型
运维·数据结构·redis
博界IT精灵3 小时前
图的遍历(哈喜老师)
数据结构·考研·算法·深度优先
所以遗憾是什么呢?3 小时前
【题解】Codeforces Round 1097 (Div. 2, Based on Zhili Cup 2026) (致理杯) ABCDEF
数据结构·算法·acm·codeforces·icpc·ccpc·xcpc
Lazionr4 小时前
【栈与队列经典OJ】
c语言·数据结构
夏日听雨眠4 小时前
数据结构(哈希函数)
数据结构·算法·哈希算法
诙_4 小时前
C++数据结构--B树,B+树,B*树
数据结构·b树