华清数据结构day5 24-7-22

1>使用栈,完成进制转换输入:一个整数,进制数输出:该数的对应的进制数

seqstack.h

#ifndef SEQSTACK_H
#define SEQSTACK_H
#define MAX 10
#include"myhead.h"
typedef int datatype;typedef struct 
{datatype *data;int top;
}Stack,*StackPtr;
//创建栈
StackPtr stack_create();
//判空
int stack_empty(StackPtr S);
//判满
int stack_full(StackPtr S);
//入栈
void stack_push(StackPtr S, datatype e);
//出栈
void stack_pop(StackPtr S);
//遍历栈
void stack_show(StackPtr S);
//获取栈顶元素
datatype* stack_get_top(StackPtr S);
//求栈的大小
int stack_size(StackPtr S);
//销毁栈
void stack_destroy(StackPtr S);
//进制转换
void base_conversion(StackPtr S);
#endif

seqstack.c

#include"seqstack.h"StackPtr stack_create()
{StackPtr S = (StackPtr)malloc(sizeof(Stack));if(NULL == S){printf("创建失败\n");return NULL;}S->data = (datatype *)malloc(sizeof(datatype)*MAX);if(NULL == S->data){printf("创建失败\n");return NULL;}memset(S->data,0,sizeof(datatype)*MAX);S->top = -1;return S;
}int stack_empty(StackPtr S)
{return S->top == -1;
}int stack_full(StackPtr S)
{return S->top == MAX-1;
}void stack_push(StackPtr S,datatype e)
{if(NULL == S||stack_full(S)){printf("入栈失败\n");return;}S->top++;S->data[S->top] = e;
}void stack_pop(StackPtr S)
{if(NULL == S||stack_empty(S)){printf("出栈失败\n");return;}S->top--;
}void stack_show(StackPtr S)
{if(NULL == S|| stack_empty(S)){printf("遍历失败\n");return;}for(int i = S->top;i>=0;i--){printf("%c\t",S->data[i]+48);}printf("\n");
}datatype* stack_get_top(StackPtr S)
{if(NULL == S||stack_empty(S)){printf("操作失败\n");return NULL;}return &S->data[S->top];
}int stack_size(StackPtr S)
{if(NULL == S){printf("操作失败\n");}return S->top+1;
}void stack_destroy(StackPtr S)
{if(S!=NULL){free(S->data);free(S);S=NULL;}
}void base_conversion(StackPtr S)
{int num = 0,base = 0;printf("请输入一个数(10进制):");scanf("%d",&num);printf("请输入你想要将他转换成为的进制:");scanf("%d",&base);while(num){if (num%base >9){stack_push(S,num%base+7);}else{stack_push(S,num%base);}	num=num/base;}stack_show(S);
}

main.c

#include"seqstack.h"
#include<myhead.h>
int main(int argc, const char *argv[])
{StackPtr S = stack_create();if(NULL == S){return -1;}base_conversion(S);//调用销毁函数stack_destroy(S);S = NULL;return 0;
}

2> 将双向链表和循环链表自己实现一遍,至少要实现创建、增、删、改、查、销毁工作

双向链表

doublelinklist.h

#ifndef DOUBLELINKLIST_H
#define DOUBLELINKLIST_H
#include"myhead.h"
typedef char datatype;typedef struct Node
{union{int len;datatype data;};struct Node *prio;struct Node *next;
}Node,*NodePtr;NodePtr list_create();int list_empty(NodePtr L);NodePtr apply_node(datatype e);int list_insert_head(NodePtr L,datatype e);int list_show(NodePtr L);NodePtr list_search_pos(NodePtr L ,int  pos);int list_delete_pos(NodePtr L,int pos);void list_destroy(NodePtr L);
int list_update_pos(NodePtr L, int pos, datatype e);
#endif

doublellinklist.c

#include"doublelinklist.h"NodePtr list_create()
{NodePtr L = (NodePtr)malloc(sizeof(Node));if(L == NULL){printf("申请失败\n");return NULL;}L->len = 0;L->prio = NULL;L->next = NULL;printf("创建成功\n");return L;
}int list_empty(NodePtr L)
{return L->next == NULL;
}NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if(NULL == p){printf("节点申请失败\n");return NULL;}p->data = e;p->prio == NULL;p->next == NULL;return p;
}int list_insert_head(NodePtr L,datatype e)
{if(NULL == L){printf("插入失败\n");}NodePtr p = apply_node(e);if(NULL == p){return -1;}if(list_empty(L)){p->prio = L;L->next = p;}else{p->prio = L;p->next = L->next;L->next->prio = p;L->next = p;}L->len++;printf("插入成功\n");return 0;
}int list_show(NodePtr L)
{if(NULL == L||list_empty(L)){printf("遍历失败\n");return -1;}NodePtr q = L->next;while(q){printf("%c\t",q->data);q=q->next;}printf("\n");return 0;
}NodePtr list_search_pos(NodePtr L ,int  pos)
{if(NULL == L|| list_empty(L) ||pos<0 || pos>L->len){printf("查找失败\n");return NULL;}NodePtr q = L;for(int i=0;i<pos;i++){q=q->next;}return q;
}
int list_update_pos(NodePtr L, int pos, datatype e)
{if (NULL == L || list_empty(L)|| pos<0||pos>L->len){printf("修改失败\n");return -1;}NodePtr p = list_search_pos(L,pos);p->data = e;printf("修改成功\n");return 0;
}
int list_delete_pos(NodePtr L,int pos)
{   if(NULL == L|| list_empty(L) || pos<0||pos>L->len){printf("删除失败\n");return -1;}NodePtr p = list_search_pos(L,pos);if(NULL == p->next){p->prio->next = NULL;free(p);}else{p->prio->next = p->next;p->next->prio = p->prio;free(p);}L->len--;printf("删除成功\n");return 0;
}void list_destroy(NodePtr L)
{if(NULL == L){printf("删除失败\n");return;}while(!list_empty(L)){list_delete_pos(L,1);}free(L);L=NULL;printf("链表释放成功\n");return;
}

main.c

#include"doublelinklist.h"int main(int argc, const char *argv[])
{NodePtr L = list_create();if(NULL == L){return -1;}list_insert_head(L,'Q');list_insert_head(L,'W');list_insert_head(L,'E');list_insert_head(L,'R');list_show(L);list_update_pos(L,2,'F');list_show(L);list_delete_pos(L,4);list_show(L);list_destroy(L);return 0;
}

循环链表

looplinklist.h

#ifndef LOOPLINKLIST_H
#define LOOPLINKLIST_H
#include"myhead.h"
typedef char datatype;typedef struct Node
{union{int len;datatype data;};struct Node *prio;struct Node *next;
}Node,*NodePtr;
//链表创建
NodePtr list_create();
//链表判空
int list_empty(NodePtr L);
//链表申请空间封装节点
NodePtr apply_node(datatype e);
//按位置查找
NodePtr list_search_pos(NodePtr L ,int pos);
//链表尾插
int list_insert_tail(NodePtr L,datatype e);
//链表输出
int list_show(NodePtr L);
//链表头删
int list_delete_head(NodePtr L);
//链表任意位置删除
int list_delete_pos(NodePtr L, int pos);
//链表按位置进行修改
int list_update_pos(NodePtr L, int pos, datatype e);
//链表销毁
void list_destory(NodePtr L);
#endif

looplinklist.c

#include"looplinklist.h"
//链表创建
NodePtr list_create()
{NodePtr L = (NodePtr)malloc(sizeof(Node));if(NULL == L){printf("创建失败\n");return NULL;}L->len=0;L->next = L;printf("创建成功\n");return L;
}
//链表判空
int list_empty(NodePtr L)
{return L->next==L;
}
//链表申请空间封装节点
NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if(NULL == p){printf("创建失败\n");return NULL;}p->data = e;p->next = NULL;return p;
}
//按位置查找
NodePtr list_search_pos(NodePtr L ,int pos)
{if(NULL == L|| pos<0 ||pos>L->len){printf("查找失败\n");return NULL;}NodePtr q = L;for(int i= 0;i<pos;i++){q=q->next;}return q;
}
//链表尾插
int list_insert_tail(NodePtr L,datatype e)
{if(NULL == L){printf("插入失败\n");return -1;}NodePtr q = list_search_pos(L,L->len);NodePtr p = apply_node(e);if(NULL == L){return -1;}p->next = q->next;q->next = p;L->len++;printf("插入成功\n");return 0;
}
//链表输出
int list_show(NodePtr L)
{if(NULL== L||list_empty(L)){printf("遍历失败\n");return -1;}NodePtr q = L->next;while(q!=L){printf("%c\t",q->data);q=q->next;}printf("\n");
}
//链表头删
int list_delete_head(NodePtr L)
{if(NULL==L || list_empty(L)){printf("删除失败\n");return -1;}NodePtr q = L->next;L->next = q->next;free(q);q=NULL;L->len--;printf("删除成功\n");
}
//链表销毁
void list_destory(NodePtr L)
{if(NULL == L){printf("释放失败\n");return;}while(!list_empty(L)){list_delete_head(L);}free(L);L = NULL;printf("销毁成功\n");
}
//链表任意位置删除
int list_delete_pos(NodePtr L, int pos)
{if (NULL == L||pos<0 ||pos>L->len||list_empty(L)){printf("删除失败\n");return -1;}NodePtr p = list_search_pos(L,pos-1);NodePtr q = p->next;p->next = q->next;free(q);q=NULL;printf("删除成功\n");L->len--;  return 0;
}
//链表按位置进行修改
int list_update_pos(NodePtr L, int pos, datatype e)
{if (NULL == L||pos<0 ||pos>L->len||list_empty(L)){printf("修改失败\n");return -1;}NodePtr p = list_search_pos(L,pos);p->data = e;printf("修改成功\n");return 0;
}

main.c

#include"looplinklist.h"
#include<myhead.h>
int main(int argc, const char *argv[])
{NodePtr L = list_create();if(NULL == L){return -1;}list_insert_tail(L,'Q');list_insert_tail(L,'W');list_insert_tail(L,'E');list_insert_tail(L,'R');list_insert_tail(L,'T');list_show(L);list_update_pos(L,2,'P');list_show(L);list_delete_pos(L,3);list_show(L);list_destory(L);L=NULL;return 0;
}

3> 使用循环链表完成约瑟夫环问题

looplinklist.h

#ifndef LOOPLINKLIST_H
#define LOOPLINKLIST_H
#include"myhead.h"
typedef char datatype;typedef struct Node
{union{int len;datatype data;};struct Node *prio;struct Node *next;
}Node,*NodePtr;
//链表创建
NodePtr list_create();
//链表判空
int list_empty(NodePtr L);
//链表申请空间封装节点
NodePtr apply_node(datatype e);
//按位置查找
NodePtr list_search_pos(NodePtr L ,int pos);
//链表尾插
int list_insert_tail(NodePtr L,datatype e);
//链表输出
int list_show(NodePtr L);
//链表头删
int list_delete_head(NodePtr L);
//链表任意位置删除
int list_delete_pos(NodePtr L, int pos);
//链表按位置进行修改
int list_update_pos(NodePtr L, int pos, datatype e);
//链表销毁
void list_destory(NodePtr L);
//约瑟夫
void Josephus_problem(NodePtr L);
#endif

looplinklist.c

#include"looplinklist.h"
//链表创建
NodePtr list_create()
{NodePtr L = (NodePtr)malloc(sizeof(Node));if(NULL == L){printf("创建失败\n");return NULL;}L->len=0;L->next = L;printf("创建成功\n");return L;
}
//链表判空
int list_empty(NodePtr L)
{return L->next==L;
}
//链表申请空间封装节点
NodePtr apply_node(datatype e)
{NodePtr p = (NodePtr)malloc(sizeof(Node));if(NULL == p){printf("创建失败\n");return NULL;}p->data = e;p->next = NULL;return p;
}
//按位置查找
NodePtr list_search_pos(NodePtr L ,int pos)
{if(NULL == L|| pos<0 ||pos>L->len){printf("查找失败\n");return NULL;}NodePtr q = L;for(int i= 0;i<pos;i++){q=q->next;}return q;
}
//链表尾插
int list_insert_tail(NodePtr L,datatype e)
{if(NULL == L){printf("插入失败\n");return -1;}NodePtr q = list_search_pos(L,L->len);NodePtr p = apply_node(e);if(NULL == L){return -1;}p->next = q->next;q->next = p;L->len++;printf("插入成功\n");return 0;
}
//链表输出
int list_show(NodePtr L)
{if(NULL== L||list_empty(L)){printf("遍历失败\n");return -1;}NodePtr q = L->next;while(q!=L){printf("%c\t",q->data);q=q->next;}printf("\n");
}
//链表头删
int list_delete_head(NodePtr L)
{if(NULL==L || list_empty(L)){printf("删除失败\n");return -1;}NodePtr q = L->next;L->next = q->next;free(q);q=NULL;L->len--;printf("删除成功\n");
}
//链表销毁
void list_destory(NodePtr L)
{if(NULL == L){printf("释放失败\n");return;}while(!list_empty(L)){list_delete_head(L);}free(L);L = NULL;printf("销毁成功\n");
}
//链表任意位置删除
int list_delete_pos(NodePtr L, int pos)
{if (NULL == L||pos<0 ||pos>L->len||list_empty(L)){printf("删除失败\n");return -1;}NodePtr p = list_search_pos(L,pos-1);NodePtr q = p->next;p->next = q->next;free(q);q=NULL;printf("删除成功\n");L->len--;  return 0;
}
//链表按位置进行修改
int list_update_pos(NodePtr L, int pos, datatype e)
{if (NULL == L||pos<0 ||pos>L->len||list_empty(L)){printf("修改失败\n");return -1;}NodePtr p = list_search_pos(L,pos);p->data = e;printf("修改成功\n");return 0;
}
void Josephus_problem(NodePtr L)
{int count = 0,num = 0;printf("请输入数到几退出:");scanf("%d",&num);NodePtr p = L;while (!list_empty(L)){if (p->next == L){p = p->next;}count++;if(count+1 == num){printf("%c\t",p->next->data);NodePtr q = p->next;p->next = q->next;free(q);q=NULL;L->len--;  count = 0;}printf("\n");p = p->next;}}

main.c

#include"looplinklist.h"
#include<myhead.h>
int main(int argc, const char *argv[])
{NodePtr L = list_create();if(NULL == L){return -1;}list_insert_tail(L,'Q');list_insert_tail(L,'W');list_insert_tail(L,'E');list_insert_tail(L,'R');list_insert_tail(L,'T');// list_show(L);// list_update_pos(L,2,'P');// list_show(L);// list_delete_pos(L,3);// list_show(L);Josephus_problem(L);list_destory(L);L=NULL;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx详解(超级详细)

目录 Nginx简介 1. 为什么使用Nginx 2. 安装Nginx Nginx的核心功能 1. Nginx反向代理功能 2. Nginx的负载均衡 3 Nginx动静分离 Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在BSD-like 协…

OpenCV分水岭算法watershed函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 我们将学会使用基于标记的分水岭算法来进行图像分割。我们将看到&#xff1a;watershed()函数的用法。 任何灰度图像都可以被视为一个地形表…

199.二叉树的右视图(BFS)

给定一个二叉树的根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: [] 解题…

centos/Ubuntu安装Java/Maven

上图就是今天在Linux环境下安装好Java和Maven后&#xff0c;打包Spring Boot项目的截图&#xff01; 安装Java centos # 安装 yum install -y java-1.8.0-openjdk*# 查看版本检测是否成功安装 java -versionUbuntu # 更新软件包 sudo apt-get update# 安装 sudo apt-get in…

4.Java Web开发模式(javaBean+servlet+MVC)

Java Web开发模式 一、Java Web开发模式 1.javaBean简介 JavaBeans是Java中一种特殊的类&#xff0c;可以将多个对象封装到一个对象&#xff08;bean&#xff09;中。特点是可序列化&#xff0c;提供无参构造器&#xff0c;提供getter方法和setter方法访问对象的属性。名称中…

Java之 jvm

jvm之管理内存 程序计数器&#xff1a;当前线程所执行的字节码的行号指示器。程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域&#xff0c;它的生命周期随着线程的创建而创建&#xff0c;随着线程的结束而死亡。Java虚拟机栈 方法调用 一个方法调用都会有对应的栈帧…

set(集合),multiset容器及pair队组的创建

1.set的基本概念&#xff1a;所有元素再插入时自动按升序排序&#xff0c;set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现的 set与multiset区别&#xff1a; set中不允许容器中有重复的元素 multiset允许容器中有重复的元素 2.set的构造函数 3.set的大小和…

MT6701磁编码IC在自动化插件流水线中的应用

艾毕胜马达控制平台专家 MT6701磁编码IC作为现代工业自动化领域的重要组成部分&#xff0c;其在自动化插件流水线中的应用日益广泛。本文将从MT6701磁编码IC的特性、工作原理、在自动化插件流水线中的具体应用、以及未来的发展趋势等方面&#xff0c;详细探讨其在工业自动化领…

Apache POI-Excel入门与实战

目录 一、了解Apache POI 1.1 什么是Apache POI 1.2 为什么要使用ApaChe POI 1.3 Apache POI应用场景 1.4 Apache POI 依赖 二、Apache POI-Excel 入门案例 2.1 写入Excel文件 2.2 读取文件 四、Apache POI实战 4.1 创建一个获取天气的API 4.2高德天气请求API与响应…

volatile,最轻量的同步机制

目录 一、volatile 二、如何使用&#xff1f; 三、volatile关键字能代替synchronized关键字吗&#xff1f; 四、总结&#xff1a; 还是老样子&#xff0c;先来看一段代码&#xff1a; 我们先由我们自己的常规思路分析一下代码&#xff1a;子线程中&#xff0c;一直循环&…

小技巧:如何在已知PDF密码情况下去掉PDF的密码保护

第一步&#xff0c;用Edge打开你的pdf&#xff0c;输入密码进去 第二步&#xff0c;点击打印 第三步&#xff0c;选择导出PDF&#xff0c;选择彩印 第四步&#xff0c;选择导出位置&#xff0c;导出成功后打开发现没有密码限制了&#xff01;

物联网mqtt网关搭建背后的技术原理

前言 物联网是现在比较热门的软件领域&#xff0c;众多物联网厂商都有自己的物联网平台&#xff0c;而物联网平台其中一个核心的模块就是Mqtt网关。这篇文章的目的是手把手教大家写书写一个mqtt网关&#xff0c;后端存储支持Kafka/Pulsar&#xff0c;支持mqtt 连接、断链、发送…

DevExpress中文教程 - 如何在.NET MAUI应用中实现Material Design 3?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件&#xff0c;该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 获取DevExpress v24.1正式版下载 Material Design是一个由Google开发的跨平台指南系统…

计算机毕业设计hadoop+spark+hive物流大数据分析平台 仓储数据分析 物流预测系统 物流信息爬虫 物流大数据 机器学习 深度学习 知识图谱 大数据

Hadoop物流可视化系统的开题报告 一、课题名称 Hadoop物流可视化系统设计与实现 二、研究背景与意义 随着信息技术的飞速发展&#xff0c;物流行业产生了海量的数据&#xff0c;这些数据包含了订单信息、运输路线、仓储状态等丰富的信息和价值。然而&#xff0c;传统的数据…

谷粒商城实战笔记-44-前端基础-Vue-整合ElementUI快速开发/设置模板代码

文章目录 一&#xff0c;安装导入ElementUI1&#xff0c;安装 element-ui2&#xff0c;导入 element-ui 二&#xff0c;ElementUI 实战1&#xff0c;将 App.vue 改为 element-ui 中的后台布局2&#xff0c;开发导航栏2.1 开发MyTable组件2.2 注册路由2.3 改造App.vue2.4 新增左…

AV1技术学习:Coding Structure

一、SuperBlock SuperBlock 是AV1编解码器可以处理的最大编码块。SuperBlock 大小可以是128 128 或64 64&#xff0c;由 sequence header 控制。SuperBlock 可以进一步划分为更小的编码块&#xff0c;每个编码块都有自己的预测和变换模式。SuperBlock 编码只依赖于它的上侧和…

【jmeter边界值提取器】

【目的】 从响应头中取token的内容 【方案】 使用后置处理器-边界值提取器 【组件路径】HTTP请求->右键添加->后置处理器->边界提取器 用途&#xff1a;边界提取器(Boundary Extractor)是放在Sample请求之后执行的&#xff0c;用于获取左右边界中间的所有字符&#xf…

Anaconda下安装配置Jupyter

Anaconda下安装配置Jupyter 1、安装 conda activate my_env #激活虚拟环境 pip install jupyter #安装 jupyter notebook --generate-config #生成配置文件提示配置文件的位置&#xff1a; Writing default config to: /root/.jupyter/jupyter_notebook_config.py检查版本&am…

指针!!C语言(第二篇)

目录 一. 数组名的理解 二. 一维数组传参的本质 三. 冒泡排序法 四. 二级指针与指针数组 五. 字符指针变量与数组指针 一. 数组名的理解 在我们对指针有了初步的理解之外&#xff0c;今天我们来掌握一些新的知识就是数组与指针&#xff0c;第一个对数组名的了解&#xff…

基于R语言复杂数据回归与混合效应模型【多水平/分层/嵌套】技术与代码

回归分析是科学研究特别是生态学领域科学研究和数据分析十分重要的统计工具&#xff0c;可以回答众多科学问题&#xff0c;如环境因素对物种、种群、群落及生态系统或气候变化的影响&#xff1b;物种属性和系统发育对物种分布&#xff08;多度&#xff09;的影响等。纵观涉及数…