每日一题2023.7.22|链表的基本操作

链表的基本操作

题目描述

考察链表的基本操作

输入

输入数据只有一组,第一行有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
#include
#include
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;
}

每日一题2023.7.22|链表的基本操作_第1张图片

你可能感兴趣的:(每日一题,链表,数据结构,c++,算法)