请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
输入格式:
输入第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>
typedef struct Node
{
int data;
struct Node*next;
}node;
node* head=NULL;
node* rear;
void insertend(node* temp)
{
if(head==NULL)
{
head=temp;
rear=temp;
rear->next=NULL;
}
else
{
rear->next=temp;
rear=temp;
rear->next=NULL;
}
}
void insert(node*temp,int k,int d)
{
if(k==0)
{
temp->data=d;
temp->next=head;
head=temp;
}
else
{
node* p0=head;
while(k-1>0)
{
p0=p0->next;
k--;
}
temp->next=p0->next;
p0->next=temp;
temp->data=d;
}
}
void delete(int k)
{
node* p=head;
int nm=1;
while(p!=NULL&&nm<k-1)
{
p=p->next;
nm++;
}
node*q=p;p=p->next;
if(p->next!=NULL)
{
q->next=p->next;
free(p);
}
else
{
q->next=NULL;
free(p);
}
}
int main()
{
int n,i;
int num;
node*p;
int m;
scanf("%d",&n);
for(i=0;i<n;i++)
{
node*n=(node*)malloc(sizeof(struct Node));
insertend(n);
}
p=head;
while(p!=NULL)
{
scanf("%d",&num);
p->data=num;
p=p->next;
}
scanf("%d",&m);
int n1,n2,n3;
for(i=0;i<m;i++)
{
scanf("%d",&n1);
if(n1==0)
{
scanf("%d",&n2);
scanf("%d",&n3);
if(n2>=0&&n2<=n)
{
node*temp=(node*)malloc(sizeof(struct Node));
insert(temp,n2,n3);
n++;
}
}
if(n1==1)
{
scanf("%d",&n2);
if(n2>0&&n2<=n)
{
delete(n2);
n--;
}
}
}
p=head;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 0;
}