模拟链表

问题描述

有一串已经从小到大排好序的数2 3 5 8 9 10 18 26 32.现需要往这串数中插入6使其得到的新序列仍符合从小到大的排列。

分析

我们可以用一个数组data来存储每个序列中的每一个数,再用一个数组right来存放序列中每一个数右边的数是谁。

1            2              3           4            5              6           7             8            9              10

data

1            2              3           4            5              6           7             8            9              10

right 

上图的两个数组中,第一个整型数组data是用来存放序列中具体数字的,另外一个整型数组right是用来存放当前序列中每一个元素右边的元素在数组data中位置的。

比如right[1]的值为2,就表示当前序列中1号元素右边的元素存放在data[2]中;如果是0,比如right[9]的值为0,就表示当前序列中9号元素的右边没有元素。

现在需要在8前面插入一个6,只需将6直接存放在数组data的末尾即data[10]=6。接下来只需要将right[3]改为10,表示新序列中3号元素右边的元素存放在data[10]中。再将right[10]改为4,表示新序列中10号元素右边的元素存放在data[4]中。这样我们通过right数组就可以从头到尾遍历整个序列了(序列的每个元素的值存放在对应的数组data中),如下:

1            2              3           4            5              6           7             8            9              10

data 

1            2              3           4            5              6           7             8            9              10

right 

以下是完整的代码,供参考:

    int data[101],right[101];
    int i,n,t,len;
    scanf("%d",&n);  //输入已有的数
    for(i=1;i<=n;i++)
        scanf("%d",&data[i]);
    len=n;
    for(i=1;i<=n;i++)  //初始化数组right
    {
        if(i!=n)
            right[i]=i+1;
        else
            right[i]=0;
    }
    len++;  //直接在数组data的末尾增加一个数
    scanf("%d",&data[len]);
    /*从链表的头部开始遍历*/
    t=1;
    while(t!=0)
    {
        if(data[right[t]]>data[len])  //如果当前结点下一个结点的值大于待插入数,将数输入到中间
        {
            right[len]=right[t];  //新插入数的下一个结点标号等于当前结点的下一个结点标号
            right[t]=len;  //当前结点的下一个结点编号就是新插入数的编号
            break;  //插入完成跳出循环
        }
        t=right[t];
    }
    /*输出链表中所有的数*/
    t=1;
    while(t!=0)
    {
        printf("%d ",data[t]);
        t=right[t];
    }
    return 0;

时间: 2024-11-03 22:37:16

模拟链表的相关文章

hdu5009 Paint Pearls (DP+模拟链表)

http://acm.hdu.edu.cn/showproblem.php?pid=5009 2014网络赛 西安 比较难的题 Paint Pearls Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1951    Accepted Submission(s): 631 Problem Description Lee has a str

地震预测(模拟链表)

A - 地震预测 FZU - 1492 怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生. 假设已知一段时间的n次地壳震动能量的采样值为a1,a2,…an,那么第i 次采样的最小波动值为min{|ai-aj| | i<j<=n},即第i 次采样的最小波动值是其后n-i次采样值与第i次采样值之差的绝对值中最小的值,特别地,第n次采样的最小波动值为an. 请编写一个程序计算这n次采样的最小波动值之和. Input 本题有多

【日常学习】【SPFA负环+数组模拟链表实现】codevs2645 Spore题解

之前刚刚写了一道"香甜的黄油",是USACO的经典题目了.那道题用SPFA怎么找都过不了,看着别人的PAS轻松过各种拙计.黄学长说最佳方案应当是堆优化的dij,我还没有血,等学了那个之后再写黄油题解吧. 题目: 题目描述 Description 在星系1 的某颗美丽的行星之上.某陈将去标号为N 的星系,从星系g1 到达g2,某陈需要花费c1 的代价[主要是燃料,另外还有与沿途Grox 的势力作战的花费],c1 小于0 则是因为 这样的星系旅行,会给某陈带来收益[来源于物流差价,以及一些

UVa 11988 Broken Keyboard(模拟链表)

题意  有一个键盘坏了  会在你不知道的情况下按下home或者end  给你这个键盘的实际输入  要求输出显示器上的实际显示 输入最大5MB  所以直接数组检索肯定会超时的  用数组模拟链表  就可以很快了 #include<cstdio> #include<cstring> using namespace std; const int N=100005; char s[N]; int next[N]; int main() { int last,cur; while(~scanf

UVa12657 - Boxes in a Line(数组模拟链表)

题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令).3 X Y表示交换盒子X和Y的位置.4 表示反转整条链. 盒子个数n和指令条数m(1<=n,m<=100,000) 题解 用数组来模拟链表操作,对于每个节点设置一个前驱和后继. 1操作是把x的前驱节点和x的后继节点连接,y节点的前驱和x节点连接,x节点和y

链表和模拟链表[插入数字]

有一串已经从小到大排好序的数2 3 5 8 9 10 18 26 32.现需要往这串数中插入6使其得到的新序列仍符合从小到大排列.如我们使用数组来实现这一操作,则需要将8和8后面的数都依次往后挪一位,如下 这样操作显然很耽误时间,如果使用链表则会快很多. 此时如果需要在8前面插入一个6,就只需像下图这样更改一下就可以了,而无需再将8及后面的数都依次往后挪一位.是不是很节省时间呢? 那么如何实现链表呢?在C语言中可以使用指针和动态分配内存函数malloc来实现. 指针大家都很熟悉了,下面说下动态存

UVa 11988 数组模拟链表

题目:在一个没有显示器的电脑上输入一个字符串,键盘坏掉了,会随机的出现home,和end按键, 字符串中'['代表home键(句首),']'代表end键(句尾),问最后输出的字符串的格式. 分析:模拟屏幕操作,移动光标,模拟缓冲区输出操作. 说明:数组模拟链表操作,跟随链表操作,形象化模拟. 1 // UVa11988 Broken Keyboard 2 // Rujia Liu 3 #include<cstdio> 4 #include<cstring> 5 const int

UVA11988:悲剧文本(模拟链表)

You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "end" key gets automatically pressed (internally). You're not aware of this iss

B - Broken Keyboard (a.k.a. Beiju Text) 数组模拟链表

You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "end" key gets automatically pressed (internally). You're not aware of this iss

PAT 甲级 1052 Linked List Sorting (25 分)(数组模拟链表,没注意到不一定所有节点都在链表里)

1052 Linked List Sorting (25 分) A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, y