1 单链表基本操作 (5分)
请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
输入格式:
输入第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>
typedef struct Node
{
int val;
struct Node* next;
}node;
node* head = NULL;
int size = 0;
void insert(int k, int d) {
node* p = (node*)malloc(sizeof(node));
p->val = d;
p->next = NULL;
if (k == 0) {
if(size == 0){
head = (node*)malloc(sizeof(node));
head->val = d;
head->next = NULL;
}
else{
p->next = head;
head = p;
}
}
else
{
if (k > size) return;
node* q = head;
for (int i = 1; i < k; ++i) {
q = q->next;
}
node* t = q->next;
q->next = p;
p->next = t;
}
size++;
}
void delet(int k) {
if (k == 1) {
if(size < 1) return;
node* p = head;
head = head->next;
free(p);
}
else {
if (k > size || k == 0) return;
node* p = head;
for (int i = 1; i < k - 1; ++i) {
p = p->next;
}
node* q = p->next;
p->next = q->next;
free(q);
}
size--;
if(size == 0){
head = NULL;
}
}
void print() {
if(!head) return;
node* p = head;
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
int input(char* str, int i) {
int b = 0;
while (str[i] != '\0') {
b = b * 10 + str[i] - '0';
i++;
}
return b;
}
int* inputN(char* str, int n) {
int str_i = 0;
int tmp = 0;
int ni = 0;
int* num = (int*)malloc(sizeof(int) * n);
while (str[str_i] != '\0')
{
if (str[str_i] == ' ') {
num[ni] = tmp;
tmp = 0;
ni++;
str_i++;
continue;
}
tmp = tmp * 10 + str[str_i] - '0';
str_i++;
}
num[ni] = tmp;
return num;
}
int main() {
char str[1000];
int n = 0;
gets(str);
n = input(str, 0);
gets(str);
int* num = inputN(str, n);
head = (node*)malloc(sizeof(node));
node* root = head;
for (int i = 0; i < n; ++i) {
node* p = (node*)malloc(sizeof(node));
p->val = num[i];
p->next = NULL;
root->next = p;
root = root->next;
size++;
}
head = head->next;
int m;
gets(str);
m = input(str, 0);
while (m--) {
gets(str);
if (str[0] == '0') {
int* num3 = inputN(str, 3);
insert(num3[1], num3[2]);
}
else {
int* num2 = inputN(str, 2);
delet(num2[1]);
}
}
print();
return 0;
}