7-4 单链表基本操作
请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
输入格式:
输入第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 node {
int data;
node*next;
};
int main()
{
int n,m, k, a, b;
scanf("%d", &n);
node* head, * pre, * p;
head = new node;
head->next = NULL;
pre = head;
for(int i=0;i<n;i++)
{
p = new node;
scanf("%d", &p->data);
p->next = NULL;
pre->next = p;
pre = p;
}
scanf("%d", &m);
for(int i=0;i<m;i++)
{
scanf("%d", &k);
if (k == 0)
{
scanf("%d%d", &a, &b);
if (a == 0) {
node* l;
l = new node;
l->data = b;
l->next = head->next;
head->next = l; n++;
}
else if(a<=n)
{
node* pre= head,*p;
for (int j = 0; j < a;j++)
pre = pre->next;
p = new node;
p->data = b;
p->next = pre->next;
pre->next = p; n++;
}
}
if (k == 1)
{
scanf("%d", &a);
if (a != 0 && a <= n)
{
node* pre;
pre = head;
for(int k=1;k<a;k++)
pre = pre->next;
pre->next = pre->next->next;
}
}
}
node* l = head; l = l->next;
while (l != NULL)
{
printf("%d ", l->data);
l = l->next;
}
return 0;
}
基本操作,画画图变一下指针的指向就行,插入就是让新节点的指针先指向它的下一个节点,在让他的上一个节点指向它即可。删除可以往后移一下指针。