PTA数据结构题目

程序填空题

5-1 打印“Hello World!”,占一行。

#include <iostream>
using namespace std;
int main()
{
   
    cout<<"Hello World!"<<endl;
    return 0;
}

5-2 下列代码的功能是返回带头结点的单链表L的逆转链表。

List Reverse( List L )
{
   
    Position Old_head, New_head, Temp;
    New_head = NULL;
    Old_head = L->Next;

    while ( Old_head )  {
   
        Temp = Old_head->Next;
        Old_head->Next = New_head; 
        New_head = Old_head;  
        Old_head = Temp; 
    }
    L->Next = New_head;
    return L;
}

5-3 输入某年某月某日,判断这一天是这一年的第几天?

#include <stdio.h>
int main(){
   
    int year,month,day;
    int sum;
    int leap;
    int T;
    scanf("%d",&T);
    while(T--)    {
   
        scanf("%d %d %d",&year, &month, &day);
        switch(T)   {
   
        case 1:
            sum=0;
            break;
        case 2:
            sum=31;
            break;
        case 3:
            sum=59;
            break;
        case 4:
            sum=89;
            break;
        case 5:
            sum=120;
            break;
        case 6:
            sum=151;
            break;
        case 7:
            sum=181;
            break;
        case 8:
            sum=212;
            break;
        case 9:
            sum=243;
            break;
        case 10:
            sum=273;
            break;
        case 11:
            sum=304;
            break;
        case 12:
            sum=334;
            break;
       default:
                printf("data error");
            break;
        }
        sum+= day;

        if(year%400==0|| (year%4==0&&year%100!=0))
            leap=1;
        else
            leap=0;
        if(leap == 1)  sum++;
        printf("It is the %dth day.",sum);
    }
    return 0;
}

5-4 输入两个复数的实部与虚部,求出并输出它们的和。要求输出数据保留小数点后两位。

#include <stdio.h>
int main(){
   
    double r1,i1,r2,i2,r3,i3;
    int T;
    scanf("%d",&T);
    while(T--)  {
   
        scanf("%lf %lf %lf %lf",&r1,&i1,&r2,&i2);
        r3 = r1+r2;
        i3 = i1+i2;
        if(r3 == 0)  {
   
            if((2)) {
   
                printf("0\n");
            }else{
   
                printf("%.2lfi\n",i3);
            }
        }else {
   
            if(i3 > 0){
   
                printf("%.2lf+%.2lfi\n",r3,i3);
            }else if(i3 < 0){
   
                printf("%.2lf%.2lfi\n",r3,i3);
            }else{
   
                printf("%.2lf\n",r3);
            }
        }
    }
    return 0;
}

5-5 计算并输出一个非零整数序列(序列非空)中偶数的平均值。所有输入数据用空格隔开,用0结束输入。输出数据保留2位小数。

#include <stdio.h>
int main()
{
   
   int number;
   int sum,n;
   double average;
   n = 0;
   sum = 0;
   scanf("%d",&number);

   while(number!=0){
   
        if(number%2 == 0){
   
            sum += number;
            n ++;
        }
        scanf("%d", &number);
   }
   average = sum/n;
   printf("%.2lf\n",average);
   return 0;
}

5-6 求100-999之间的水仙花数之和(水仙花数 是指一个三位数的各位数字的立方和是这个数本身,如:153=13+53+33)。。

#include <stdio.h>
int main()
{
   
    int d1,d2,d3;
    int n;
    int sum;
    sum = 0;
    for(d1=1; d1<=9; d1++){
   
        for(d2=0; d2<=9; d2++){
   
            for(d3=0; d3<=9; d3++){
   
                n = d1*100 + d2*10 + d3;
                if(d1*d1*d1+d2*d2*d2+d3*d3*d3 == n){
   
                    sum += n;
                }
            }
        }
    }
    printf("%d\n",sum);
    return 0;
}

5-7 计算1+3+5+7+ …… +N的值,N为奇数,且 1<=N<=10001。

#include <stdio.h>
int main()
{
   
    int N;
    int sum;
    int step;
    int number;
    scanf("%d",&N);
    sum = 0;
    step = 2;
    for(number = 1; number <=10001; number+=step )
    {
   
         sum += number;
    }
    printf("%d\n",sum);    
    return 0;
}

5-8 输入一个考试成绩的序列,以-1为结束标记。成绩均为整数,且在0到100之间。序列长度在1到1000之间。计算并输出最高、最低和平均成绩。

输入举例:

10 20 30 40 50 -1

输出举例:

50 10 30.00

#include <stdio.h>
int main()
{
   
   int score; //分数
   int n; //已经输入的数据的数目
   int maxx,minn;
   double average;
   maxx = 0;//假设最高分为0
   minn = 100;//假设最低分为100
   average = 0;//假设平均分为0
   score = 0;
   scanf("%d",&score);
   while(score != -1){
   
      if(score >= maxx){
   
          maxx = score;
      }
      if(score <= minn){
   
          minn = score;
      }

      average =(maxx+minn)/n;
      n++; 

      scanf("%d",&score);
   }
   printf("%d %d %.2lf\n", maxx,minn,average);
   return 0;
}

5-9 用数组来求fibonacci数列问题,打印前20项数列,每行打印4个数。

#include<stdio.h>
int main()
{
   
  int i;
  int f[20]={
   1,1};
  for (i=2;i<20;i++)
    f[i]=f[i-1] + f[i-2];
  for (i=0;i<20;i++)
    {
   if(i%4==0)printf("\n");
      printf("%d ",f[i]);
     }
      return 0;
}

5-10 计算分段函数,测试数据分别是-2、3、7。

img

#include <stdio.h>
#include <math.h>
int main( )
{
   
  float x,f;
  int i;
  for (i=0; i<3; i++) {
   
    scanf("%f",&x);
    if(x<0) f=fabs(x+1);
    else if(x>=0&&x<=5) f=2*x+1;
    else  f=sin(x)+5;
    printf("x=%.2f,y=%.2f\n", x,f);
  }
  return 0;
 }

5-11 输入正整数n,计算s = 1/1! + 1/2! + 1/3! + ……+ 1/n!的值。

#include <stdio.h>
int main( void)
{
      
    int j, k, n;
    double f, s;

    scanf("%d", &n);
    s=0; 
    for (k=1; k<=n; k++){
   
         f=1;
         for(j=1; j<=k; j++) 
             f*=j;
         s=s+1.0/f;
    }
    printf("sum=%f\n", s); 
    return 0;
}

5-12 语句填空:下列 for循环语句将输出: 0 1 2 0 1 2 0 1 2

for( i=1; i<=9; i++ ) printf("%2d", i%3);

5-15 执行以下程序段,输入12-78.5,输出78.5-12

int n;
double x;
scanf("%d-%lf",&n,&x);
printf("%.1f-%d\n", x, n); 

5-16 本题要求用冒泡排序将一组整数按增序排序。冒泡排序每次从头到尾扫描待排序列,检查相邻两数的顺序,如果顺序不对就交换。请补全下列冒泡排序的代码。

typedef struct node *nodeptr;
struct node{
   
   int value;
   nodeptr next;
   /* 一些其他的项,在此忽略 */
};

nodeptr BubbleSort (nodeptr h)
{
   /* h 是带空头结点的链表的头指针 */
   nodeptr p, q;
   int flag_swap;

   if (!h->next)  return h;
   do{
   
      flag_swap = 0;
      p = h;
      while (p->next->next){
   
         if (p->next->value > p->next->next->value ){
   
            flag_swap++;
            q = p->next;
            p->next = q->next;
            q->next = p->next->next;
            p->next->next=q;
         }
         else p = p->next;
      }
   } while (flag_swap > 0);
   return h;
}

5-17 下列代码的功能是利用散列函数hash将一个元素插入到散列表ht[]中。其中list类型的结点包含element类型的项item、以及一个next指针。如果插入成功,则函数返回1,否则返回0。

int insert( struct element item, list_pointer ht[] )
{
   
   int ret, hash_value;
   list_pointer ptr, trail, lead;

   ret = 1;
   hash_value = hash(item.key);
   trail = NULL; lead = ht[hash_value];
   for ( ; lead; trail = lead, lead = lead->next) {
   
      if (!strcmp(lead->item.key, item.key)) {
   
         printf("The key is in the table\n");
         ret = 0;
      }
   }
   if (ret) {
   
      ptr = (list_pointer)malloc(sizeof(struct list));
      ptr->item = item;
      ptr->next = NULL;
      if (trail)
      trail->next = ptr;
      else
      ht[hash_value] = ptr;
   }
   return ret;
}

5-18 下列代码的功能是将二叉树T中的结点按照层序遍历的顺序输出。

typedef struct TreeNode *Tree;
struct TreeNode
{
   
   int Key;
   Tree  Left;
   Tree  Right;
};

void Level_order ( Tree T )
{
   
   Queue Q;

   if ( !T ) return; 
   Q = CreateQueue( MaxElements ); 
   Enqueue( T, Q ); 
   while ( !IsEmpty( Q ) ){
   
      T = Front_Dequeue ( Q ); /* return the front element and delete it from Q */
      printf("%d ", T->Key);
      if ( T->Left ) 
      	 Enqueue(T->Left,Q);
      if ( T->Right ) 
         Enqueue(T->Right,Q);
   }
}

5-19 下列代码的功能是将一列元素{ r[1] … r[n] }按其键值 key 的非递减顺序排序。普通选择排序是每次仅将一个待排序列的最小元放到正确的位置上,而这个另类的选择排序是每次从待排序列中同时找到最小元和最大元,把它们放到最终的正确位置上。

void  sort( list r[], int n )  
{
   
   int i, j, mini, maxi;

   for (i=1; i<n-i+1; i++) {
   
      mini = maxi = i;
      for( j=i+1; j<=n-i+1; ++j ){
   
         if(r[j]->key < r[mini]->key) mini = j; 
         else if(r[j]->key > r[maxi]->key) maxi = j;
      }
      if(mini != i) swap(&r[mini], &r[i]);
      if( maxi != n-i+1 ){
   
         if(maxi == i) swap(&r[mini], &r[n-i+1]);
         else swap(&r[maxi], &r[n-i+1]);
      }
   }
} 

5-20 下列代码的功能是计算给定二叉树T的宽度。二叉树的宽度是指各层结点数的最大值。函数Queue_rearQueue_front分别返回当前队列Q中队尾和队首元素的位置。

typedef struct TreeNode *BinTree;
struct TreeNode
{
   
   int Key;
   BinTree  Left;
   BinTree  Right;
};

int Width( BinTree T )
{
   
   BinTree  p;
   Queue Q;
   int Last, temp_width, max_width;

   temp_width = max_width = 0;
   Q = CreateQueue(MaxElements);
   Last = Queue_rear(Q);
   if ( T == NULL) return 0;
   else {
   
      Enqueue(T, Q);
      while (!IsEmpty(Q)) {
   
         p = Front_Dequeue(Q); 
         temp_width++; 
         if ( p->Left != NULL )  Enqueue(p->Left, Q);
         if ( p->Right != NULL )  Enqueue(p->Right, Q);  
         if ( Queue_front(Q) > Last ) {
   
            Last = Queue_rear(Q);
            if ( temp_width > max_width ) max_width = temp_width;
            temp_width=0;
         } /* end-if */
      } /* end-while */
      return  max_width;
   } /* end-else */
} 

5-21 The function is to return the reverse linked list of L, with a dummy header.

List Reverse( List L )
{
   
    Position Old_head, New_head, Temp;
    New_head = NULL;
    Old_head = L->Next;

    while ( Old_head )  {
   
        Temp = Old_head->Next;
        Old_head->Next = New_head;  
        New_head = Old_head;  
        Old_head = Temp; 
    }
    L->Next = New_head;
    return L;
}

5-23 输入一个字符串(长度不超过100), 去掉其中的空格字符,输出净化后的字符串。

输入样例:

san xiao lian kao

输出样例:

sanxiaoliankao

请补充完成下面的程序。

#include <stdio.h>
#define MAX_LEN 100
int main()
{
   
     char inStr[MAX_LEN+1];
     char outStr[MaxLen+1];
     gets(inStr);
     int i = 0,j=0;
     while(inStr[i] != '\0'){
   
          if(inStr[i] != ' '){
   //不是空格,就留下来
                outStr[j] = inStr[i];
                j++;
          }
          i++;
     }
     outStr[j]='\0'; //设置字符串结束标志
     printf("%s\n", outStr);
     return 0;
}

5-24 班长用QQ给各位同学发送考试分数(0到100之间的整数)。发送的信息包括三行字符串,第一行的字符串的长度-1是分数的百位数字,第二行的字符串的长度-1是分数的十位数字,第三行的字符串的长度-1是分数的个位数字。可是,小明只想知道自己的成绩等级。下面是他写好的程序代码,只是有些地方不知道怎么写,请你帮他。 在下面的例子中第一行字符串长度为1,所以成绩的百位是0;第二行字符串长度为7,所以成绩的百位是6;第三行字符串长度为7,所以成绩的个位是6;所以,分数是66分,等级为D。

输入举例:

C

sanxiao

liankao

输出举例

D

#include <stdio.h>
#include <string.h>
#define MAX1 1
#define MAX2 9
#define MAX3 9
int main()
{
   
    char s1[MAX1+1];
    char s2[MAX2+1];
    char s3[MAX3+1];
     int n1,n2,n3;
     char grade;
     gets( s1 );
     gets( s2 );
     gets( s3 );
     n1 = strlen(s1) - 1; //计算出百位的数字
     n2 = strlen(s2) - 1; //计算出十位的数字
     n3 = strlen(s3) - 1;//计算出个位的数字
     switch(n2){
   
         case 6:grade = 'D'; break;
         case 7:grade = 'C'; break;
         case 8:grade = 'B'; break;
         case 9:grade = 'A'; break;
         default: grade = 'E';break;
     }
     if(n1){
   
        grade = 'A';
     }
     printf("%c\n",grade);
     return 0;
}

5-26 本函数的功能是从有N个元素的线性表A中查找第K小的元素。函数的初始调用为Qselect(A, K, 0, N-1)。请完成下列填空。

ElementType Qselect( ElementType A[], int K, int Left, int Right )
{
   
    ElementType Pivot = A[Left];
    int L = Left, R = Right+1;

    while (1) {
   
        while ( A[++L] < Pivot ) ;
        while ( A[--R] > Pivot );
        if ( L < R ) Swap( &A[L], &A[R] );
        else break;
    }
    Swap( &A[Left], &A[R] );
    if ( K < (L-Left) )
        return Qselect(A, K, Left, R-1);
    else if ( K > (L-Left) )
        return Qselect(A, K-R, R+1, Right);
    else
        return Pivot;
}

函数填空题

6-3 链式表的按序号查找 (10分)

本题要求实现一个函数,找到并返回链式表的第K个元素。

函数接口定义:

ElementType FindKth( List L, int K );    

其中List结构定义如下:

typedef struct LNode *PtrToLNode;
struct LNode {
   
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode List;    

L是给定单链表,函数FindKth要返回链式表的第K个元素。如果该元素不存在,则返回ERROR

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

#define ERROR -1
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
   
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode List;

List Read(); /* 细节在此不表 */

ElementType FindKth( List L, int K );

int main()
{
   
    int N, K;
    ElementType X;
    List L = Read();
    scanf("%d", &N);
    while ( N-- ) {
   
        scanf("%d", &K);
        X = FindKth(L, K);
        if ( X!= ERROR )
            printf("%d ", X);
        else
            printf("NA ");
    }
    return 0;
}

/* 你的代码将被嵌在这里 */

      
    

输入样例:

1 3 4 5 2 -1
6
3 6 1 5 4 2

输出样例:

4 NA 1 2 5 3 

代码:

ElementType FindKth(List L,int K)
{
   
       PtrToLNode p;
       int cnt=1;
       p=L;
       while(p!=NULL&&cnt<K)
       {
   
           p=p->Next;
           cnt++;
       }
       if(cnt==K&&p)
        return p->Data;
       else
        return ERROR;
}

6-4 求二叉树高度 (20分)

本题要求给定二叉树的高度。

函数接口定义:

int GetHeight( BinTree BT );

其中BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
   
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

要求函数返回给定二叉树BT的高度值。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
   
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
int GetHeight( BinTree BT );

int main()
{
   
    BinTree BT = CreatBinTree();
    printf("%d\n", GetHeight(BT));
    return 0;
}
/* 你的代码将被嵌在这里 */

      
    

输出样例(对于图中给出的树):

img

4

代码:

int GetHeight( BinTree BT ){
   
    if(BT==NULL) return 0;
    return (GetHeight(BT->Left)>GetHeight(BT->Right))? GetHeight(BT->Left)+1 : GetHeight(BT->Right)+1;
}

6-5 求m到n之和 (10分)

本题要求实现一个计算m~nm<n)之间所有整数的和的简单函数。

函数接口定义:

int sum( int m, int n );    

其中mn是用户传入的参数,保证有m<n。函数返回的是m~n之间所有整数的和。

裁判测试程序样例:

#include <stdio.h>

int sum(int m, int n);

int main()
{
       
    int m, n;

    scanf("%d %d", &m, &n);
    printf("sum = %d\n", sum(m, n));

    return 0;
}

/* 你的代码将被嵌在这里 */
    

输入样例:

-5 8    

输出样例:

sum = 21   

代码:

int sum(int m,int n)
{
   
	int he;
	for(m,n;m<=n;m++){
   
		he=he+m;
	}
	return he;
}

6-6 多项式求值 (15分)

本题要求实现一个函数,计算阶数为n,系数为a[0]a[n]的多项式f(x)=∑n i=0(a[i] × xi) 在x点的值。

函数接口定义:

double f( int n, double a[], double x );

其中n是多项式的阶数,a[]中存储系数,x是给定点。函数须返回多项式f(x)的值。

裁判测试程序样例:

#include <stdio.h>

#define MAXN 10

double f( int n, double a[], double x );

int main()
{
   
    int n, i;
    double a[MAXN], x;
	
    scanf("%d %lf", &n, &x);
    for ( i=0; i<=n; i++ )
        scanf(%lf”, &a[i]);
    printf("%.1f\n", f(n, a, x));
    return 0;
}

/* 你的代码将被嵌在这里 */

      
    

输入样例:

2 1.1
1 2.5 -38.7    

输出样例:

-43.1    

代码:

double f( int n, double a[], double x) {
   
    double sum = a[0];
    int i, j;
    double b = 1.0;
    for(i=1; i<=n; i++) {
   
        b *= x;
        sum += (a[i] * b);
    }
    
    return sum;
}

6-7 简单求和 (10分)

本题要求实现一个函数,求给定的N个整数的和。

函数接口定义:

int Sum ( int List[], int N );

其中给定整数存放在数组List[]中,正整数N是数组元素个数。该函数须返回NList[]元素的和。

裁判测试程序样例:

#include <stdio.h>

#define MAXN 10

int Sum ( int List[], int N );

int main ()
{
   
    int List[MAXN], N, i;

    scanf("%d", &N);
    for ( i=0; i<N; i++ )
        scanf("%d", &List[i]);
    printf("%d\n", Sum(List, N));

    return 0;
}

/* 你的代码将被嵌在这里 */

      
    

输入样例:

3
12 34 -5

输出样例:

41

代码:

int Sum ( int List[], int N )
{
   
  int sum=0;
  for(int i=0;i<N;i++)
  {
   
    sum+=List[i];
  }
  return sum;
}

6-8 判断奇偶性 (10分)

本题要求实现判断给定整数奇偶性的函数。

函数接口定义:

int even( int n );    

其中n是用户传入的整型参数。当n为偶数时,函数返回1;n为奇数时返回0。注意:0是偶数。

裁判测试程序样例:

#include <stdio.h>

int even( int n );

int main()
{
       
    int n;

    scanf("%d", &n);
    if (even(n))
        printf("%d is even.\n", n);
    else
        printf("%d is odd.\n", n);

    return 0;
}

/* 你的代码将被嵌在这里 */

      
    

输入样例1:

-6    

输出样例1:

-6 is even.        

输入样例2:

5    

输出样例2:

5 is odd.

代码:

int even ( int n ) {
   
    if (0 == n%2) return 1;
    else return 0;
}

6-9 使用函数计算两点间的距离 (10分)

本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。

函数接口定义:

double dist( double x1, double y1, double x2, double y2 );    

其中用户传入的参数为平面上两个点的坐标(x1, y1)和(x2, y2),函数dist应返回两点间的距离。

裁判测试程序样例:

#include 
  • 64
    点赞
  • 296
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值