数学链表

简介: 数学链表

数学链表

Time Limit: 1000 ms Memory Limit: 65536 KiB

SubmitStatisticDiscuss

Problem Description

Fish 得到了一个神奇的数学链表,链表上每个节点有一个值,并且想要往这个链表中插入数据。

但是这个是一个很神奇的数学链表,插入的时候有一个特定的规则,插入时给出一个 x 和 k,让当前链表所有值为 x 和 x 的倍数的节点后面插入一个新节点值为 k,如果没有这样的节点,那么在链表尾部插入一个节点,值为 k。

(保证最后形成的链表不超过 10000 个节点)

Input

多组输入:

   每组第一行输入一个整数 n,和 m,代表初始的链表长度为 n,接下来有 m 次插入操作。(1 <= n <= 100, 1 <= m <= 10000)

   第二行输入 n 个正整数,以空格隔开。(节点的值为不超过 1000 的正整数)

   接下来 m 行,每行一个 x 和 k,含义如上。(1 <= x, k <= 1000)

Output

输出最终形成的链表。

Sample Input

5 3
1 2 3 4 5
1 6
3 2
9 9
5 5
720 830 871 503 490
854 162
579 830
724 271
508 596
519 88

Sample Output

1 6 2 2 6 2 3 2 6 2 4 6 2 5 6 2 9
720 830 871 503 490 162 830 271 596 88

Hint

Source

Fish

#include <stdio.h>
#include <stdlib.h>
struct node
{
    int data;
    struct node *next;
};
int main()
{
    struct node *head, *p, *tail, *q;
    int n, m, i, x, k;
    while(scanf("%d%d", &n, &m) != EOF)
    {
        head = (struct node *)malloc(sizeof(struct node));
        head->next = NULL;
        tail = head;
        for(i = 1; i <= n; i++)
        {
            p = (struct node *)malloc(sizeof(struct node));
            scanf("%d", &p->data);
            p->next = NULL;
            tail->next = p;
            tail = p;
        }
        for(i = 1; i <= m; i++)
        {
            scanf("%d%d", &x, &k);
            int flag = 1;
            for(p = head->next; p->next != NULL; p = p->next)
            {
                if(p->data % x == 0)
                {
                    q = (struct node *)malloc(sizeof(struct node));
                    q->data = k;
                    q->next = p->next;
                    p->next = q;
                    flag = 0;
                    p = p->next;
                }
            }
            if(p->data % x == 0)
            {
                q = (struct node *)malloc(sizeof(struct node));
                q->data = k;
                q->next = p->next;
                p->next = q;
                flag = 0;
                p = p->next;
            }
            if(flag == 1)
            {
                q = (struct node *)malloc(sizeof(struct node));
                q->data = k;
                q->next = NULL;
                p->next = q;
            }
        }
        for(p = head->next; p->next != NULL; p = p->next)
        {
            printf("%d ", p->data);
        }
        printf("%d\n", p->data);
    }
    return 0;
}


相关文章
|
7月前
|
存储
数据结构中公式前中后缀表达式-二叉树应用
数据结构中公式前中后缀表达式-二叉树应用
79 0
|
存储 算法 分布式数据库
【数据结构】二叉树的顺序结构实现及时间复杂度计算(二)
【数据结构】二叉树的顺序结构实现及时间复杂度计算(二)
252 0
|
7月前
|
C语言
【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
354 52
|
6月前
|
算法
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
491 1
|
6月前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
63 0
|
6月前
|
算法
基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析
基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析
|
存储 算法
数据结构练习题——树和二叉树(算法设计题)
以二叉链表作为二叉树的存储结构,编写以下算法: (1)统计二叉树的叶结点个数。 [题目分析]如果二叉树为空,返回0,如果二叉树不为空且左右子树为空,返回1,如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数。 [算法描述]
328 0
|
存储 算法
【开卷数据结构 】多项式的链表表示
【开卷数据结构 】多项式的链表表示
118 0
|
算法
子序列动态规划编程题集合(leetcode)
子序列动态规划编程题集合(leetcode)
110 0
如何根据二叉树的两种遍历方式重建二叉树(理论篇)
如何根据二叉树的两种遍历方式重建二叉树(理论篇)
129 0