请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
输入格式:
输入第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//采用的vs
#include <stdio.h>
#include <stdlib.h>
typedef struct node* list;
typedef int position;
struct node
{
int data;
list next;
};
void printlist(list head)
{
list pt = head->next;
while (pt != NULL)
{
printf("%d ", pt->data);
pt = pt->next;
}
printf("\n");
}
list createlist(int n)
{
list tmp, head,pr;
head= (list)malloc(sizeof(struct node));
head->next= NULL;//头指针初始化
pr = head;
for (int i = 0;i < n;i++)
{
tmp = (list)malloc(sizeof(struct node));
scanf("%d", &tmp->data);
pr->next = tmp;
pr = tmp;
}
pr->next = NULL;
return head;
}
list insertlist(list head, position x,int data)
{
list node,pr=head;
int j = 0;
node= (list)malloc(sizeof(struct node));
node->data = data;
if (x == 0)
{
node->next = pr->next;
pr->next = node;
return head;
}
while (pr->next && j < x)
{
pr = pr->next;
j++;
}
if (!pr->next || j > x )
{
return head;
}
node->next = pr->next;
pr->next = node;
return head;
}
list delelist(list head, position x)
{
list pt=head,pr,pf;
if (x == 0)
{
return head;
}
for (int i = 0;i < x - 1;i++)
{
pt = pt->next;
if (pt == NULL)
{
return;
}
}
pr = pt->next;
pf = pr->next;
pt->next = pf;
return head;
}
int main()
{
int n;
scanf("%d", &n);
list l = createlist(n);
int op,x,po,ch;
scanf("%d", &ch);
for (int i = 0;i < ch;i++)
{
scanf("%d", &op);
switch (op)
{
case 0:
scanf("%d %d", &po, &x);
insertlist(l, po, x);
break;
case 1:
scanf("%d", &x);
delelist(l, x);
break;
}
}
printf("输出结果\n");
printlist(l);
return 0;
}
输出结果:
注:主要记录一下自己写的题目,目前只在vs上运行是对的,希望能接收到pta用户的反馈。