X链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表。它较顺序表而言在插入和删除时不必移动其后的元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某个元素或者输出当前链表中所有的元素。
输入数据
输入只有一组,第一行有n+1个整数,第一个整数是这行余下的整数数目n,后面是n个整数。这一行整数是用来初始化列表的,并且输入的顺序与列表中的顺序相反,也就是说如果列表中是1、2、3那么输入的顺序是3、2、1。第二行有一个整数m,代表下面还有m行。每行有一个字符串,字符串是“get”,“insert”,“delete”,“show”中的一种。如果是“get”或者“delete”,则其后跟着一个整数a,代表获得或者删除第a个元素;如果是“insert”,则其后跟着两个整数a和e,代表在第a个位置前面插入e;“show”之后没有整数。
输出数据
输出数据如果获取成功,则输出该元素;如果删除成功则输出“delete OK”;如果获取失败或者删除失败,则输出“get fail”以及“delete fail”。如果插入成功则输出“insert OK”,否则输出“insert fail”。如果是“show”则输出列表中的所有元素,如果列表是空的,则输出“Link list is empty”。注:所有的双引号均不输出。
样例输入
3 3 2 1
21
show
delete 1
show
delete 2
show
delete 1
show
delete 2
insert 2 5
show
insert 1 5
show
insert 1 7
show
insert 2 5
show
insert 3 6
show
insert 1 8
show
get 2
样例输出
1 2 3
delete OK
2 3
delete OK
2
delete OK
Link list is empty
delete fail
insert fail
Link list is empty
insert OK
5
insert OK
7 5
insert OK
7 5 5
insert OK
7 5 6 5
insert OK
8 7 5 6 5
7
代码展示
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
typedef struct jiege
{
int q;
struct jiege *next;
}*Node,node;
//-----------------------------------------------------//
void print(Node biao)//show函数
{
int c=1;
biao=biao->next;
if(biao==NULL)
{
printf("Link list is empty\n");
return;
}
else
{
for(;biao!=NULL;biao=biao->next,c++)
{
printf("%d ",biao->q);
}
printf("\n");
}
}
//----------------------------------------------//
Node shanchu(Node L,int n)//删除节点函数
{
Node p,op,pr;
p=L->next;
int z=0,x;
if(n==1)
{
L->next=p->next;
free(p);
return L;
}
else
{
for(z=1;z<n;z++)
{
op=p;
p=p->next;
}
}
op->next=p->next;
free(p);
return L;
}
//----------------------------------------------------//
Node creat(int w) //建链表函数 (有头节点)
{
Node p,pr,op,head=(Node)malloc(sizeof(node));
head->next=NULL;
p=head;
while(w--)
{
op=(Node)malloc(sizeof(node));
scanf("%d",&op->q);
op->next=head->next;
head->next=op;
}
return p;
}
//-----------------------------------------------------//
void huoqu(Node L,int n)
{
int c;
for(c=0;c<n;c++)
{
L=L->next;
}
printf("%d\n",L->q);
}
//------------------------------------------------------//
Node charu(Node head,int t,int y)//插结点函数
{
int q,e,r;
Node p,op,pr;
p=head;
for(q=0;q<t;q++)
{
op=p;
p=p->next;
}
pr=(Node)malloc(sizeof(node));
pr->q=y;
pr->next=p;
op->next=pr;
op=op->next;
printf("insert OK\n");
return head;
}
//----------------------------------------------------//
main()
{
int w,e,r,t,y,n;
char s[10];
scanf("%d",&w); //w表示链表的长度
Node List=creat(w); //建链表
//print(biao);
// for(biao=biao->next;biao!=NULL;biao=biao->next)
// printf("%d ",biao->q);
scanf("%d",&r);//r表示操作次数
for(e=0;e<r;e++)
{
scanf("%s",&s);
if(strcmp(s,"get")==0)
{
scanf("%d",&n);
if(n>w)
printf(" fail\n");
else
{
huoqu(List,n);
}
}
else if(strcmp(s,"delete")==0)
{
// printf("delete");
scanf("%d",&n);
if(n>w)
{
printf("delete fail\n");
}
else
{
//printf("delete jinxing");
List=shanchu(List,n);
w--; //链表长度减一
printf("delete OK\n");
}
}
else if(strcmp(s,"show")==0)
{
print(List);
}
else if(strcmp(s,"insert")==0)
{
scanf("%d%d",&t,&y);
if(t>w)
{
printf("insert fail\n");
}
else
{
List=charu(List,t,y);
w++;
}
}
}
}