编写程序实现单链表插入、删除结点等基本算法。
给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。
单链表数据域值为整数。
输入:输入第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
解决代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef struct sn
{ int data;
struct sn* next;
}SN;
int main()
{
int n, m, l, a, b, c, i = 0;
scanf("%d", &n);
SN* head, * p, * q, * tail, * node;
head = (SN*)malloc(sizeof(SN));
tail = head;
int cnt = n;
while (n--)
{
scanf("%d", &m);
p = (SN*)malloc(sizeof(SN));
p->data = m;
tail->next = p;
tail = p;
}
tail->next = NULL;
scanf("%d", &l);
int count = 0;
while (l--)
{
q = head;
p = head->next;
scanf("%d", &a);
if (a == 0)
{
scanf("%d%d", &b, &c);
if (b > cnt + count)
{ continue;
}
for (i = 0; i < b; i++)
{ q = p;
p = p->next;
}
node = (SN*)malloc(sizeof(SN));
node->data = c;
node->next = q->next;
q->next = node;
count++;
}
else
{
scanf("%d", &b);
if (b == 0 || b > (count + cnt))
{
continue;
}
else
{
for (i = 1; i < b; i++)
{ q = p;
p = p->next;
}
q->next = q->next->next;
free(p);
count--;
}
}
}
p = head;
for (i = 0; i < cnt+count; i++)
{
p = p->next;
printf("%d ", p->data);
}
return 0;
}