请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
输入格式:
输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行为1个正整数m,表示对该链表施加的操作数量;接下来m行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入。1 k表示删除链表中第k个结点,此时k不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n和m不超过100000。
输出格式:
输出为一行整数,表示实施上述m个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。
输入样例:
5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0
1 6
输出样例:
7 1 2 8 3 5
代码示例如下:
#include <stdio.h>
#include <stdlib.h>
struct YYY
{
int data;
struct YYY* next;
};
int main()
{
int a,b,c,d,n,i=0,k=0,j;
struct YYY* head,*p,*q,*pr,*L,*L1,*L3;
scanf("%d",&a);
j=a;
head=(struct YYY*)malloc(sizeof(struct YYY));
head->next=NULL;
q=head;
while(a>0)
{
p=(struct YYY*)malloc(sizeof(struct YYY));
scanf("%d",&p->data);
q->next=p;
q=p;
a--;
}
q->next=NULL;
scanf("%d",&n);
while(n>0)
{
scanf("%d",&b);
if(b==0)
{
scanf("%d %d ",&c,&d);
pr=(struct YYY*)malloc(sizeof(struct YYY));
pr->data=d;
L=head->next;
if(c==0)
{
k++;
pr->next=head->next;
head->next=pr;
}
if(c>0&&c<=j+k)
{
while(L!=NULL)
{
i++;
if(i==c)
break;
L=L->next;
}
pr->next=L->next;
L->next=pr;
k++;
i=0;
}
}
if(b==1)
{
scanf("%d",&c);
L=head;
L1=head;
if(c>0&&c<=j+k)
{
while(L!=NULL)
{
i++;
L=L->next;
if(i==c)
break;
L1=L;
}
L1->next=L->next;
i=0;
j--;
}
}
n--;
}
L3=head->next;
while(L3!=NULL)
{
printf("%d ",L3->data);
L3=L3->next;
}
printf("\n");
return 0;
}