自学内容网 自学内容网

数据结构[2016]

一、设有二维数组A[6][8],每个元素占6个字节存储,实现存放,A[0][0]的起始地址为1000,计算: (10分)

(1)数组最后一个元素A[5][7]的起始地址;

(2)按行优先存放时,元素A[1][4]的起始地址;

(3)按列优先存放时,元素A[4][7]的起始地址。

二、若有一棵二叉树,左右子树均有三个结点,其左子树的前序序列与中序序列相同,右子树的中序序列与后序序列相同,试构造该树。 (10分)

三、首先将下图所示的无向图给出其存储结构的邻接链表表示,然后写出对其分别进行深度优先遍历,广度优先遍历的结果。(10分)

四、已知一棵二叉树的前序遍历的结果是ABECDFGHIJ,中序遍历的结果是EBCDAFHIGJ,试画出这棵二叉树。(10分)

五、使用普里姆算法构造出如下图所示的图G的一棵最小生成树。(10分)

六、任意一个有n个结点的二叉树,已知它有m个叶子结点,试证明非叶子结点有(m-1)个度数为2,其余度数为1。(10分)

七、给出一组关键字(29,18,25,47,58,12,51,10),分别写出按下列各种排序方法进行排序时的变化过程:(15分)

(1)归并排序,每归并一次书写一个次序。

(2)快速排序,每划分一次书写一个次序。

(3)堆排序,先建成一个堆,然后每从堆顶取下一个元素后,将堆调整一次。

八、对关键字序列7,4,1,14,100,30,5,9,20,134,设哈希函数为H(X)=X MOD 13。试给出表长为13的哈希表(用线性探测开放定址法处理冲突)。(15分)

九、假定用于通信的电文仅由8个字母cl,c2,c3,c4,c5,c6,c7,c8组成,各字母在电文中出现的频率分别为5,25,3,6,10,11,36,4。试为这8个字母设计不等长Huffman编码,并给出该电文的总码数。(15分)

十、试写一个双向冒泡排序的算法,即在排序过程中交替改变扫描方向。(15分)

#include <stdio.h>

// 双向冒泡排序函数

void cocktailSort(int arr[], int n) {

    int swapped, start, end;

    do {

        swapped = 0;

        // 从左到右,类似于普通的冒泡排序

        for (int i = start; i < end - 1; i++) {

            if (arr[i] > arr[i + 1]) {

                int temp = arr[i];

                arr[i] = arr[i + 1];

                arr[i + 1] = temp;

                swapped = 1;

            }

        }

        if (!swapped)

            break;

        swapped = 0;

        end--;

        // 从右到左,反向冒泡

        for (int i = end - 1; i >= start; i--) {

            if (arr[i] > arr[i + 1]) {

                int temp = arr[i];

                arr[i] = arr[i + 1];

                arr[i + 1] = temp;

                swapped = 1;

            }

        }

        start++;

    } while (swapped);

}

int main() {

    int arr[] = {5, 1, 4, 2, 8, 0, 2};

    int n = sizeof(arr) / sizeof(arr[0]);

    printf("Original array: ");

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

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

    }

    printf("\n");

    cocktailSort(arr, n);

    printf("Sorted array: ");

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

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

    }

    printf("\n");

    return 0;

}

十一、编写程序求1!+2!+3!+4!+…+30!之和。(15分)

#include <stdio.h>

#include <stdlib.h>

// 计算阶乘

unsigned long long factorial(unsigned int n) {

    unsigned long long fact = 1;

    for (unsigned int i = 1; i <= n; ++i) {

        fact *= i;

    }

    return fact;

}

int main() {

    unsigned long long sum = 0;

    unsigned long long currentFactorial;

    // 计算从 1! 到 30! 的阶乘之和

    for (unsigned int i = 1; i <= 30; ++i) {

        currentFactorial = factorial(i);

        sum += currentFactorial;

        printf("Sum up to %u!: %llu\n", i, sum);

    }

    printf("Sum of factorials from 1! to 30!: %llu\n", sum);

    return 0;

}

十二、定义一个通讯录结构,成员包括:姓名(字符串)、电话(字符串)、生日(日期结构:年、月、日)。编写函数实现数据的输入、输出和按姓名查找。(15分)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

// 定义日期结构

typedef struct {

    int year;

    int month;

    int day;

} Date;

// 定义通讯录结构

typedef struct {

    char name[50]; // 姓名

    char phone[20]; // 电话

    Date birthday; // 生日

} Contact;

// 输入通讯录信息

void inputContact(Contact *contact) {

    printf("Enter name: ");

    fgets(contact->name, sizeof(contact->name), stdin);

    contact->name[strcspn(contact->name, "\n")] = '\0'; // 去掉换行符

    printf("Enter phone: ");

    fgets(contact->phone, sizeof(contact->phone), stdin);

    contact->phone[strcspn(contact->phone, "\n")] = '\0'; // 去掉换行符

    printf("Enter birthday (YYYY MM DD): ");

    scanf("%d %d %d", &contact->birthday.year, &contact->birthday.month, &contact->birthday.day);

    getchar(); // 吃掉换行符

}

// 输出通讯录信息

void outputContact(const Contact *contact) {

    printf("Name: %s\n", contact->name);

    printf("Phone: %s\n", contact->phone);

    printf("Birthday: %d-%02d-%02d\n", contact->birthday.year, contact->birthday.month, contact->birthday.day);

}

// 按姓名查找通讯录信息

int findContactByName(const Contact *contacts, int n, const char *name) {

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

        if (strcmp(contacts[i].name, name) == 0) {

            outputContact(&contacts[i]);

            return 1; // 找到了

        }

    }

    return 0; // 没找到

}

int main() {

    int n;

    printf("Enter the number of contacts: ");

    scanf("%d", &n);

    getchar(); // 吃掉换行符

    Contact contacts[n]; // 通讯录数组

    // 输入通讯录信息

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

        printf("Enter details for contact %d:\n", i + 1);

        inputContact(&contacts[i]);

    }

    // 输出通讯录信息

    printf("\nContacts:\n");

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

        outputContact(&contacts[i]);

    }

    // 按姓名查找通讯录信息

    char searchName[50];

    printf("\nEnter name to search: ");

    fgets(searchName, sizeof(searchName), stdin);

    searchName[strcspn(searchName, "\n")] = '\0'; // 去掉换行符

    if (findContactByName(contacts, n, searchName)) {

        printf("Contact found.\n");

    } else

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


原文地址:https://blog.csdn.net/mufengzhiyu666/article/details/143506142

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!