数据结构简介

绪论

基本术语

数据:是客观事物的符号表示
数据元素:数据的基本单位,一个数据元素可以有多个数据项
数据对象:是性质相同的数据元素的集合,是数据的一个子集
数据结构:是相互之间存在的一种或多种特定关系的数据元素的集合;
数据元素通常有四种:
+ 集合
+ 线性结构
+ 树形结构
+ 图状结构或网状结构

存储结构:顺序存储结构链式存储结构

该书表达方式,c语法要求见
c语法归纳

算法设计题

1.16试写一个算法,自大至小依次输出顺序读入的三个整数X,Y和Z的值。

主要通过排序的方法解决的。

void Descending(){
    //注意,要保证最少的移动和判断 
    //最终结果是a > b > c
    int a,b,c,max_num; 
    scanf("%d %d %d",&a,&b,&c);
    //这里用了排序方法,将a,b,c从大到小排序
    int temp = 0;
    if(a < b){   //temp拿到a的值,temp值为现在b的值
        temp = a;
        a = b;
        b = temp;
    }
    if(b < c){
        //先把c的值确定 
        temp = c;
        c = b;

        if(a > temp){ //temp值是原来c的值,这里判断c是最大值还是第二大值
            b = temp;
        } else{ 
            b = a;
            a = temp;
        }   
    }
    printf("%d %d %d",a,b,c);
}

刚开始感觉好复杂啊。

1.17已知k阶斐波拉切序列的定义为

f0 = 0 , f1 = 0 ,…, fk-2 = 0 , fk-1 = 1;
fn = fn-1 + fn-2 +…+ fn-k , n = k , k+1 ,…
试编写求k阶斐波拉切数列的第m项值的函数算法,k和m均以值调用形式在函数参数表中出现
递归写法

int Fab(int k, int m) {
    //k 是k阶的意思
    //m 是第m项的值 
    if (m < k - 1)
    {
        return 0;
    }
    else if (m == k - 1)
    {
        return 1;
    }
    else 
    {
        int count = 0;
        for (int i = m - 1; i >= m - k; i--)
        {
            count += Fab(k, i);
        }
        return count;
    }
}  

循环写法
目前只写出二阶

int fabdiao(int k,int m) {
    //k 是k阶的意思
    //m 是第m项的值
    int a = 0;
    int b = 1;
    int temp = 0;
    for(int i = 0;i < m;i++)
    {
        temp = b;
        b = a + b;
        a = temp;

    }
    return a;
}

1.18假设有A,B,C,D,E五个高等院校对抗田径赛,各院校的单项成绩均以存入计算机,并构成一张表,表中每一行的形式为

|项目名|性别|校名|成绩|得分|
|-|-|-|-|-|
编写一个算法,处理上述表格,以统计各院校的男、女总分和团体总分,并输出。

#include <stdio.h>
#include <stdlib.h>
const int REPORT_SIZE = 10; 
const int EVENT_SIZE = 3;
typedef enum {A,B,C,D,E}SchoolName;
typedef enum{FEMALE,MALE}SexType;
typedef struct {
    char event[EVENT_SIZE]; //一个项目由3个字符串组成
    SexType sex;           //性别
    SchoolName school;     //学校
    int score;             //成绩
}Component;
typedef struct {
    int malessum;//男团总分
    int femalesum;//女团总分  
    int totalsum;//团体总分
}Sum;  
Component report[REPORT_SIZE];  //代表记录条数  
Sum result[5]; //代表5个学校
//男总分,女总分,团总分
void main() {
    for (int i = 0; i < REPORT_SIZE; i++)
    {
        switch (report[i].sex)
        {
        case FEMALE:
            result[report[i].school].femalesum = report[i].score;
            break;
        case MALE:
            result[report[i].school].malessum = report[i].score;
            break;
        default:
            break;
        }
        result[report[i].school].totalsum = report[i].score;
    }
    for (int i = 0; i < 5; i++)
    {
        printf("%d %d %d",result[i].femalesum, result[i].malessum,result[i].totalsum);
    }
    return;
}

1.19试编写算法,计算!*2i(i=0,1,…,n-1)的值并分别存入数组a[arrsize]的各个分量中。假设计算机中允许的整数最大值为MAXINT,则当n>arrsize或对某个k(0<=k<=n-1)使k!*2k>MAXINT时,应按出错处理。注意选择你认为较好的出错处理方法。

#include <stdlib.h>  
#include <stdio.h>
#define MAXINT INT_MAX
#define TRUE 1
#define FALSE 0
typedef int Status;
Status Function(int n,int* a);
Status numToStr(int num, int* a);
const int ARISE = 10;
int a[ARISE] = {};
int main() {
    printf("%d\n", INT_MAX);
    int sta = numToStr(655353, a);
    printf("%d ", sta);
    for (int i = 0; i < 11; i++)
    {
        if (!Function(i, a)) {
            printf("越界了!!!");
        }
        for (int i = 0; i < ARISE; i++)
        {
            printf("%d", a[i]);
            a[i] = 0;//顺便清空数组
        }
        printf("\n");

    }
    system("pause");
    return 0;
}  
//循环写法
Status Function(int n,int* a) {
    //n循环数,a为数组
    //计算i的阶乘和乘以2的i次幂,i=0,...n-1
    //分析,每次增加2i   1*1  1*2    1*2*2*2    1*2*3*2*2*2  
    long long int result = 1;
    for (int i = 1; i <= n; i++)
    {
        result = result * 2 * i;
        if (result > MAXINT)
        {
            return FALSE;
        }
    }
        //将数字转换到数组中
    if (!numToStr(result, a)) {
        return FALSE;
    }
    return TRUE;
}
Status numToStr(int num,int* a){
    int div = num; // 得到商
    int floor = 0;//得到余数
    int i = ARISE - 1;//记录位数,从后向前移动
    while (div / 10)
    {
        floor = div % 10;
        div =  div/10;
        a[i--] = floor;  //得到每次的余数,位数向前移动一位
        if (i < 0) //当i = 0时,不能继续循环,数组不够存了,0号为本应该给个位数的
        {
            return FALSE;
        }
    }
    a[i] = div;//最后一次< 10的商为个位数
    return TRUE;
}

1.20试编写算法求一元多项式 pn(x)=ni=0aixi p n ( x ) = ∑ i = 0 n a i x i 的值 pn(x0) p n ( x 0 ) ,并确定算法中每一语句的执行次数和整个算法的时间复杂度。注意选择你认为较好的输入和输出方法。本题输入为 ai(i=0,1,,n) a i ( i = 0 , 1 , … , n ) , x0 x 0 和n,输出为 pn(x0) p n ( x 0 ) .

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值