• 数据结构——线性表作业


    目录

    选择题和填空题

    编程题

    1. 输出单链表倒数第K个结点值

    单链表

    双指针

    2. 数组元素移动

    3. 多项式相加

    4. 数组的循环左移


    选择题和填空题


    编程题

    1. 输出单链表倒数第K个结点值

    【问题描述】

    输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个节点。

    【输入形式】

    输入第一位为K值,其后接一串以空格分隔的整型值。
    【输出形式】

    输出为倒数第K个结点的值,若无,则输出Not Found

    【样例输入】

    3 13 45 54 32 1 4 98 2

    【样例输出】

    4

    【样例说明】

    K值为3,则输出链表倒数第3个结点的值,为4;数据输入间以空格隔开
    【评分标准】

    本题要综合输出正确性及使用的数据结构。需由输入数据构建单链表。不使用链表的将不得分。

    单链表

    1. #include
    2. #include
    3. typedef struct Node {
    4. int num;
    5. struct Node* next;
    6. } Node, * LinkList;
    7. int main() {
    8. LinkList head = NULL;
    9. LinkList tail = NULL;
    10. int k;
    11. scanf("%d", &k);
    12. int n;
    13. while (scanf("%d", &n) != EOF) {
    14. LinkList newNode = (LinkList)malloc(sizeof(Node));
    15. newNode->num = n;
    16. newNode->next = NULL;
    17. if (head == NULL) {
    18. head = newNode;
    19. tail = newNode;
    20. } else {
    21. tail->next = newNode;
    22. tail = tail->next;
    23. }
    24. }
    25. LinkList p = head;
    26. int count = 0;
    27. while (p != NULL) {
    28. count++;
    29. p = p->next;
    30. }
    31. if (k <= 0 || k > count) {
    32. printf("Not Found\n");
    33. } else {
    34. p = head;
    35. for (int i = 0; i < count - k; i++) {
    36. p = p->next;
    37. }
    38. printf("%d\n", p->num);
    39. }
    40. p = head;
    41. while (p != NULL) {
    42. LinkList temp = p;
    43. p = p->next;
    44. free(temp);
    45. }
    46. return 0;
    47. }

    双指针

    1. #include
    2. #include
    3. typedef struct Node {
    4. int num;
    5. struct Node* next;
    6. } Node, * LinkList;
    7. int main() {
    8. LinkList head = NULL;
    9. LinkList tail = NULL;
    10. int k;
    11. scanf("%d", &k);
    12. int n;
    13. while (scanf("%d", &n) != EOF) {
    14. LinkList newNode = (LinkList)malloc(sizeof(Node));
    15. newNode->num = n;
    16. newNode->next = NULL;
    17. if (head == NULL) {
    18. head = newNode;
    19. tail = newNode;
    20. } else {
    21. tail->next = newNode;
    22. tail = tail->next;
    23. }
    24. }
    25. LinkList p = head;
    26. LinkList temp=head;
    27. if (k <= 0) {
    28. printf("Not Found\n");
    29. } else {
    30. p = head;
    31. temp=head;
    32. while(k && temp){
    33. temp=temp->next;
    34. k--;
    35. }
    36. while(temp){
    37. temp=temp->next;
    38. p=p->next;
    39. }
    40. if(k > 0){
    41. printf("Not Found\n");
    42. return 0;
    43. }
    44. printf("%d\n", p->num);
    45. }
    46. return 0;
    47. }

    2. 数组元素移动

    【问题描述】
     将整数数组A[0..n],将其分为两部分,左边所有元素为奇数,右边所有元素为偶数。数组元素个数不超过1000。
    【输入形式】
     以逗号隔开的所有元素
    【输出形式】
     依次打印调整后的数组元素,元素间以逗号隔开。奇数序列和偶数序列分别按原序列中的顺序依次输出
    【样例输入】

    1,2,33,8,5

    【样例输出】

    1,33,5,2,8

    【评分标准】

    1. #include
    2. #include
    3. int main() {
    4. int n;
    5. int arr[1000];
    6. int size = 0;
    7. while (scanf("%d,", &n) != EOF) {
    8. arr[size] = n;
    9. size++;
    10. }
    11. int *arr1 = (int*) malloc(size * sizeof(int));
    12. int *arr2 = (int*) malloc(size * sizeof(int));
    13. int size1 = 0, size2 = 0;
    14. for (int i = 0; i < size; i++) {
    15. if (arr[i] % 2 != 0) {
    16. arr1[size1] = arr[i];
    17. size1++;
    18. } else {
    19. arr2[size2] = arr[i];
    20. size2++;
    21. }
    22. }
    23. for (int i = 0; i < size1; i++) {
    24. printf("%d", arr1[i]);
    25. if (i < size1 - 1) {
    26. printf(",");
    27. }
    28. }
    29. if(size1>=1&&size2!=0){
    30. printf(",");
    31. }
    32. for (int i = 0; i < size2; i++) {
    33. printf("%d", arr2[i]);
    34. if (i < size2 - 1) {
    35. printf(",");
    36. }
    37. }
    38. free(arr1);
    39. free(arr2);
    40. return 0;
    41. }

    3. 多项式相加

    【问题描述】

    编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加的函数。A,B刚开始是无序的,A与B之和按降序排列。例如:

    多项式A:  1.2X^0  2.5X^1  3.2X^3  -2.5X^5

    多项式B:  -1.2X^0  2.5X^1  3.2X^3   2.5X^5   5.4X^10
    多项式A与B之和:5.4X^10  6.4X^3  5X^1
    【输入形式】

    任意两个多项式A和B
    【输出形式】

    多项式中某一项的系数与指数,系数保留一位小数

    【输入样例】

    1.2 0 2.5 1 3.2 3 -2.5 5
    -1.2 0 2.5 1 3.2 3 2.5 5 5.4 10
    2

    【输出样例】

    6.4 3

    【样例说明】
    第一个多项式的系数与指数对,以空格隔开
    第二个多项式的系数与指数对,以空格隔开
    输出第2项的系数与指数,系数与指数间用空格隔开,系数保留一位小数

    【评分标准】

    必须用链表实现

    1. #include
    2. #include
    3. typedef struct Node {
    4. float coef;
    5. int exp;
    6. struct Node* next;
    7. } Node;
    8. Node* createNode(float coef, int exp) {
    9. Node* newNode = (Node*)malloc(sizeof(Node));
    10. newNode->coef = coef;
    11. newNode->exp = exp;
    12. newNode->next = NULL;
    13. return newNode;
    14. }
    15. void insertNode(Node** head, float coef, int exp) {
    16. Node* newNode = createNode(coef, exp);
    17. if (*head == NULL || (*head)->exp < exp) {
    18. newNode->next = *head;
    19. *head = newNode;
    20. } else {
    21. Node* temp = *head;
    22. while (temp->next != NULL && temp->next->exp >= exp) {
    23. temp = temp->next;
    24. }
    25. newNode->next = temp->next;
    26. temp->next = newNode;
    27. }
    28. }
    29. Node* addPolynomials(Node* poly1, Node* poly2) {
    30. Node* result = NULL;
    31. while (poly1 && poly2) {
    32. if (poly1->exp > poly2->exp) {
    33. insertNode(&result, poly1->coef, poly1->exp);
    34. poly1 = poly1->next;
    35. } else if (poly1->exp < poly2->exp) {
    36. insertNode(&result, poly2->coef, poly2->exp);
    37. poly2 = poly2->next;
    38. } else {
    39. float sum = poly1->coef + poly2->coef;
    40. if (sum) {
    41. insertNode(&result, sum, poly1->exp);
    42. }
    43. poly1 = poly1->next;
    44. poly2 = poly2->next;
    45. }
    46. }
    47. while (poly1 || poly2) {
    48. if (poly1) {
    49. insertNode(&result, poly1->coef, poly1->exp);
    50. poly1 = poly1->next;
    51. }
    52. if (poly2) {
    53. insertNode(&result, poly2->coef, poly2->exp);
    54. poly2 = poly2->next;
    55. }
    56. }
    57. return result;
    58. }
    59. int main() {
    60. Node* poly1 = NULL;
    61. Node* poly2 = NULL;
    62. float coef;
    63. int exp;
    64. char ch;
    65. while (scanf("%f %d%c", &coef, &exp, &ch)) {
    66. insertNode(&poly1, coef, exp);
    67. if (ch == '\n') break;
    68. }
    69. while (scanf("%f %d%c", &coef, &exp, &ch)) {
    70. insertNode(&poly2, coef, exp);
    71. if (ch == '\n') break;
    72. }
    73. Node* result = addPolynomials(poly1, poly2);
    74. int pos;
    75. scanf("%d", &pos);
    76. int i;
    77. for (i = 1; i < pos; i++) {
    78. if (result) {
    79. result = result->next;
    80. }
    81. }
    82. if (result) {
    83. printf("%.1f %d\n", result->coef, result->exp);
    84. }
    85. return 0;
    86. }

    4. 数组的循环左移

    【问题描述】

    设将n(n>1)个整数存放在一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(P>0)个位置。
    例如,假设P 【输入形式】

    循环移动的位数,数组中数据的个数,循环前的数组
    【输出形式】

    循环后的数组
    【样例输入】

    3 5 1 2 3 4 5

    【样例输出】

    4 5 1 2 3

    【样例说明】

    请大家注意,循环位移的位数可能超过数组中元素个数;输入与输出的数据均以空格分割,其中输入的数据中第一个是循环移位的位数,第二个是数组中数据的个数,后面的是数组中的数据。
    【评分标准】

    除了提交之后自动判分之外,还会根据代码的时间复杂度酌情给分,请大家尽量降低空间、时间复杂度

    1. #include
    2. #include
    3. void reverseArr(int *arr, int start, int end) {
    4. while (start < end) {
    5. int temp = arr[start];
    6. arr[start] = arr[end];
    7. arr[end] = temp;
    8. start++;
    9. end--;
    10. }
    11. }
    12. void leftRotate(int *arr, int p, int n) {
    13. reverseArr(arr, 0, p - 1);
    14. reverseArr(arr, p, n - 1);
    15. reverseArr(arr, 0, n - 1);
    16. }
    17. int main() {
    18. int p, num, i;
    19. scanf("%d", &p);
    20. scanf("%d", &num);
    21. p = p % num;
    22. int *arr = (int *)malloc(num * sizeof(int));
    23. for (i = 0; i < num; i++) {
    24. scanf("%d", &arr[i]);
    25. }
    26. leftRotate(arr, p, num);
    27. for (i = 0; i < num; i++) {
    28. printf("%d", arr[i]);
    29. if (i < num - 1) {
    30. printf(" ");
    31. }
    32. }
    33. printf("\n");
    34. free(arr);
    35. return 0;
    36. }

  • 相关阅读:
    nodejs+express+mysql简单博客搭建
    sora生成高质量视频的原理
    主流开发语言与环境介绍
    经典的CNN网络模型概述
    Android 高版本 packageManager.getPackageArchiveInfo 总是返回null
    【JavaScript】过了一年,懒癌患者终于整理了一下『手写Promise A+』
    全渠道电商 | 国内知名的药妆要如何抓住风口实现快速增长?
    MakeSense中文版使用手册【图像标注神器】
    ZYNQ_project:test_fifo_255X8
    2022谷粒商城学习笔记(二十二)rabbitMQ学习
  • 原文地址:https://blog.csdn.net/timberman666/article/details/133828201