请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
输入格式:
输入第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 "malloc.h"
#define Max 100
struct MyStruct
{
int num;
struct MyStruct* next;
};
typedef struct MyStruct* List;
List GetList(int n);
List InserList(List head, int k, int d);//k节点d数字
List DelList(List head, int k);
void PrintList(List head);
int main() {
List head;
int n, i;
scanf("%d", &n);
head = GetList(n);
scanf("%d", &i);
while (i) {
int flag, k, d;
scanf("%d", &flag);
if (flag == 0) {
scanf("%d %d", &k, &d);
InserList(head, k, d);
}
else {
scanf("%d", &k);
DelList(head, k);
}
i--;
}
PrintList(head);
return 0;
}
//head为空
List GetList(int n) {
List head = NULL, r = NULL;
int t, i;
for (i = 0;i < n;i++) {
scanf("%d", &t);
List p = (List)malloc(sizeof(struct MyStruct));
p->num = t;
p->next = NULL;
if (r == NULL) {
r = p;
head= r;
}
else {
r->next = p;
r = p;
}
}
return head;
}
//0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入
List InserList(List head, int k, int d) {
List r = head;
List p = (List)malloc(sizeof(struct MyStruct));
p->num = d;
p->next = NULL;
int i = 0;
if (k == 0) {
p->next = head->next;
head->next=p;
p->num=head->num;
head->num=d;
return head;
}
while (r != NULL && i < k-1) {
r = r->next;
i = i + 1;
}
if (r == NULL) {
return head;
}
p->next = r->next;
r->next = p;
return head;
}
List DelList(List head, int k) {
int i=1;
if(k==0){
return head;
}
List r = head, t;
while (r != NULL && i < k-1 ) {//找k前一个
r = r->next;
i = i + 1;
}
if (r == NULL) {
return head;
}
t = r->next;
r->next = t->next;
free(t);
return head;
}
void PrintList(List head) {
while (head) {
printf("%d ", head->num);
head = head->next;
}
}