数学链表
Time Limit: 1000 ms Memory Limit: 65536 KiB
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; }