用C语言实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。 输入格式: 输入第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
时间: 2023-02-08 21:39:50 浏览: 241
这里是一种实现单链表插入、删除结点算法的C语言示例代码:
```
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *next;
};
struct node *create_list(int *arr, int n) {
struct node *head, *p;
for (int i = 0; i < n; i++) {
struct node *nd = (struct node *)malloc(sizeof(struct node));
nd->data = arr[i];
if (i == 0) {
head = p = nd;
continue;
}
p->next = nd;
p = nd;
}
return head;
}
void print_list(struct node *head) {
for (struct node *p = head; p; p = p->next)
printf("%d ", p->data);
printf("\n");
}
void insert_list(struct node *head, int k, int d) {
struct node *p = head;
for (int i = 0; i < k - 1; i++) {
if (p == NULL) {
return;
}
p = p->next;
}
struct node *nd = (struct node *)malloc(sizeof(struct node));
nd->data = d;
nd->next = p->next;
p->next = nd;
}
void delete_list(struct node *head, int k) {
struct node *p = head;
for (int i = 0; i < k - 1; i++) {
if (p == NULL) {
return;
}
p = p->next;
}
if (p->next == NULL) {
return;
}
struct node *q = p->next;
p->next = q->next;
free(q);
}
int main() {
int n, m;
scanf("%d", &n);
int arr[n];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
scanf("%d", &m);
struct node *head = create_list(arr, n);
for (int i = 0; i < m; i++) {
int op, k, d;
scanf("%d%d", &op, &k);
if (op == 0) {
scanf("%d", &d);
insert_list(head, k, d);
} else {
delete_list(head, k);
}
}
print_list(head);
return 0;
}
```
这段代码中,首先定义了单链表的结构体,
阅读全文