数据结构题集(严蔚敏版)题目——第一章 绪论

今天数据结构课程开课了,早就听说这门课的重要性,于是决定每上完一次课将当堂学过的东西复习一下,然后做一下习题。这里记录一下自己的实现。

第一章绪论的内容并不多,主要是后面有5个算法设计题,这些算法也不难。所以今天的任务还算简单啦。


第一题:

/**试写一算法,自大到小依次输出顺序读入的三个整数X,Y和Z的值*/
void SortThreeNum();
其实这个题不写不知道,一写还真看出自己有多菜来了。本以为很简单,结果却想了很长时间也没想出个简单方法,最后想出来的方法与答案相比弱爆了。底子欠佳啊 委屈
void SortThreeNum()
{
    int num1, num2, num3;
    
    printf("请输入三个整数(用逗号隔开)\n");
    scanf("%d,%d,%d", &num1, &num2, &num3);
    
    int max = num1, min = num1;
    
    if (num1 > num2) {
        min = num2;
    }
    if (min > num3) {
        min = num3;
    }
    
    if (num1 < num2) {
        max = num2;
    }
    if (max < num3) {
        max = num3;
    }
    
//书中给出的答案
//    int temp;
//    if (num1 < num2) {
//        temp = num1;    num1 = num2;    num2 = temp;
//    }
//    if (num2 < num3) {
//        temp = num3;    num3 = num2;
//        if (num1 >= temp) {
//            num2 = temp;
//        } else {
//            num2 = num1;
//            num1 = temp;
//        }
//    }
    
    printf("%d %d %d\n", max, num1 + num2 + num3 - max - min, min);
}

第二题:

/**已知k阶斐波那契序列的定义为
 f0 = 0, f1 = 0, f2 = 0…………fk-2 = 0, fk-1 = 1;
 fn = fn-1 + fn-2 + ………… + fn-k, n = k, k + 1, …………
 试编写求k阶斐波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现*/
void CalculateFibonacci(int k, int m);


这个题一开始看还真没看懂什么意思,其实这个是斐波那契数列的扩展,阶数任意。这里不用递归实现,因为递归的效率低。


/**
 *分析:k阶斐波那契序列的第m项的值f[m]=f[m-1]+f[m-2]+......+f[m-k]
 *=f[m-1]+f[m-2]+......+f[m-k]+f[m-k-1]-f[m-k-1]
 *=2*f[m-1]-f[m-k-1]
 */
void CalculateFibonacci(int k, int m)
{
    int temp[m + 1];
    
    if (m < 0) {
        return;
    }
    if (m <= k - 2) {
        printf("0\n");
        return;
    } else if (m == k - 1 || m == k) {
        printf("1\n");
        return;
    }
    
    for (int i = 0; i <= k - 2; i++) {
        temp[i] = 0;
    }
    temp[k - 1] = 1;
    temp[k] = 1;
    
    int j = 0;
    for (int i = k + 1; i <= m; i++, j++) {
        temp[i] = 2 * temp[i - 1] - temp[j];
    }
    printf("%d\n", temp[m]);
}

第三题:

/**假设有A,B,C,D,E五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,并构成一张表,表中每一行的形式为
 项目名称   性别  校名  成绩  得分
 编写算法,处理上述表格,以统计各院校的男女总分和团体总分,并输出*/
void HandleTable();

这个其实更多的是看数据结构定义地如何,定义好了就比较简单了,就是个简单地累和而已。


typedef enum {A, B, C, D, E} SchoolType;
typedef enum {female, male} SexType;

typedef struct {
    SchoolType school;
    char projectName[20];
    SexType sex;
    int score;
}Component;

typedef struct {
    int maleSum;
    int femaleSum;
    int totalSum;
}SumScore;

#define TimesOfMatches 20

Component report[TimesOfMatches];
SumScore  result[5];

void HandleTable()
{
    for (int i = 0; i < TimesOfMatches; i++) {
        SchoolType schoolNum = report[i].school;
        int score = report[i].score;
        
        if (report[i].sex == male) {
            result[schoolNum].femaleSum += score;
        } else {
            result[schoolNum].maleSum += score;
        }
        result[schoolNum].totalSum += score;
    }
}

第四题:

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

这个题有个地方值得注意,就是判定该式是否大于MAXINT的时候,不能直接用if(表达式 > MAXINT)来比较,因为MAXINT本身就是计算机能表示的最大的数 ,因此这里必须用if(MAXINT - 表达式 > 0)来判断


#define MAXINT          65535
#define ARRSIZE         20

void CalculateExp(int n)
{
    if (n > ARRSIZE || n <= 0) {
        printf("n值出错");
        return;
    }
    
    int a[ARRSIZE];
    //表示阶乘结果
    int factorial = 1;
    //表示2的i次幂
    int power = 1;
    
    for (int i = 0; i < ARRSIZE; i++) {
        a[i] = 0;
    }
    
    for (int i = 0; i < n; i++) {
        if (i != 0) {
            if (MAXINT - i * factorial * power * 2 >= 0) {      //合理
                a[i] = i * factorial * power * 2;
                factorial *= i;
                power *= 2;
            } else {        //溢出
                printf("溢出\n");
                return;
            }
        } else {        //首次循环单独处理
            a[i] = 1;
        }
    }
    
    for (int i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
}

第五题:

/**试编写算法求一元多项式Pn(x) = ∑(i:0...n)(a[i]*x^i)的值Pn(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度。
 注意选择你认为较好地输入输出方法,本题的输入为a[i](i = 0,1,...n),xn和n,输出为Pn(x0)*/
void CalculatePolynome();

这个题中关于x^i的计算同上一题,在循环中迭代即可。提示中说不要一项一项地计算,我可能就是挨个计算的,不知道更有效的实现方式是什么,求解- -

#define MAX_POWER 20

void CalculatePolynome()
{
    //最高次数
    int n;
    //存放每一项系数
    int a[MAX_POWER];
    //预计算的值
    int x0;
    
    printf("请输入最高次数n\n");
    scanf("%d", &n);
    if (n >= MAX_POWER) {
        printf("n出错\n");
        return;
    }
    printf("请依次输入每一项的系数a[i](从小到大)\n");
    for (int i = 0; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    printf("请输入要计算的值x0\n");
    scanf("%d",&x0);
    
    int result = a[0];
    for (int i = 1, j = x0; i <= n; i++,j *= x0) {
        result += a[i] * j;
    }
    
    printf("%d\n", result);
}



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