PTA——21级数据结构与算法实验1——顺序表

顺序表的建立与遍历

读入n值及n个整数,建立顺序表并遍历输出。

输入格式:

读入n及n个整数

输出格式:

输出n个整数,以空格分隔(最后一个数的后面没有空格)。

输入样例:

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

4
-3 10 20 78

输出样例:

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

-3 10 20 78
#include<stdio.h>

#include<stdlib.h>

struct node

{

    int data;

    struct node *next;

};

struct node *creat(int n)

{

    int i;

    struct node *head,*p,*tail;

    head=(struct node*)malloc(sizeof(struct node));

    head->next=NULL;

    tail=head;

    for(i=0;i<n;i++)

    {

        p=(struct node*)malloc(sizeof(struct node));

        scanf("%d",&p->data);

        p->next=NULL;

        tail->next=p;

        tail=p;

    }

    return head;

}

void show(struct node *p)

{

    while(p)

    {

        if(p->next!=NULL)printf("%d ",p->data);

        else if(p->next==NULL)printf("%d\n",p->data);

        p=p->next;

    }

}

int main()

{

    int n;

    struct node *head;

    scanf("%d",&n);

    head=creat(n);

    show(head->next);

    return 0;

}

递增有序顺序表的插入

实验目的: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>

#include<stdlib.h>

struct node

{

    int data;

    struct node *next;

};

struct node *creat(int n)

{

    int i;

    struct node *head,*p,*tail;

    head=(struct node*)malloc(sizeof(struct node));

    head->next=NULL;

    tail=head;

    for(i=0;i<n;i++)

    {

        p=(struct node*)malloc(sizeof(struct node));

        scanf("%d",&p->data);

        p->next=NULL;

        tail->next=p;

        tail=p;

    }

    return head;

}

void show(struct node *p)

{

    while(p)

    {

        printf("%d,",p->data);

        p=p->next;

    }

    printf("\n");

}

void insert(struct node *head,int n,int x)

{

    struct node *q,*p;

    int i;

    q=(struct node *)malloc(sizeof(struct node));

    p=head->next;

    q->data=x;

    q->next=NULL;

    for(i=0;i<n;i++)

    {

    if(p->data<x)

    {

        if(p->next!=NULL&&p->next->data<x)p=p->next;

        else if(p->next!=NULL&&p->next->data>x)

            {

                q->next=p->next;

                p->next=q;

                break;

            }

    }

    else if(p->data>x)

    {

        if(p->next!=NULL&&p->next->data>x)

            {

                q->next=head->next;

                head->next=q;

                break;

            }

    }

    }

    if(i==n)p->next=q;

}

int main()

{

    int n,x;

    struct node *head;

    scanf("%d",&n);

    head=creat(n);

    scanf("%d",&x);

    insert(head,n,x);

    show(head->next);

    return 0;

}

顺序表删除

已知一组数据,采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素

输入格式:

输入包含三行数据,第一行是表中元素个数,第二行是顺序表的各个元素,第三行是区间x和y。

输出格式:

删除元素值在[x,y]之间的所有元素后,输出新的顺序表。(最后无空格)

输入样例:

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

10
55 11 9 15 67 12 18 33 6 22
10 20

输出样例:

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

55 9 67 33 6 22
#include<stdio.h>

#include<stdlib.h>

struct node

{

    int data;

    struct node *next;

};

struct node *creat(int n)

{

    int i;

    struct node *head,*p,*tail;

    head=(struct node*)malloc(sizeof(struct node));

    head->next=NULL;

    tail=head;

    for(i=0;i<n;i++)

    {

        p=(struct node*)malloc(sizeof(struct node));

        scanf("%d",&p->data);

        p->next=NULL;

        tail->next=p;

        tail=p;

    }

    return head;

}

void show(struct node *p)

{

    while(p)

    {

        if(p->next!=NULL)printf("%d ",p->data);

        else printf("%d",p->data);

        p=p->next;

    }

}

struct node *del(struct node *head,int x,int y)

{

    struct node *p,*q;

    int flag=0;

    p=head;

    while(p->next!=NULL)

    {

        if(p->next->data>=x&&p->next->data<=y)

        {

            q=p->next;

            p->next=q->next;

            free(q);

        }

        else p=p->next;

    }

    return head;

}

int main()

{

    int n,x,y;

    struct node *head;

    scanf("%d",&n);

    head=creat(n);

    scanf("%d%d",&x,&y);

    del(head,x,y);

    show(head->next);

    return 0;

}

数组元素循环右移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>

#include<stdlib.h>

int main()

{

    int i,j,m,n,a[100],t;

    scanf("%d%d",&m,&n);

    for(i=0;i<m;i++)

    {

        scanf("%d",&a[i]);

    }

    for(j=m;j>m-n;j--)

    {

        t=a[m-1];

        for(i=m;i>0;i--)

        {

        a[i]=a[i-1];

        }

        a[i]=t;

    }

    for(i=0;i<m;i++)

    {

        printf("%d ",a[i]);

    }

    return 0;

}

单词逆置

输入一个可能包含若干(至少1个)单词的句子(可以假设每个单词之间有且仅有一个空格,标点符号视为单词的组成部分),输出每个单词逆置后的英文句子(参看样例输出)。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个字符串(长度不超过80),表示英文句子。

输出格式:

对于每组测试,输出每个单词逆置后的英文句子。

输入样例:

1
emoclew era uoY

输出样例:

welcome are You

#include<stdio.h>

#include<stdlib.h>

void reverse(char *l,char *r)

{

    while(l<r)

    {

        char t=*l;

        *l=*r;

        *r=t;

        l++;

        r--;

    }

}

int main()

{

    int T;

    scanf("%d",&T);

    getchar();

    while(T--)

    {

        char a[81];

        gets(a);

        char *end=a,*start=a;

        while(*end!='\0')

        {

            while(*end!=' '&&*end!='\0')

            {

                end++;

            }

            reverse(start,end-1);

            start=end+1;

            if(*end!='\0')end++;

        }

        printf("%s\n",a);

    }

    return 0;

}

最大子列和问题

给定K个整数组成的序列{ N1​, N2​, ..., NK​ },“连续子列”被定义为{ Ni​, Ni+1​, ..., Nj​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:与样例等价,测试基本正确性;
  • 数据2:102个随机整数;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;

输入格式:

输入第1行给出正整数K (≤100000);第2行给出K个整数,其间以空格分隔。

输出格式:

在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。

输入样例:

6
-2 11 -4 13 -5 -2

输出样例:

20
#include<stdio.h>

#include<stdlib.h>

int main()

{

    int K,a[100000],i,j,max=0,now=0;

    scanf("%d",&K);

    for(i=0;i<K;i++)

    {

        scanf("%d",&a[i]);

    }

    for(i=0;i<K;i++)

    {

        now+=a[i];

        if(now>max)max=now;

        if(now<0)now=0;

    }

    printf("%d",max);

    return 0;

}

一元多项式的乘法与加法

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
#include <stdio.h>

//设计数据结构进行表示

typedef struct PolyNode* Polynomial;

struct PolyNode{

int coef;

int expon;

Polynomial link;

};

//连接到多项式后面

void Attach(int c,int e,Polynomial* pRear)

{

Polynomial P;

P=(Polynomial)malloc(sizeof(struct PolyNode)) ;

P->coef=c;

P->expon=e;

P->link=NULL;

(*pRear)->link=P;

*pRear=P;//修改pRear的值 为新添加的这个结点

}



//读入多项式

Polynomial ReadPoly()

{

Polynomial P,Rear,t;

int c,e,N;

scanf("%d",&N);

P=(Polynomial)malloc(sizeof(struct PolyNode));/*链表空头结点*/

P->link=NULL;

Rear=P;

while(N--)

{

scanf("%d %d",&c,&e);

Attach(c,e,&Rear);

} /*将当前项插入多项式尾部*/

t=P;P=P->link;free(t);/*删除临时生成的头结点*/

return P;

 }

 

void PrintPoly(Polynomial P)

{

/*输出多项式*/

int flag=0;

if(!P){printf("0 0\n");return;}

while(P)

{

if(!flag)

flag=1;

else

printf(" ");

printf("%d %d",P->coef,P->expon);

P=P->link;

}

printf("\n");

}



int Compare(int a,int b)

{

if(a>b)return 1;

else if(a<b) return -1;

else return 0;

}



Polynomial Add(Polynomial P1,Polynomial P2)

{

Polynomial front,rear,temp;

int sum;

//为方便表头插入,先产生一个临时空结点作为结果多项式链表头

rear=(Polynomial)malloc(sizeof(struct PolyNode));

front=rear;//由front记录结果多项式链表头结点

while(P1&&P2)

{

switch(Compare(P1->expon,P2->expon))

{

case 1:

Attach(P1->coef,P1->expon,&rear);

P1=P1->link;

break;

case -1:

Attach(P2->coef,P2->expon,&rear);

P2=P2->link;

break;

case 0:

sum=P1->coef+P2->coef;

if(sum)Attach(sum,P1->expon,&rear);

P1=P1->link;

P2=P2->link;

break;

}

}

/*将未处理完的另一个多项式的所有结点依次复制到结果多项式中*/

for(;P1;P1=P1->link) Attach(P1->coef,P1->expon,&rear);

for(;P2;P2=P2->link) Attach(P2->coef,P2->expon,&rear);

rear->link=NULL;

temp=front;

front=front->link;/*令front指向结果多项式的第一个非零项*/

free(temp);/*释放临时空表头结点*/

return front;

}

Polynomial Mult(Polynomial P1,Polynomial P2)

{

Polynomial t1,t2,P,Rear,t;

int c,e;

if(!P1||!P2)return NULL;

t1=P1;t2=P2;

P=(Polynomial)malloc(sizeof(struct PolyNode));

P->link=NULL;

Rear=P;//P作为空节点,Rear负责接收后续的结点

//先用P1的第1项乘以P2,得到P

while(t2)

{

Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);

t2=t2->link;

}

t1=t1->link;



while(t1)

{

t2=P2;Rear=P;

while(t2)

{

e=t1->expon+t2->expon;

c=t1->coef*t2->coef;

while(Rear->link&&Rear->link->expon>e)

Rear=Rear->link;

if(Rear->link&&Rear->link->expon==e)

{

if(Rear->link->coef+c)

Rear->link->coef+=c;

else

{

t=Rear->link;

Rear->link=t->link;

free(t);

}

}

else

{

t=(Polynomial)malloc(sizeof(struct PolyNode));

t->coef=c;t->expon=e;

t->link=Rear->link;

Rear->link=t;Rear=Rear->link;

}

t2=t2->link;

}

t1=t1->link;

}

t2=P;P=P->link;free(t2);

return P;

}

int main(int argc, char** argv) {

Polynomial P1,P2,PP,PS;

P1=ReadPoly();

P2=ReadPoly();

PP=Add(P1,P2);

PS=Mult(P1,P2);

PrintPoly(PS);

PrintPoly(PP);



return 0;

}

合并有序数组

给定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>

struct node

{

    int data;

    struct node *next;

};

struct node *creat(int n)

{

    int i;

    struct node *head,*p,*tail;

    head=(struct node*)malloc(sizeof(struct node));

    head->next=NULL;

    tail=head;

    for(i=0;i<n;i++)

    {

        p=(struct node*)malloc(sizeof(struct node));

        scanf("%d",&p->data);

        p->next=NULL;

        tail->next=p;

        tail=p;

    }

    return head;

}

struct node *merge(struct node *head1,struct node *head2)

{

    struct node *p1,*p2,*tail;

    p1=head1->next;

    p2=head2->next;

    tail=head1;

    free(head2);

    while(p1&&p2)

    {

        if(p1->data<p2->data)

        {

            tail->next=p1;

            tail=p1;

            p1=p1->next;

        }

        else

        {

            tail->next=p2;

            tail=p2;

            p2=p2->next;

        }

    }

    if(p1)tail->next=p1;

    else tail->next=p2;

    return head1;

}

int main()

{

    int n,m;

    struct node *head1,*head2,*p;

    scanf("%d",&m);

    head1=creat(m);

    scanf("%d",&n);

    head2=creat(n);

    head1=merge(head1,head2);

    p=head1->next;

    while(p)

    {

       printf("%d ",p->data);

       p=p->next;

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

救救孩子√

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值