数据结构实战之线性表(三)

目录

1.顺序表释放

2.顺序表增加空间

3.合并顺序表

4.线性表之链表实现

1.项目结构以及初始代码

2.初始化链表(不带头结点)

3.链表尾部插入数据并显示

4.链表头部插入数据

5.初始化链表(带头结点)

6.带头结点的链表头部插入数据并显示

7.带头结点的链表尾部插入数据

5.提供操作界面



1.顺序表释放

main.c

SeqList.h

SeqList.c

void destroy(SeqList* list)
{

    free(list->base);
    list->base = NULL;// 防止野指针
    list->capacity = 0;
    list->size = 0;
}

2.顺序表增加空间

SeqList.h

SeqList.c


int Inc(SeqList* list)
{
        ElemType* newbase = (ElemType*)realloc(list->base, sizeof(ElemType) * (list->capacity + INC_SIZE));
        if (newbase == NULL)
        {
            printf("增配空间失败,内存不足.\n");
            return 0;// 返回0,表示假,增配空间失败
        }
    
        list->base = newbase;
        list->capacity += INC_SIZE;
    
        return 1;
}

应该在顺序表插入的函数中判断

3.合并顺序表

注释掉原来的main函数

重新写一个main函数

main.c

int main(int argc, char** argv)
{
    SeqList mylist;
    SeqList youlist;
    SeqList list;

        InitSeqList(&mylist);
        InitSeqList(&youlist);
    
        push_back(&mylist,1);
        push_back(&mylist,3);
        push_back(&mylist,5);
        push_back(&mylist,7);
        push_back(&mylist,9);
    
        push_back(&youlist,2);
        push_back(&youlist,4);
        push_back(&youlist,6);
        push_back(&youlist,8);
        push_back(&youlist,10);
    
        merge(&list,&mylist,&youlist);
    
        show_list(&list);

}

SeqList.h

SeqList.c

/*
将两个有序的顺序表合并为一个有序的顺序表
*/
void merge(SeqList* lt, SeqList* la, SeqList* lb)
{
// 初始化三个指针,分别用于遍历la、lb、lt三个顺序表
        int ia = 0;// ia 指向顺序表 la 的当前元素
        int ib = 0;// ib 指向顺序表 lb 的当前元素
        int ic = 0;// ic 指向合并后的顺序表 lt 的当前插入位置

         // 计算合并后顺序表 lt 的容量(容量等于 la 和 lb 的元素总数)
    lt->capacity = la->size + lb->size;
         // 为顺序表 lt 分配足够的空间,能够存储合并后的所有元素
    lt->base = (ElemType*)malloc(sizeof(ElemType) * lt->capacity);
         // 检查内存分配是否成功,如果分配失败则终止程序
        assert(lt->base != NULL);// 开辟失败了,就断言返回
    
        // 合并两个顺序表,当 la 和 lb 都还有未处理的元素时,执行比较与插入操作
        while (ia < la->size && ib < lb->size)
        {
             // 如果 la 当前元素小于 lb 当前元素,取出 la 当前元素放入 lt
            if (la->base[ia] < lb->base[ib])
            {
                      // 插入元素并移动指针 ia 和 ic
                lt->base[ic++] = la->base[ia++];
            }
            else// 否则取出 lb 当前元素放入 lt
            {
                lt->base[ic++] = lb->base[ib++];// 插入元素并移动指针 ib 和 ic
            }
        }
    // 如果 la 中还有未处理的元素,直接将其复制到 lt 中
        while (ia < la->size)
        {
                 // 依次插入剩余元素并移动指针
            lt->base[ic] = la->base[ia];
            ic++;
            ia++;
        }
    // 如果 lb 中还有未处理的元素,直接将其复制到 lt 中
        while (ib < lb->size)
        {
                 // 依次插入剩余元素并移动指针
            lt->base[ic] = lb->base[ib];
            ic++;
            ib++;
        }
        // 设置合并后顺序表 lt 的大小,等于 la 和 lb 的元素总数
    lt->size = la->size + lb->size;
}

4.线性表之链表实现

1.项目结构以及初始代码

在解决方案"dataStructure"新增一个项目"List"。并把项目"List"设置为启动项目。

项目"List"初始结构

List.h

#ifndef  __LIST_H__
#define  __LIST_H__

#define ElemType int

typedef struct ListNode
{
    ElemType data;
    struct ListNode* next;
}ListNode;

typedef ListNode* List;



#endif // ! __LIST_H__

List.c

#include <stdio.h>
#include <assert.h>
#include <malloc.h>

#include "List.h"

main.c

#include <stdio.h>
#include "List.h"


int main(int argc, char** argv)
{
    

     return 0;
}

2.初始化链表(不带头结点)

List.h

List.c

main.c

#include <stdio.h>
#include "List.h"


int main(int argc, char** argv)
{
    List mylist;
    InitList(&mylist);

    return 0;
}

3.链表尾部插入数据并显示

main.c

List.h

List.c

/// <summary>
/// 在链表尾插入节点
/// </summary>
/// <param name="head"></param>
void CreateList(List* head)
{
        *head = (ListNode*)malloc(sizeof(ListNode));
        assert(*head != NULL);
        (*head)->data = 1;
        (*head)->next = NULL;

    ListNode* p = *head;
        for (int i = 2; i <= 10; i++)
        {
            ListNode* s = (ListNode*)malloc(sizeof(ListNode));
            assert(s != NULL);
            s->data = i;
            s->next = NULL;
            
            p->next = s;
            p = s;
        }
}

void ShowList(List* head)
{
    ListNode* p = *head;
        while (p != NULL)
        {
            printf("%d-->", p->data);
            p = p->next;
        }

         printf("Null.\n");
}

4.链表头部插入数据

main.c

List.h

List.c

void InsertTopList(List* head)
{
    *head = (ListNode*)malloc(sizeof(ListNode));
    assert(*head != NULL);

    (*head)->data = 1;
    (*head)->next = NULL;

    for (int i = 2; i <= 10; i++)
    {
        ListNode* s = (ListNode*)malloc(sizeof(ListNode));
        assert(s!= NULL);
        s->data = i;
        s->next = *head;

        *head = s;// head指向新的节点,也就是这个新的结点成为头结点
    }
}

5.初始化链表(带头结点)

main.c

List.h

List.c

void InitListWithHead(List* head)
{
        *head = (ListNode*)malloc(sizeof(ListNode));
        assert(*head != NULL);
        (*head)->next = NULL;
}

6.带头结点的链表头部插入数据并显示

main.c

List.h

List.c

// 在带头结点的链表头部插入数据
void CreateListTopWithHead(List* head)
{
        for (int i = 1; i <= 10; i++)
        {
            ListNode* s = (ListNode*)malloc(sizeof(ListNode));
            s->data = i;
            s->next = (*head)->next;
            (*head)->next = s;
        }
}



void ShowListWithHead(List* head)
{
    ListNode* p = (*head)->next;
        while (p != NULL)
        {
            printf("%d-->", p->data);
            p = p->next;
        }

         printf("Null.\n");
}

main.c

List.h

List.c

// 在带头结点的链表尾部插入数据
void InsertTailListWithHead(List* head)
{
    ListNode* p = *head;
        for (int i = 1; i <= 10; i++)
        {
            p = p->next = (ListNode*)malloc(sizeof(ListNode));
            assert(p != NULL);
            p->data = i;
            p->next = NULL;
        }
}

链表结构如下

8.1.项目初始结构

main.c

#include <stdio.h>
#include "SList.h"

int main(int argc, char** argv)
{
        
    
        return 0;
}

SList.h

#ifndef __SLIST_H__
#define __SLIST_H__
#include <stdio.h>
#include <malloc.h>
#include <assert.h>

#define ElemType int

typedef struct Node
{
    ElemType data;
    struct Node* next;
}Node,*PNode;


typedef struct List
{
     PNode first;
     PNode last;
     size_t size;// 节点个数大小
}List;


void InitList(List* list);


#endif // !__SLIST_H__

SList.c

#include "SList.h"

void InitList(List* list)
{
    list->first = list->last = (Node*)malloc(sizeof(Node));
    assert(list->first != NULL);
    list->first->next = NULL;
    list->size = 0;
}

5.提供操作界面

main.c

#include <stdio.h>
#include "SList.h"

int main(int argc, char** argv)
{
    List mylist;
    InitList(&mylist);

    int select = 1;
    while (select)
    {
    printf("*******************************************\n");
    printf("* [1] push_back          [2] push_front   *\n");
    printf("* [3] show_list          [4] pop_back     *\n");
    printf("* [5] pop_front          [6] insert_val   *\n");
    printf("* [7] find                 [8] length       *\n");
    printf("* [9] delete_val         [10] sort        *\n");
    printf("* [11] reverse             [12] clear       *\n");
    printf("* [13] destroy             [0] quit_system  *\n");
    printf("*******************************************\n");
    
    printf("请选择:>");
    scanf("%d", &select);
    switch (select)
    {
        case 1:
        {
            break;
        }
        default:
        {
            printf("输入的命令错误,请重新输入.\n");
            break;
        }
    }
    }

     return 0;
}

8.3.单链表尾部插入元素并显示单链表

  1. 尾部插入元素

main.c

SList.h

SList.c

void push_back(List* list, ElemType x)
{
    Node* s = (Node*)malloc(sizeof(Node));
    assert(s != NULL);
    s->data = x;
    s->next = NULL;
    
    list->last->next = s;
    list->last = s;
    
    list->size++;
}
  1. 显示单链表元素

void show_list(List* list)
{
    Node* p = list->first->next;
    while (p != NULL)
    {
        printf("%d--->", p->data);
        p = p->next;
    }
    printf("NULL.\n");
}

🔔 如果你对C语言数据库 和其他先进技术感兴趣,请别忘了点赞👍、收藏⭐️,并关注我们! 我们将持续为大家带来更多精彩内容,探索嵌入式C语言的无限可能!一起站在科技的前沿,迈向更美好的未来🌟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964239.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI 在 Xcode 预览修改视图 FetchedResults 对象的属性时为什么会崩溃?

概览 从 SwiftUI 诞生那天起&#xff0c;让秃头码农们又爱又恨的 Xcode 预览就在界面调试中扮演了及其重要的角色。不过&#xff0c;就是这位撸码中的绝对主角却尝尝在关键时刻“掉链子”。 比如当修改 SwiftUI 视图中 FetchedResults 对象的属性时&#xff0c;Xcode 预览可能…

【字节青训营-7】:初探 Kitex 字节微服务框架(使用ETCD进行服务注册与发现)

本文目录 一、Kitex概述二、第一个Kitex应用三、IDL四、服务注册与发现 一、Kitex概述 长话短说&#xff0c;就是字节跳动内部的 Golang 微服务 RPC 框架&#xff0c;具有高性能、强可扩展的特点&#xff0c;在字节内部已广泛使用。 如果对微服务性能有要求&#xff0c;又希望…

51单片机入门_05_LED闪烁(常用的延时方法:软件延时、定时器延时;while循环;unsigned char 可以表示的数字是0~255)

本篇介绍编程实现LED灯闪烁&#xff0c;需要学到一些新的C语言知识。由于单片机执行的速度是非常快的&#xff0c;如果不进行延时的话&#xff0c;人眼是无法识别(停留时间要大于20ms)出LED灯是否在闪烁所以需要学习如何实现软件延时。另外IO口与一个字节位的数据对应关系。 文…

JVM的GC详解

获取GC日志方式大抵有两种 第一种就是设定JVM参数在程序启动时查看&#xff0c;具体的命令参数为: -XX:PrintGCDetails # 打印GC日志 -XX:PrintGCTimeStamps # 打印每一次触发GC时发生的时间第二种则是在服务器上监控:使用jstat查看,如下所示&#xff0c;命令格式为jstat -gc…

基于python去除知乎图片水印

基于python去除知乎图片水印 背景&#xff1a;看到知乎技术文章里面的图片非常好&#xff0c;但是下载下来都是带有水印的&#xff0c;并不是不尊重别人的版权和劳动成果&#xff0c;纯粹的是洁癖&#xff0c;总感觉水印打上去很难受~~~ 实在想去掉水印&#xff0c;但是又不会P…

Android学习20 -- 手搓App2(Gradle)

1 前言 昨天写了一个完全手搓的&#xff1a;Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt&#xff0c;d8这些来搞。其实不想弄Gradle的&#xff0c;不过想着既然开始了&#xff0c;就多看一些。之前写过一篇Gradle&#xff0c;不过是最简单的编译&#xff0c;不涉…

【愚公系列】《循序渐进Vue.js 3.x前端开发实践》051-案例:教务系统学生列表页面

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…

毕业设计:基于深度学习的高压线周边障碍物自动识别与监测系统

目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 卷积神经网络 1.2 目标检测算法 1.3 注意力机制 二、 数据集 2.1 数据采集 2.2 数据标注 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 3.2 结果分析 最后 前言 &#x1f4c5;大四是整个大学…

2025.2.1——八、Web_php_wrong_nginx_config

题目来源&#xff1a;攻防世界 Web_php_wrong_nginx_config 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;找找解题入口 step 2&#xff1a;抓包修改信息&#xff0c;得到配置文件 step 3&#xff1a;找到突破口&#xff0c;进行文件遍历 st…

Netty中用了哪些设计模式?

大家好&#xff0c;我是锋哥。今天分享关于【Netty中用了哪些设计模式&#xff1f;】面试题。希望对大家有帮助&#xff1b; Netty中用了哪些设计模式&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty 是一个基于 Java 的高性能网络应用框架&#…

【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器

背景需求&#xff1a; 2024年1月13日&#xff0c;快要放寒假了&#xff0c;组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整&#xff0c;你自己看批注。” “还有你这个教案部分的模版有问题&#xff0c;太小&#xff08;窄&#xff09;了。考虑…

【BUUCTF杂项题】FLAG

一.FLAG 一张图片扔进随波逐流 发现RGB似乎隐藏压缩包 优先考虑RBG中的LSB隐写&#xff0c;用Stegsolve打开文件 1.查看每个颜色通道下的图片&#xff0c;未发现异常 2.LSB最低位提取&#xff0c;用Stegsolve的Data Extrace功能&#xff0c;确实存在一个压缩包&#xff0c;sa…

ros 创建Node

1、使用catkin_create_pkg创建一个软件包 catkin_create_pkg ssr_pkg roscpp rospy std_msgs 2、在软件包的src文件夹下创建一个节点的cpp源码文件 3、在CMakeLists.txt中设置节点源码的编译规则 4.编译运行 编译&#xff1a;shiftctrlB 运行&#xff1a; rosrun ssr_pkg …

给AI用工具的能力——Agent

ReAct框架&#xff1a; Reason Action&#xff0c;推理与行动结合 可以借助思维链&#xff0c;用小样本提示展示给模型一个ReAct框架 推理&#xff1a;针对问题或上一步观察的思考 行动&#xff1a;基于推理&#xff0c;与外部环境的一些交互&#xff08;调用外部工具&…

实验十 Servlet(一)

实验十 Servlet(一) 【实验目的】 1&#xff0e;了解Servlet运行原理 2&#xff0e;掌握Servlet实现方式 【实验内容】 1、参考课堂例子&#xff0c;客户端通过login.jsp发出登录请求&#xff0c;请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功&#xff0c…

PAT甲级1052、Linked LIst Sorting

题目 A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the stru…

【BUUCTF杂项题】荷兰宽带数据泄露、九连环

一.荷兰宽带数据泄露 打开发现是一个.bin为后缀的二进制文件&#xff0c;因为提示宽带数据泄露&#xff0c;考虑是宽带路由器方向的隐写 补充&#xff1a;大多数现代路由器都可以让您备份一个文件路由器的配置文件&#xff0c;软件RouterPassView可以读取这个路由配置文件。 用…

【Game】Powerful——The Dragon Hiding in Deep Waters(3)

文章目录 1、规则2、条件——宠物2.1、宠物装备2.1、宠物突破2.2、洗练石 3、条件——符石4、条件——化龙鼎5、附录——星穹 1、规则 寒渊城&#xff0c;神秘老兵处可查看 霜风携雨掠寒江&#xff0c;孤城独影人心凉 贤才此件难相遇&#xff0c;忠骨何日还故乡 宠物、符石、…

差分数组的学习

文章目录 1.差分数组的应用场景2.如何构造一个差分数组2.1 原数组转换为差分数组2.2 差分数组还原为原数组 3.差分数组的特性 1.差分数组的应用场景 需要频繁对某个区间的数组进行增减操作 2.如何构造一个差分数组 2.1 原数组转换为差分数组 # 存在一个数组Nums,求出他的差分…

AES 与 SM4 加密算法:深度解析与对比

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…