链表的基本操作
题目描述
考察链表的基本操作
输入
输入数据只有一组,第一行有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",否则输出“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
//链表的一些基本操作(insert\delete\get\show)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct LinkNode{
int val;
LinkNode *next;
LinkNode():val(0),next(nullptr){}
LinkNode(int x):val(x),next(nullptr){}
LinkNode(int x,LinkNode *ne):val(x),next(ne){}
};
LinkNode *built(const vector<int>&);//头插法建立链表
void show(LinkNode*);//打印链表
LinkNode *del(LinkNode *,int );//删除链表中的元素
LinkNode *inse(LinkNode *,int ,int);//向链表中加入元素
void get(LinkNode *,int);//获取链表中的元素
int main(){
int N;cin>>N;//链表元素个数
if(N==0) {cout<<"Link list is empty"<<endl;return 0;}
vector<int> nums(N,0);
for(int i=0;i<N;++i) cin>>nums[i];
LinkNode *list = built(nums);
int cou;cin>>cou;//命令个数
string com;//具体的命令
int in,x;//in表示操作的位置,x表示数值
while(cou--){
cin>>com;
if(com=="show") show(list);
else if(com=="delete"){cin>>in;list = del(list,in);}
else if(com=="get") {cin>>in;get(list,in);}
else if(com=="insert") {cin>>in>>x;list = inse(list,in,x);}
else cout<<"the command is delete or insert or get"<<endl;
}
return 0;
}
//头插法建立链表
LinkNode *built(const vector<int>&nums){
LinkNode *vhead = new LinkNode();//建立虚拟头结点
for(const int&num:nums){
LinkNode *node = new LinkNode(num);
node->next = vhead->next;
vhead->next = node;
}
LinkNode *head = vhead->next;
delete vhead;
return head;
}
//打印链表
void show(LinkNode *head){
if(!head) cout<<"Link list is empty";
while(head){
cout<<head->val<<" ";
head=head->next;
}
cout<<endl;
}
//删除链表中的元素
LinkNode *del(LinkNode *head,int in){
LinkNode *vhead = new LinkNode(0,head);
LinkNode *mv = vhead;
for(int i=1;i<in&&mv->next;++i) mv=mv->next;
if(!(mv->next)) cout<<"delete fail"<<endl;
else {
LinkNode *te = mv->next;
mv->next = mv->next->next;
delete te;
cout<<"delete OK"<<endl;
}
head = vhead->next;
delete vhead;
return head;
}
//向链表中加入元素
LinkNode *inse(LinkNode *head,int in,int x){
LinkNode *vhead = new LinkNode(0,head);
LinkNode *mv = vhead;
for(int i=1;i<in&&mv;++i) mv=mv->next;
if(!mv) cout<<"insert fail"<<endl;
else {
LinkNode *node = new LinkNode(x);
node->next = mv->next;
mv->next = node;
cout<<"insert OK"<<endl;
}
head = vhead->next;
delete vhead;
return head;
}
//获取链表中的元素
void get(LinkNode *head,int in){
for(int i=1;i<in&&head;++i) head=head->next;
if(!head) cout<<"get fail"<<endl;
else cout<<head->val<<endl;
}