大家好,欢迎来到IT知识分享网。
链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表。它较顺序表而言在插入和删除时不必移动其后的元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某个元素或者输出当前链表中所有的元素。
下面给你基本的算法描述:
图1:链表类型的定义以及获得链表元素的算法描述
图2:链表的插入算法描述
图3:链表的删除算法描述
图4:链表的创建算法描述
输入
输入数据只有一组,第一行有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”。注:所有的双引号均不输出。
样例输入
样例输出
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define NULL 0
struct stu{
int num;
struct stu *next;
};
int N,n;
int num3;
struct stu *creat(){
struct stu *head;
struct stu *p1=NULL;
struct stu *p2=NULL;
n=0;
p1=(struct stu *)malloc(sizeof(struct stu));
p2=p1;
if(p1==NULL)
return NULL;
else {
head =NULL;
scanf("%d",&(p1->num));
num3=p1->num;
}
while(n<N){
n+=1;
if(n==1){
head=p1;
p2->next=NULL;
}
else{
p2->next=p1;
}
p2=p1;
p1=(struct stu *)malloc(sizeof(struct stu));
scanf("%d",&(p1->num));
num3=p1->num;
}
p2->next=NULL;
free(p1);
p1=NULL;
return head;
};
struct stu *del(struct stu *head,int num){
struct stu *p1;
struct stu *p2;
if(head==NULL){
printf("delete fail\n");
return head;
}
p1=head;
n=1;
while(n<num&&p1->next!=NULL){
p2=p1;
p1=p1->next;
n++;
}
if(n==num){
if(p1==head){
head=p1->next;
}
else{
p2->next=p1->next;
}
free(p1);
p1=NULL;
N-=1;
printf("delete OK\n");
}
else{
printf("delete fail\n");
}
return head;
};
struct stu *insert(struct stu *head,struct stu *node,int num1){
struct stu *p1;
n=1;
if(head==NULL){
if(num1==1){
head=node;
node->next=NULL;
N+=1;
printf("insert OK\n");
}
else
printf("insert fail\n");
return head;
}
p1=head;
if(head!=NULL&&num1==1){
node->next=p1;
head=node;
printf("insert OK\n");
return head;
}
while(n<num1-1&&p1->next!=NULL){
n++;
p1=p1->next;
}
if(n==num1-1){
node->next=p1->next;
p1->next=node;
N++;
printf("insert OK\n");
}
else {
printf("insert fail\n");
}
return head;
};
struct stu *reverse(struct stu *head){
struct stu *p;
struct stu *p1;
struct stu *p2;
p1=NULL;
p2=head;
while(p2!=NULL){
p=p2->next;
p2->next=p1;
p1=p2;
p2=p;
}
head =p1;
return head;
};
void print(struct stu *head){
struct stu *p;
p=head;
if(head!=NULL){
do{
printf("%d",p->num);
p=p->next;
if(p!=NULL)
printf(" ");
}while(p!=NULL);
printf("\n");
}
else printf("Link list is empty\n");
}
void gt(struct stu *head,int num){
struct stu *p;
p=head;
n=1;
while(n<num&&p->next!=NULL){
p=p->next;
n++;
}
if(n==num){
printf("%d\n",p->num);
}
else
printf("get fail\n");
}
int main(){
struct stu *head;
struct stu *stu1;
scanf("%d",&N);
head=creat();
//print(head);
head=reverse(head);
//print(head);
//int num;
int i,j;
//scanf("%d",&num);
//printf("%d\n",num);
char s[20];
int num1,num2;
for(i=0;i<num3;i++){
scanf("%s",s);
if(strcmp(s,"show")==0){
print(head);
}
else if(strcmp(s,"delete")==0){
scanf("%d",&num1);
head=del(head,num1);
}
else if(strcmp(s,"insert")==0){
stu1=(struct stu *)malloc(sizeof(struct stu));
scanf("%d %d",&num1,&(stu1->num));
head=insert(head,stu1,num1);
}
else if(strcmp(s,"get")==0){
scanf("%d",&num1);
gt(head,num1);
}
memset(s,'\0',sizeof(s));
}
return 0;
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21708.html