SDUT数据结构与算法第一次机测

目录

7-1 数组元素循环右移n位

7-2 递增有序顺序表的插入

7-3 合并有序数组

 7-4 头插法创建单链表、遍历链表、删除链表(此题提供两种解法)

7-5 单链表就地逆置

7-6 约瑟夫环(押题,非常重要)

7-1 数组元素循环右移n位

从键盘接收两个整数m和n,分别表示一维整型数组的元素个数,和要向移动的位数。已知0<m<=100,以及n>0。

在用户输入m和n后,第二行输入相应个数的数组元素。

程序要实现的功能是,让数组元素往右移动n位

例如,数组的5个元素是:1,2,3,4,5。

往右移动1位后:5,1,2,3,4

往右移动2位后:4,5,1,2,3

输入格式:

第一行输入两个整数,第二行输入数组元素。

输出格式:

移动后,数组的每一个元素,注意每个数组元素后有且仅有一个空格。

输入样例:

第一行的数据5和2,表示数组容量为5,让数组元素往右移动2个位置。

第二行是数组的每一个元素的值。

5 2
1 2 3 4 5 

输出样例:

输出移动后的数组元素值,注意每个元素后有且仅有一个空格。

4 5 1 2 3 
#include<stdio.h>
void youyi(int a[],int m,int n)
{
    int i,t,j;
    for(i=0;i<n;i++)
    {
        t=a[m-1];
        for(j=m-1;j>=0;j--)
        {
            a[j]=a[j-1];
        }
        a[0]=t;
    }
}
int main()
{
    int m,n,i,j;
    int a[100000];
    scanf("%d %d",&m,&n);
    for(i=0;i<m;i++)
    {
        scanf("%d",&a[i]);
    }
    youyi(a,m,n);
    for(j=0;j<m;j++)
    {
        printf("%d ",a[j]);
    }
    return 0;
}

7-2 递增有序顺序表的插入

实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现
已知顺序表L递增有序,将X插入到线性表的适当位置上,保证线性表有序。。

输入格式:

第1行输入顺序表长度,第2行输入递增有序的顺序表,第3行输入要插入的数据元素X。

输出格式:

对每一组输入,在一行中输出插入X后的递增的顺序表。

输入样例:

在这里给出一组输入。例如:

5
1 3 5 7 9
6

输出样例:

在这里给出相应的输出。例如:

1,3,5,6,7,9,
#include<stdio.h>
int main()
{
    int n,i,j,t;
    scanf("%d",&n);
    int a[n+1];
    for(i=0;i<n+1;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<n+1;i++)
    {
        for(j=0;j<n-i;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    for(i=0;i<n+1;i++)
    {
        printf("%d,",a[i]);
    }
    return 0;
}

7-3 合并有序数组

给定2个非降序序列,要求把他们合并成1个非降序序列。假设所有元素个数为N,要求算法的时间复杂度为O(N)。

输入格式:

输入有4行。
第1行是一个正整数m,表示第2行有m个整数,这些整数构成一个非降序序列,每个整数之间以空格隔开。第3行是一个正整数n,表示第4行有n个整数,这些整数也构成一个非降序序列,每个整数之间以空格隔开。

输出格式:

把第2行的m个整数和第4行的n个整数合并成一个非降序序列,输出这个整数序列。每个数之间隔1个空格。

输入样例:

6
1 3 6 6 8 9  
4
2 4 5 7

输出样例:

1 2 3 4 5 6 6 7 8 9 
#include <stdio.h>
#include <stdlib.h>
void mergeArrays(int* arr1, int m, int* arr2, int n, int* result)//int *arr1就是代表数组的意思 
{
    int i = 0, j = 0, k = 0;
    while (i < m && j < n)//确保数组都没有越界
    {
        if (arr1[i] <= arr2[j]) //如果第一个数组中的数小于第二个中的数,那我们就把这个小的数先放进去result,这样小的数就放在了前面
        {
            result[k] = arr1[i];
            k++;//此时就把k往后加1,准备存储下一个数
            i++;//此时i也加1,准备比较下一个数
        } 
        else
        {
            result[k] = arr2[j];
            k++;
            j++;
        }
    }
    while (i < m) {
        result[k] = arr1[i];
        k++;
        i++;
    }//如果上述while循环中有一个不满足条件,也就是说有一个已经遍历完了,这个时候就直接把没遍历完的那一个直接写到result就可以
    while (j < n) {
        result[k] = arr2[j];
        k++;
        j++;
    }
}
int main() {
    int m;
    scanf("%d", &m);
    int arr1[m];
    for (int i = 0; i < m; i++) {
        scanf("%d", &arr1[i]);
    }
    int n;
    scanf("%d", &n);
    int arr2[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr2[i]);
    }
    int result[m+n];
    mergeArrays(arr1, m, arr2, n, result);
    for (int i = 0; i < m + n; i++) {
        printf("%d ", result[i]);
    }
    printf("\n");
    return 0;
}

 7-4 头插法创建单链表、遍历链表、删除链表(此题提供两种解法)

输入一系列自然数(0和正整数),输入-1时表示输入结束。按照输入的顺序,用头插法建立单链表,并遍历所建立的单链表,输出这些数据。注意 -1 不加入链表。

输入格式:

第一行是一个正整数k,表示以下会有k组测试数据。

每组测试数据是一系列以空格隔开的自然数(0和正整数)。数列末尾的 -1 表示本组测试数据结束。按照输入的顺序,用头插法建立单链表,并遍历所建立的单链表,输出这些数据。注意 -1 不加入链表。

输出格式:

对于每组测试数据,输出链表中各节点的数据域。每个数据后有一个空格。每组测试数据的输出占1行。

输入样例:

3
1 2 3 4 5 -1 
30 20 10 -1 
4 2 2 1 1 2 0 2 -1 

输出样例:

在这里给出相应的输出。例如:

5 4 3 2 1 
10 20 30 
2 0 2 1 1 2 2 4 

注意:对每组测试数据,创建链表,遍历链表输出之后,一定要删除链表,否则会出现“内存超限”。

(1)数组模拟链表解法

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        int a[1000000];
        int i=0;
        while(scanf("%d",&n)!=EOF)
        {
            if(n==-1)
            {
                break;
            }
            else
            {
                a[i]=n;
                i++;
            }
        }
        for(int j=i-1;j>=0;j--)
        {
            if(j==0)
            {
                printf("%d \n",a[j]);
            }
            else
                printf("%d ",a[j]);
        }
    }
    return 0;
}

(2)传统链表

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *next;
};
struct node *creat()
{
    struct node *head,*p;
    int x;
    head=(struct node*)malloc(sizeof(struct node));
    head->next=NULL;
        while(scanf("%d",&x)!=EOF&&x!=-1)
        {
            p=(struct node*)malloc(sizeof(struct node));
            p->data=x;
            p->next=head->next;
            head->next=p;
        }
    return head;
}
void delete(struct node*head)
{
    struct node*p;
    while(head->next)
    {
        p=head->next;
        head->next=p->next;
        free(p);
    }
}
int main()
{
    struct node *head,*p;
    int k;
    scanf("%d",&k);
    while(k--)
    {
        head=creat();
        p=head->next;
        while(p)
        {
                printf("%d ",p->data);
            p=p->next;
        }
        printf("\n");
        delete(head);
    }
    return 0;
}

7-5 单链表就地逆置

输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表进行就地逆置(不增加新结点),并输出逆置后的单链表数据。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入多个整数,以-1作为该组测试的结束(-1不处理)。

输出格式:

对于每组测试,输出逆置后的单链表数据(数据之间留一个空格)。

输入样例:

1
1 2 3 4 5 -1

输出样例:

5 4 3 2 1
#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *next;
};
struct node *creat()
{
    struct node *head,*p;
    int x;
    head=(struct node*)malloc(sizeof(struct node));
    head->next=NULL;
    while(scanf("%d",&x)!=EOF&&x!=-1)
    {
        p=(struct node*)malloc(sizeof(struct node));
        p->next=NULL;
        p->data=x;
        p->next=head->next;
        head->next=p;
    }
    return head;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        struct node*head,*r;
        head=creat();
        r=(struct node*)malloc(sizeof(struct node));
        r=head->next;
        while(r)
        {
            if(r->next==NULL)
                printf("%d\n",r->data);
            else
                printf("%d ",r->data);
                    r=r->next;
        }
    }
    return 0;
}

7-6 约瑟夫环(押题,非常重要)

N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。
请按退出顺序输出每个退出人的原序号。

输入格式:

输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。

输出格式:

按退出顺序输出每个退出人的原序号,数据间以一个空格分隔,但行尾无空格。

输入样例:

在这里给出一组输入。例如:

7 3

输出样例:

3 6 2 7 5 1 4
#include<stdio.h>
#include<stdlib.h>
struct node{
    int data;
    struct node *next;
};
struct node *creat(int n)
{
    struct node *head,*tail,*p;
    p=(struct node*)malloc(sizeof(struct node));
    p->data=1;
    p->next=NULL;
    tail=head=p;
    for(int i=2;i<=n;i++)
    {
        p=(struct node*)malloc(sizeof(struct node));
        p->data=i;
        p->next=NULL;
        tail->next=p;
        tail=p;
    }
    tail->next=head;
    return head;
}
int main()
{
    struct node *head,*p,*q;
    int n,m;
    scanf("%d %d",&n,&m);
    head=creat(n);
    q=head;
    while(q->next!=head)
        q=q->next;
    int a=0;
    while(q->next!=q)
    {
        p=q->next;
        a++;
        if(m==a)
        {
            printf("%d ",p->data);
            q->next=p->next;
            free(p);
            a=0;
        }
        else
            q=p;
    }
    printf("%d",q->data);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值