师–链表的结点插入
Problem Description
出一个只有头指针的链表和 n 次操作,每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。
Input
组输入。每组数据首先输入一个整数n(n∈[1,100]),代表有n次操作。
接下来的n行,每行有两个整数Mi(Mi∈[0,10000]),Xi。
Output
于每组数据。从前到后输出链表的所有元素,两个元素之间用空格隔开。
Sample Input
4
1 1
1 2
0 3
100 4
Sample Output
3 1 2 4
Hint
例中第一次操作1 1,由于此时链表中没有元素,1>0,所以此时将第一个数据插入到链表的最后,也就是头指针的后面
#include <bits/stdc++.h>
using namespace std;
struct node
{
int data;
struct node *next;
};
int main()
{
int num,n,m,x;
struct node *head,*tail,*p;
while(scanf("%d",&n)!=EOF)
{
num=0;
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
while(n--) /*插入n个元素*/
{
tail=head;
scanf("%d %d",&m,&x);
if(m>=num)
{
while(tail->next)
tail=tail->next;
p=(struct node *)malloc(sizeof(struct node));
p->data=x;
tail->next=p;
p->next=NULL;
num++;
}
else
{
while(m--)
tail=tail->next;
p=(struct node *)malloc(sizeof(struct node));
p->data=x;
p->next=tail->next;
tail->next=p;
num++;
}
}
tail=head->next;
while(tail)
{
if(tail->next==NULL)
printf("%d\n",tail->data);
else
printf("%d ",tail->data);
tail=tail->next;
}
}
return 0;
}
下面的代码在链表插入时没有进行多余的分类,感觉是简单了些
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*tail,*p;
int m,n,i;
while(scanf("%d",&n)!=EOF)
{
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
while(n--)
{
tail=head;
p=(struct node *)malloc(sizeof(struct node));
scanf("%d %d",&m,&p->data);
for(i=1; i<=m; i++)
{
if(tail->next==NULL)
break;
tail=tail->next;
}
p->next=tail->next;
tail->next=p;
}
tail=head->next;
while(tail)
{
if(tail->next==NULL)
printf("%d\n",tail->data);
else
printf("%d ",tail->data);
tail=tail->next;
}
}
return 0;
}