JLU吉林大学21级软件数据结构上机实验(1)

第一次上机一共四道题,话不多说上题

第一题

输入格式:

输入第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 

先上代码

#include 
using namespace std;
struct A{
    int x;
    struct A* next;
};
int main(){
    A *head,*p,*current;
    head=new A;
    head->next=NULL;
    p=head;
    int n;
    cin>>n;
    int i=0;
    while(inext=new A;
        p=p->next;
        p->next=NULL;
        cin>>p->x;
        i++;
    }
    int m;//对链表施加操作数量
    cin>>m;
    int j=0;
    int a,b,c;
    while(jnext;
        cin>>a;
        j++;
        if(a==0){
            cin>>b>>c;
            if(b>n||b<0) continue;
            else if(b==0){
                p=new A;
                p->x=c;
                current=head->next;
                head->next=p;
                p->next=current;
                n+=1;
                continue;
            }
            else {
                for(int k=0;knext;
                }
                p=new A;
                p->x=c;
                p->next=current->next;
                current->next=p;
                n+=1;
                continue;
            }
        }//在第b个结点后插入数值为c的结点
        else if(a==1){
            cin>>b;
            if(b<=0||b>n) continue;
            current=head->next;
            for(int k=0;knext;
            }
            if(b==n){
                current->next=NULL;
                n-=1;
                continue;
            }
            else if(b==1){
                head->next=current->next;
                n-=1;
                continue;
            }
            else{
                p=current->next;
                current->next=p->next;
                n-=1;
            }
        }//删除第b个结点
        else
            continue;
    }
    current=head->next;
    while(current!=NULL){
        cout<x<<' ';
        current=current->next;
    }
    return 0;
}

写的时候没分函数一口气写下来的

要写这道题首先要回链表,放上我的个人创建链表方式,应该是市面上流传的链表方式里面最简单的了,从cprimerplus学来的

#include 
using namespace std;
struct A{
    int x;
    struct A* next;
};
int main() {
    A* p;
    A *head=NULL,*current;//head哨位结点,current当前节点
    head=new A;//为head开辟空间
    head->next=NULL;//空链表哨位结点下一项为空
    p=head;//p为创建链表而设
    int a;//输入总数据项数量
    cin>>a;//输入所读入数据项数量
    int i=0;//计数器
    while(inext=new A;
        p=p->next;
        p->next=NULL;
        cin>>p->x;
        i++;
    }//创建链表

    return 0;
}

这段单纯是创链表,我的current是当前操作结点位置,这个简单的创建思路代码里面不涉及其他操作所以没用上。

下面讲具体实现细节。

首先head是一个哨位结点(不包含数据项),为方便链表创立操作而建

先给head空间,next为空

然后爱建几个建几个,记住最后为空就行

看图咋也想明白了,不行私信我。

JLU吉林大学21级软件数据结构上机实验(1)_第1张图片

JLU吉林大学21级软件数据结构上机实验(1)_第2张图片JLU吉林大学21级软件数据结构上机实验(1)_第3张图片 

JLU吉林大学21级软件数据结构上机实验(1)_第4张图片JLU吉林大学21级软件数据结构上机实验(1)_第5张图片 

然后这题先读入链表长度,然后读入链表元素建链表,读入操作数,在分别处理每行的操作(一行一组操作数)

写个if判断一下,然后读入,然后分别处理,注意判断操作数是否非法,注意插入的时候头节点要特殊处理,删除首尾都要做特殊处理。

然后是栈和队列两道题,赶ddl我就用数组糊弄了,以后再更正经版本

上题

2.栈

题目描述:

给定一个初始为空的栈和一系列压栈、弹栈操作,请编写程序输出每次弹栈的元素。栈的元素值均为整数。

输入格式:

输入第1行为1个正整数 n,表示操作个数;接下来 n 行,每行表示一个操作,格式为1 d 或01 d 表示将整数 d 压栈,0表示弹栈。n 不超过20000

输出格式:

按顺序输出每次弹栈的元素,每个元素一行。若某弹栈操作不合法(如在栈空时弹栈),则对该操作输出 invalid。

输入样例:

7 

1 1 

1 2 

0 

0 

0 

1 3

0

输出样例:

2 

1 

invalid 

3

#include 
using namespace std;
int main() {
    int a,d,n,*c=new int[20000];
    cin>>n;
    int j=-1;
    for(int i=0;i>a;
        if(a==1){
            cin>>d;
            c[++j]=d;
        }
        if(a==0){
                if(j==-1)
                    cout<<"invalid"<

3.队列

给定一个初始为空的队列和一系列入队、出队操作,请编写程序输出每次出队的元素。队列的元素值均为整数。

输入格式:

输入第1行为1个正整数 n,表示操作个数;接下来 n 行,每行表示一个操作,格式为1 d或0。1 d表示将整数 d 入队,0表示出队。n 不超过20000。

输出格式:

按顺序输出每次出队的元素,每个元素一行。若某出队操作不合法(如在队列空时出队),则对该操作输出 invalid。

输入样例:

7 1 1 1 2 0 0 0 1 3 0

输出样例:

1

2

invalid

3

/**************在此输入您的代码*****************/
#include 
using namespace std;
int main() {
    int a,d,n,*c=new int[20000];
    cin>>n;
    int j=-1;
    int k=0;
    for(int i=0;i>a;
        if(a==1){
            cin>>d;
            c[++j]=d;
        }
        if(a==0){
                if(k==(j+1))
                    cout<<"invalid"<

4.特殊约瑟夫(我改了一个数组模拟的代码)

编号为1NN个小朋友玩游戏,他们按编号顺时针围成一圈,从第一个人开始按逆时针次序报数,报到第M个人出列;然后再从下个人开始按顺时针次序报数,报到第 K 个人出列;再从下一个人开始按逆时针次序报数,报到第 M 个人出列;再从下个人开始按顺时针次序报数,报到第K个人出列……以此类推不断循环,直至最后一人出列。请编写程序按顺序输出出列人的编号。

输入格式:

输入为3个正整数,分别表示 N、M、K,均不超过1000

输出格式:

输出为一行整数,为出列人的编号。每个整数后一个空格。

输入样例:

6 3 5

输出样例:

5 3 1 2 4 6 

#include 

using namespace std;

int main(){
    int n, m, k;
    int q[1000];
    cin>>n>>m>>k;
    int i,j;
    for(i=1;i<=n;i++)
        q[i]=i;
    int t=1,r=m,s1,s2;
    s1=1;
    s2=-1;
    for(j=0;jn)s1=1;
            if(q[s1]!=0)t++;
        }
        cout<

你可能感兴趣的:(数据结构,数据结构,链表,算法)