数据结构——线性表作业

这篇具有很好参考价值的文章主要介绍了数据结构——线性表作业。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

选择题和填空题

编程题

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

单链表

双指针

2. 数组元素移动

3. 多项式相加

4. 数组的循环左移


选择题和填空题


数据结构——线性表作业,数据结构学习总结,数据结构,算法,学习,笔记,c语言,娱乐,青少年编程

编程题

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

【问题描述】

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

【输入形式】

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

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

【样例输入】

3 13 45 54 32 1 4 98 2

【样例输出】

4

【样例说明】

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

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

单链表

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int num;
    struct Node* next;
} Node, * LinkList;

int main() {
    LinkList head = NULL;
    LinkList tail = NULL;
    int k;
    scanf("%d", &k);
    int n;
    while (scanf("%d", &n) != EOF) {
        LinkList newNode = (LinkList)malloc(sizeof(Node));
        newNode->num = n;
        newNode->next = NULL;
        if (head == NULL) {
            head = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = tail->next;
        }
    }
    LinkList p = head;
    int count = 0;
    while (p != NULL) {
        count++;
        p = p->next;
    }
    if (k <= 0 || k > count) {
        printf("Not Found\n");
    } else {
        p = head;
        for (int i = 0; i < count - k; i++) {
            p = p->next;
        }
        printf("%d\n", p->num);
    }
    p = head;
    while (p != NULL) {
        LinkList temp = p;
        p = p->next;
        free(temp);
    }
    return 0;
}

双指针

#include <stdio.h>
#include <stdlib.h>
 
typedef struct Node {
    int num;
    struct Node* next;
} Node, * LinkList;
 
int main() {
    LinkList head = NULL;
    LinkList tail = NULL;
    int k;
    scanf("%d", &k);
    int n;
    while (scanf("%d", &n) != EOF) {
        LinkList newNode = (LinkList)malloc(sizeof(Node));
        newNode->num = n;
        newNode->next = NULL;
        if (head == NULL) {
            head = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = tail->next;
        }
    }
    LinkList p = head;
    LinkList temp=head;
    if (k <= 0) {
        printf("Not Found\n");
    } else {
        p = head;
        temp=head;
        while(k && temp){
            temp=temp->next;
            k--;
        }
        while(temp){
            temp=temp->next;
            p=p->next;
            }
        if(k > 0){
           printf("Not Found\n");
            return 0;
        }
        printf("%d\n", p->num);
    }
    return 0;
}

2. 数组元素移动

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

1,2,33,8,5

【样例输出】

1,33,5,2,8

【评分标准】

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    int arr[1000];
    int size = 0;
    while (scanf("%d,", &n) != EOF) {
        arr[size] = n;
        size++;
    }

    int *arr1 = (int*) malloc(size * sizeof(int));
    int *arr2 = (int*) malloc(size * sizeof(int));
    int size1 = 0, size2 = 0;

    for (int i = 0; i < size; i++) {
        if (arr[i] % 2 != 0) {
            arr1[size1] = arr[i];
            size1++;
        } else {
            arr2[size2] = arr[i];
            size2++;
        }
    }

    for (int i = 0; i < size1; i++) {
        printf("%d", arr1[i]);
        if (i < size1 - 1) {
            printf(",");
        }
    }
    if(size1>=1&&size2!=0){
        printf(",");
    }
    
    for (int i = 0; i < size2; i++) {
        printf("%d", arr2[i]);
        if (i < size2 - 1) {
            printf(",");
        }
    }

    free(arr1);
    free(arr2);
    return 0;
}

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项的系数与指数,系数与指数间用空格隔开,系数保留一位小数

【评分标准】

必须用链表实现

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    float coef; 
    int exp; 
    struct Node* next;
} Node;

Node* createNode(float coef, int exp) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->coef = coef;
    newNode->exp = exp;
    newNode->next = NULL;
    return newNode;
}

void insertNode(Node** head, float coef, int exp) {
    Node* newNode = createNode(coef, exp);
    if (*head == NULL || (*head)->exp < exp) {
        newNode->next = *head;
        *head = newNode;
    } else {
        Node* temp = *head;
        while (temp->next != NULL && temp->next->exp >= exp) {
            temp = temp->next;
        }
        newNode->next = temp->next;
        temp->next = newNode;
    }
}

Node* addPolynomials(Node* poly1, Node* poly2) {
    Node* result = NULL;
    while (poly1 && poly2) {
        if (poly1->exp > poly2->exp) {
            insertNode(&result, poly1->coef, poly1->exp);
            poly1 = poly1->next;
        } else if (poly1->exp < poly2->exp) {
            insertNode(&result, poly2->coef, poly2->exp);
            poly2 = poly2->next;
        } else {
            float sum = poly1->coef + poly2->coef;
            if (sum) {
                insertNode(&result, sum, poly1->exp);
            }
            poly1 = poly1->next;
            poly2 = poly2->next;
        }
    }
    while (poly1 || poly2) {
        if (poly1) {
            insertNode(&result, poly1->coef, poly1->exp);
            poly1 = poly1->next;
        } 
        if (poly2) {
            insertNode(&result, poly2->coef, poly2->exp);
            poly2 = poly2->next;
        }
    }
    return result;
}


int main() {
    Node* poly1 = NULL;
    Node* poly2 = NULL;
    float coef;
    int exp;
    char ch;
    while (scanf("%f %d%c", &coef, &exp, &ch)) {
        insertNode(&poly1, coef, exp);
        if (ch == '\n') break; 
    }
    while (scanf("%f %d%c", &coef, &exp, &ch)) {
        insertNode(&poly2, coef, exp);
        if (ch == '\n') break;
    }
  
    Node* result = addPolynomials(poly1, poly2);

    int pos;
    scanf("%d", &pos);
    int i;
    for (i = 1; i < pos; i++) {
        if (result) {
            result = result->next;
        }
    }
    if (result) {
        printf("%.1f %d\n", result->coef, result->exp);
    }
    return 0;
}

4. 数组的循环左移

【问题描述】

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

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

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

3 5 1 2 3 4 5

【样例输出】

4 5 1 2 3

【样例说明】

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

除了提交之后自动判分之外,还会根据代码的时间复杂度酌情给分,请大家尽量降低空间、时间复杂度文章来源地址https://www.toymoban.com/news/detail-714691.html

#include <stdio.h>
#include <stdlib.h>

void reverseArr(int *arr, int start, int end) {
    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

void leftRotate(int *arr, int p, int n) {
    reverseArr(arr, 0, p - 1);
    reverseArr(arr, p, n - 1);
    reverseArr(arr, 0, n - 1);
}

int main() {
    int p, num, i;
    scanf("%d", &p);
    scanf("%d", &num);
    p = p % num;
    int *arr = (int *)malloc(num * sizeof(int));
    for (i = 0; i < num; i++) {
        scanf("%d", &arr[i]);
    }

    leftRotate(arr, p, num);

    for (i = 0; i < num; i++) {
        printf("%d", arr[i]);
        if (i < num - 1) {
            printf(" ");
        }
    }
    printf("\n");

    free(arr);
    return 0;
}

到了这里,关于数据结构——线性表作业的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HNU数据结构与算法分析-作业1-算法分析

      1. (简答题) 1.(教材3.4)(a)假设某一个算法的时间代价为 ,对于输入规模n,在某台计算机上实现并完成该算法的时间为t秒。现在另有一台计算机,运行速度为第一台的64倍,那么t秒内新机器上能完成的输入规模为多大? 2.(教材3.12) 写出下列程序段平均情况下时间代

    2024年02月05日
    浏览(44)
  • 【Python数据结构与算法】线性结构小结

    🌈个人主页: Aileen_0v0 🔥系列专栏:PYTHON学习系列专栏 💫\\\"没有罗马,那就自己创造罗马~\\\"   目录 线性数据结构Linear DS 1.栈Stack 栈的两种实现 1.左为栈顶,时间复杂度为O(n) 2.右为栈顶,时间复杂度O(1)   2.队列Queue 3.双端队列Deque 4.列表List 5.链表 a.无序链表的实现 b.有序链表的实

    2024年02月04日
    浏览(40)
  • 数据结构与算法 - 线性表

    编程要求 本关任务是实现 step1/Seqlist.cpp 中的SL_InsAt、SL_DelAt和SL_DelValue三个操作函数,以实现线性表中数据的插入、删除与查找等功能。具体要求如下: SL_InsAT: 在顺序表的位置i插入结点x,即插入d[i]之前,i的有效范围[0,slist-len]; SL_DelAt:删除顺序表slist的第i号结点, i的有

    2024年02月01日
    浏览(81)
  • Rust 数据结构与算法:2线性数据结构 之 栈

    1、线性数据结构 数组、栈、队列、双端队列、链表这类数据结构都是保存数据的容器,数据项之间的顺序由添加或删除时的顺序决定,数据项一旦被添加,其相对于前后元素就会一直保持位置不变,诸如此类的数据结构被称为线性数据结构。线性数据结构有两端,称为“左

    2024年02月21日
    浏览(45)
  • 数据结构与算法分析 第六章 图 作业讲解

     参考教材: 《数据结构(C语言版 第2版)》 严蔚敏,李冬梅,吴伟民编著,人民邮电出版社,2022年版。 截图未标明出处均为原创或取自《数据结构(C语言版 第2版)》~   本文对应的作业题讲解视频:   数据结构与算法分析作业讲解视频合集 https://www.bilibili.com/video/BV1N

    2024年02月03日
    浏览(45)
  • 【数据结构与算法_01_线性表】线性表

    定义 ● 线性表 具有相同数据类型**(同类型)**的n个数据元素有限序列 ● 三方面 ● 定义 逻辑结构 ● 相同数据类型 ● 每个数据元素所占的空间相同 ● 有限 ● 有限个元素 ● 序列 ● 是有次序的 ● 基本操作 操作— 基本操作 运算 ● 创建线性表【initList(L)】 ● 初始化线

    2024年02月11日
    浏览(35)
  • 数据结构与算法【02】—线性表

    CSDN系列专栏:数据结构与算法专栏 针对以前写的数据结构与算法系列重写(针对文字描述、图片、错误修复),改动会比较大,一直到更新完为止 通过前面数据结构与算法基础知识我们知道了数据结构的一些概念和重要性,那么本章总结下线性表相关的内容。当然,我用自己

    2024年02月05日
    浏览(48)
  • 数据结构作业—第十三周---- Prim算法 Kruskal算法 Dijkstra算法

    (只看点,不看边,适合边较多的图,即 稠密图 )       是一种按权值的递增次序选择合适的边来构造最小生成树的方法;( 稀疏图 ) 适合带权有向图和带权无向图求单源最短路径; 不适合含负取值的图,求最短路径; 1 . 单选题 简单 7分 对于有n个顶点的带权连通图

    2024年02月15日
    浏览(46)
  • 数据结构与算法大作业——四叉树自适应模糊

    能够正确的对图像建立四叉树; 对于输入的图像,四叉树能够输出模糊的结果 对颜色相近的区域进行模糊 可通过十六进制编辑器 010editor 打开查看二进制信息 官网获取 010editor 信息 含义 P6 指明PPM的编码格式 2156 2156 图像大小为2156*2156 255 RGB的每个色彩值范围为0~255 C0 91 89(

    2024年01月19日
    浏览(36)
  • 数据结构与算法分析 第五章 树和二叉树 作业讲解

     参考教材: 《数据结构(C语言版 第2版)》 严蔚敏,李冬梅,吴伟民编著,人民邮电出版社,2022年版。 截图未标明出处均为原创或取自《数据结构(C语言版 第2版)》~   本文对应的作业题讲解视频:   数据结构与算法分析作业讲解视频合集 https://www.bilibili.com/video/BV1N

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包