上机实验二 设计单循环链表 西安石油大学数据结构

这篇具有很好参考价值的文章主要介绍了上机实验二 设计单循环链表 西安石油大学数据结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验名称:设计单循环链表

(1)实验目的:掌握线性表的链式存储结构;掌握单循环链表及其基本操作的实现。

(2)主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证所设计单循环链表的正确性。

1.实验目的

掌握线性表的链式存储结构;掌握单循环链表及其基本操作的实现。

2.问题描述

利用C语言设计实现单循环链表,并实现初始化、求数据元素个数、插入、删除、取数据元素等基本操作。使用插入法建立带头结点的单循环链表,并设计一个测试主函数验证所设计单循环链表的正确性。

3.基本要求

具体要求如下:

  1. 设计一个结构体表示链表的节点,包括数据域和指针域。

  2. 实现单循环链表的初始化操作,即创建一个空链表。

  3. 实现求数据元素个数的操作,即统计链表中已有的节点数。

  4. 实现插入操作,在指定位置插入一个节点,并将新节点链接到链表中。

  5. 实现删除操作,删除指定位置的节点。

  6. 实现取数据元素的操作,返回指定位置的节点值。

  7. 使用插入法建立带头结点的单循环链表,即通过用户输入逐个插入节点来创建链表,直到用户结束输入。

  8. 编写一个测试主函数,验证所设计单循环链表的正确性,包括对各个操作的测试。测试包括但不限于以下内容:创建一个空链表并输出链表元素个数。
    插入若干节点,并验证插入后链表的正确性。
    删除某个位置的节点,并验证删除后链表的正确性。
    取某个位置的节点值,并输出验证结果。

4.测试数据

初始链表为空,链表元素个数为:0

插入后的链表元素:10

插入后的链表元素:5 15 10 20

删除后的链表元素:15 20

取节点值的结果:

Position 0: 15

Position 1: 20

Position 2: -1

5.算法思想

链表数据结构的基本操作,包括初始化链表、获取链表元素个数、在指定位置插入节点、删除指定位置的节点、获取指定位置节点的值以及打印链表中的元素。其中,链表是一种线性结构,每个节点包括数据和指向下一个节点的指针,头结点不包含数据。

该算法通过遍历链表的方式来找到指定位置的节点,然后进行相应的操作。具体实现方法包括:在空链表中插入第一个节点时,直接将头结点指向新节点;在链表头部插入节点时,将新节点的指针指向原头结点,再将头结点指向新节点;在链表中间和尾部插入节点时,在找到插入位置的前一个节点后,将新节点的指针指向原位置的节点,再将前一个节点的指针指向新节点;删除节点时,首先找到要删除节点的前一个节点,将前一个节点的指针指向要删除节点的下一个节点,然后释放要删除节点的内存空间;获取节点值时,找到指定位置的节点,返回其数据域的值。

6.模块划分

  1. initList():初始化链表,返回头结点。
  2. listLength(Node* head):获取链表的元素个数。
  3. insertNode(Node* head, int position, int data):在链表指定位置插入节点。
  4. deleteNode(Node* head, int position):删除链表指定位置的节点。
  5. getNodeData(Node* head, int position):获取链表指定位置节点的值。
  6. printList(Node* head):打印链表中的元素。
  7. main():主函数。

7.数据结构

(1) 数据类型DataType定义如下:

typedef struct {
    int number;
    int cipher;
} DataType;

这个定义表示DataType结构体包含两个成员变量,即numbercipher,分别表示一个整数的数字和位数。

(2) 带头结点单循环链表结点的结构体定义如下:

typedef struct SCLNode {
    DataType data;
    struct SCLNode* next;
} SCLNode;

这个定义表示SCLNode结构体是一个带头结点的单循环链表的节点,包含两个成员变量。其中,data是存储数据元素的DataType类型的变量。next是指向下一个节点的指针,类型为指向SCLNode结构体的指针。

通过这样的定义,可以创建一个带头结点的单循环链表,每个节点存储一个数据元素,并且通过next指针连接起来形成循环链表。头结点的作用是指示链表的起始位置,尾节点的next指针指向头结点,形成循环。

8.源程序

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

typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 初始化链表,返回头结点
Node* initList() {
    Node* head = (Node*)malloc(sizeof(Node));
    head->next = NULL;  // 初始化时头结点指向NULL,形成空链表
    return head;
}

// 获取链表的元素个数
int listLength(Node* head) {
    int count = 0;
    Node* current = head->next;
    while (current != NULL) {
        count++;
        current = current->next;
    }
    return count;
}

// 在链表指定位置插入节点
void insertNode(Node* head, int position, int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;

    Node* current = head;
    int count = 0;
    while (current != NULL && count < position) {
        current = current->next;
        count++;
    }
    newNode->next = current->next;
    current->next = newNode;
}

// 删除链表指定位置的节点
void deleteNode(Node* head, int position) {
    Node* current = head;
    int count = 0;
    while (current->next != NULL && count < position) {
        current = current->next;
        count++;
    }
    if (current->next != NULL) {
        Node* temp = current->next;
        current->next = temp->next;
        free(temp);
    }
}

// 获取链表指定位置节点的值
int getNodeData(Node* head, int position) {
    Node* current = head->next;
    int count = 0;
    while (current != NULL && count < position) {
        current = current->next;
        count++;
    }
    if (current != NULL)
        return current->data;
    else
        return -1;  // 返回-1表示节点不存在
}

// 打印链表中的元素
void printList(Node* head) {
    Node* current = head->next;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    Node* head = initList();

    printf("初始链表为空,链表元素个数为:%d\n", listLength(head));

    insertNode(head, 0, 10);  // 在空链表中插入第一个节点
    printf("插入后的链表元素:");
    printList(head);

    insertNode(head, 0, 5);  // 在链表头部插入节点
    insertNode(head, 1, 15); // 在链表中间插入节点
    insertNode(head, 3, 20); // 在链表尾部插入节点
    printf("插入后的链表元素:");
    printList(head);

    deleteNode(head, 0); // 删除头结点
    deleteNode(head, 1); // 删除链表中的某个节点
    deleteNode(head, 2); // 删除尾节点
    printf("删除后的链表元素:");
    printList(head);

    int data1 = getNodeData(head, 0); // 取链表头结点的数据
    int data2 = getNodeData(head, 1); // 取链表中间某个节点的数据
    int data3 = getNodeData(head, 2); // 取链表尾节点的数据
    printf("取节点值的结果:\n");
    printf("Position 0: %d\n", data1);
    printf("Position 1: %d\n", data2);
    printf("Position 2: %d\n", data3);

    return 0;
}

9.测试情况

设计单循环链表西安石油大学,数据结构,C++,算法,数据结构,链表,dreamweaver

进行测试结果分析

初始化链表后,链表为空,元素个数为0。

在空链表中插入第一个节点,插入后的链表元素为10。可以看到插入操作正常。

在链表头部插入节点5,链表中间插入节点15,链表尾部插入节点20。插入后的链表元素为5 15 10 20。可以看到在不同位置插入节点的操作正常。

删除头结点,删除链表中的某个节点,删除尾节点。删除后的链表元素为5 10。可以看到删除操作正常。

取链表头结点的数据,取链表中间某个节点的数据,取链表尾节点的数据。取节点值的结果如下:

Position 0: 5
Position 1: 10
Position 2: -1
可以看到,成功获取了节点的值,并且当位置越界时返回了-1。说明获取节点值的功能正常。

综上所述,根据测试结果,代码实现了链表的基本操作,并且功能正常。

描述存在的问题及建议

存在的问题是在插入和删除节点时没有进行越界检查,可能导致访问非法内存。建议在插入和删除节点的代码中增加对位置的合法性检查,确保不会越界。

另外,代码中的打印函数printList()可以优化,避免每次都要遍历整个链表才能打印出结果。可以考虑在插入、删除和修改节点时维护链表的长度,并在需要打印时直接使用链表长度进行循环打印。这样可以提高效率。文章来源地址https://www.toymoban.com/news/detail-732430.html

到了这里,关于上机实验二 设计单循环链表 西安石油大学数据结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 单循环链表头指针和尾指针的区别

    以如下题目为例: 某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( D )存储方式最节省运算时间。【南开大学2000 一、3】 A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表 单链的循环链表结点的存储结构

    2024年02月11日
    浏览(12)
  • 低代码:拒绝重复、低价值的工单循环开发

    在软件开发和其他工程领域,“重复造轮子”被广泛认为是一种低效的做法,因为它浪费了大量的时间和资源去重新创作已经存在的东西,而不是利用现有的技术和经验去解决问题。 例如在大平台项目的实战开发中,针对不同业务场景,需要为用户多次编写不同的表单页面用

    2024年02月04日
    浏览(15)
  • 国内优秀的开源低代码框架:PagePlug,面向研发使用,拒绝重复、低价值的工单循环开发

    分享下Appsmith中文版的PagePlug吧, 开源、面向研发人员开发使用的低代码: PagePlug将开发人员的开发时间减少了 60%,PP框架本身解决了很多没必要的繁重工作。 前者appsmith目前是github上超29K最火的开源低代码平台,后者PagePlug也是目前国内开源社区比较火的低代码平台—— 针

    2024年02月09日
    浏览(12)
  • 西安石油大学期末考试C++真题解析

    1、一、类型、返回值类型 二、参数表、函数重载 2、一、实例化 二、实例化的类型或类 类是对象的蓝图,对象是类的实例化 3、const 4、一个 两个 5、一、公有继承 二、私有继承、保护继承 6、抽象类、实例化对象 7、函数模板、类模板 8、try、catch、throw 9、流插入运算符、流

    2024年02月11日
    浏览(15)
  • 西安石油大学2023年第三届里奇杯编程大赛(初赛)

    官方题解地址1v7w (郭毅佬!):https://www.cnblogs.com/1v7w/p/17437203.html 描述 你说得对,但是 “ 里奇杯 ” 是西安石油大学计算机协会举办的程序设计竞赛,比赛旨在激发同学们学习程序设计的热情,提高编程能力,调动编程的兴趣和积极性,在这里,你将扮演名为“参赛选手”

    2024年02月09日
    浏览(13)
  • 西安石油大学 C++期末考试 重点知识点+题目复习(下)

    析构函数的调用顺序与对象的创建和销毁顺序相反。 对于单个对象,当对象的生命周期结束时(例如离开作用域),会调用其析构函数。因此,析构函数会在对象销毁之前被调用。 对于类的成员对象,它们的析构函数的调用顺序与它们在类中的声明顺序相反。即,在类的析

    2024年02月11日
    浏览(19)
  • 西安石油大学 C++期末考试 重点知识点+题目复习(上)

    当使用 const 修饰变量、函数参数、成员函数以及指针时,以下是一些代码示例: 声明只读变量: 保护函数参数: 防止成员函数修改对象状态: 防止指针修改指向的值: 这些示例展示了如何使用 const 来声明常量、保护函数参数、防止成员函数修改对象状态以及防止指

    2024年02月11日
    浏览(11)
  • 西安石油大学数学建模校赛培训(2)matlab的使用

    MATLAB是MathWorks公司推出的一套高性能数值分析计算软件,其名字来源于\\\"Matrix Laboratory\\\"(矩阵实验室)的缩写。它将矩阵运算、数值分析、图形处理、编程技术等功能集成在一起,为科学计算、工程设计和数据分析提供了强大的平台。MATLAB的特点包括易于使用的高级编程语言、

    2024年03月28日
    浏览(14)
  • SDUT-程序设计基础-实验4-for循环(上)

    在开始之前,我想要提醒一下大家,在看完答案和解析以后,一定要自己再写一遍,一味的复制粘贴没有任何效果,当然,再解析中有任何看不懂的内容都可以私信我!! for循环相比while循环,二者不能说谁比谁更好,我们在打代码的过程中,要根据不同的情况选择不同的循

    2024年02月06日
    浏览(21)
  • C#实验报告上机六

    题目一:编写C#程序,统计硬盘某个目录下的abc.txt文件中单词的个数。提示:要用到字符串类中的分割字符串等函数 源程序: 运行结果:   题目二:编写一个重复文件的检测程序:程序可以实现重复文件检测(即将硬盘某个盘符下的重复文件以ListBox控件列表的形式显示出

    2024年02月11日
    浏览(6)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包