西南交通大学840数据结构编程大题-2008年

第一题

1、请编写函数void Func(int *a, int *n);它的功能是:求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并将它们放在a所指的数组中,通过n返回这些数的个数。注:假设a所指的数组有足够的空间存储满足条件的数。

/*
1、请编写函数void Func(int *a, int *n);它的功能是:求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并将它们放在a所指的数组中,通过n返回这些数的个数。注:假设a所指的数组有足够的空间存储满足条件的数。

*/
#include <stdio.h>
void Func(int *arr, int *n) {
    for (int i = 1; i < 1001; i++) {
        if (i % 7 == 0 && i % 11 == 0) continue;
        if (i % 7 == 0 || i % 11 == 0) {
            *(arr + (*n)++) = i;
        }
    }
}
int main() {
    int arr[1000], n = 0;
    Func(arr, &n);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

第二题

2、编一个函数,用递归方法求n阶勒让德多项式的值。其中:多项式的值通过函数返回,多
项式的阶n以及多项式的变量x通过函数参数传递。递归公式如下:

p n ( x ) = { 1 ( n = 0 ) x ( n = 1 ) ( ( 2 n − 1 ) ∗ x − p n − 1 ( x ) − ( n − 1 ) ∗ p n − 2 ( x ) ) / n ( n ≥ 1 ) p_n(x)=\begin{dcases} 1 & (n=0) \\ x & (n=1) \\ ((2n-1)*x-p_{n-1}(x)-(n-1)*p_{n-2}(x))/n & (n \geq 1) \end{dcases} pn​(x)=⎩⎪⎨⎪⎧​1x((2n−1)∗x−pn−1​(x)−(n−1)∗pn−2​(x))/n​(n=0)(n=1)(n≥1)​

#include <stdio.h>

int temp[100];
int calc(int n, int x) {
    if (temp[n]) return temp[n];
    int res;
    if (n == 0)
        res = 1;
    else if (n == 1)
        res = x;
    else
        res = ((2 * n - 1) * x - calc(n - 1, x) - (n - 1) * calc(n - 2, x)) / n;
    return temp[n] = res;
}
int main() {
    int n, x;
    scanf("%d%d", &n, &x);
    int res = calc(n, x);
    return 0;
}

第三题

3、有一个单链表,其结点的元素值以非递减有序排列,编写一个函数删除该单链表中多余的元素值相同的结点。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Node {
    int data;
    struct Node *next;
} LinkList;
void deletSameEle(LinkList *head) {
    // 答案就是这个函数
    LinkList *p = head->next, *q = head->next;
    while (p) {
        while (q && p->data == q->data)
            q = q->next;
        p->next = q;
        p = p->next;
    }
}
void PrintLink(LinkList *head) {
    // 打印链表
    LinkList *p = head->next;
    while (p) {
        printf("%d->", p->data);
        p = p->next;
    }
    printf("NULL\n");
}
int cmp(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}
int main() {
    int n = 0, arr[100];

    LinkList *head = (LinkList *)malloc(sizeof(LinkList)), *p = head;
    srand((unsigned)time(NULL));

    for (int i = 0; i < n; i++) {
        arr[i] = rand() % 10;
    }
    qsort(arr, n, sizeof 4, cmp);

    for (int i = 0; i < n; i++) {
        LinkList *temp = (LinkList *)malloc(sizeof(LinkList));
        temp->data = arr[i];
        p->next = temp;
        p = p->next;
    }
    p->next = NULL;
    PrintLink(head);
    deletSameEle(head);
    PrintLink(head);
    return 0;
}

第四题

4、设一棵二义树以二叉链表为存储结构,设计一个算法求二义树的高度。
参考oj,acwing:71. 二叉树的深度https://www.acwing.com/problem/content/description/67/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10 // 不能使用const, c语言里面的const表示只读,不能用来定义数组大小
typedef struct TreeNode {
    int data;
    struct TreeNode *lchild, *rchild;
} TreeNode;
int treeDepth(TreeNode *root) {
    // 求二叉树高度
    if (!root) return 0;
    return max(treeDepth(root->lchild), treeDepth(root->rchild)) + 1;
}
int main() {
    // 参考oj,acwing:71. 二叉树的深度<https://www.acwing.com/problem/content/description/67/>
    return 0;
}
上一篇:Windows server 2008 R2远程桌面授权破解方法


下一篇:Windows 2008服务器IIS安装步骤,Windows 2008服务器多界面设置方法