华清数据结构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--;
}
//链表销毁
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;}	if (num ==1){printf("%c\t",list_search_pos(L,1)->data);list_delete_head(L);}else	if(count == num-1) {printf("%c\t",p->next->data);NodePtr q = p->next;p->next = q->next;free(q);q=NULL;L->len--;  count = 0;}count++;p = p->next;}printf("\n");
}

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.mzph.cn/pingmian/50256.shtml

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

相关文章

【Tomcat】快速入门

概述 Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级Web服务器&#xff0c;支持Servlet/JSP.少量avaEE规范。Tomcat Tomcat也被称为Web容器、Servlet容器。Servleti程序需要依赖于Tomcat才能运行。 安装使用 下载安装都是绿色版本&#xff0c;解…

Git、Gitlab以及分支管理

分布式版本控制系统 一、Git概述 Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更。它由Linus torvalds创建的&#xff0c;最初被设计用于Linux内核的开发。Git 允许开发人员跟踪和管理代码的版本&#xff0c;并且可以在不同的开发人员之间进行协作。 Githu…

全年销售7亿块,巧克力企业如何通过相邻业务打造极致产品力?

蒂罗尔巧克力是日本经典的巧克力品牌。 糖果业务是松尾早期的主营业务&#xff0c;在主营业务下滑的情况下&#xff0c;确立新的竞争方向&#xff0c;通过主营业务优势进入相邻业务&#xff0c;打造新产品成就巧克力极致产品力&#xff0c;避免衰退重回增长。 如何通过进入相邻…

MFC列表框示例

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 目录 1.示例内容 2.程序步骤 3.运行结果 4.代码全文 1.示例内容 编写一个对话框应用程序CMFC_Li6_4_学生信息Dlg&#xff0c;对话框中有一个列表框&#xff0c;当用户…

matlab gui下的tcp client客户端编程框架

GUI界面 函数外定义全局变量 %全局变量 global TcpClient; %matlab作为tcpip客户端 建立连接 在“连接”按钮的回调函数下添加以下代码&#xff1a; global TcpClient;%全局变量 TcpClient tcpip(‘192.168.1.10’, 7, ‘NetworkRole’,‘client’); %连接到服务器地址和端…

sqlalchemy报错sqlalchemy.orm.exc.DetachedInstanceError

解决方案&#xff1a; 在初始化数据库的代码中&#xff0c;将 maker sessionmaker(bindeng)修改为 maker sessionmaker(bindeng, expire_on_commitFalse)为什么要添加 expire_on_commitFalse 参数&#xff1f; expire_on_commit 可以用来更改 SQLAlchemy 的对象刷新机制&…

【Hot100】LeetCode—152. 乘积最大子数组

目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;152. 乘积最大子数组 1- 思路 动规五部曲 2- 实现 ⭐152. 乘积最大子数组——题解思路 class Solution {public int maxProduct(int[] nums) {// 初始化答案以及以第一个元…

windows wsl ubuntu系统安装桌面可视化

参考&#xff1a; https://www.bilibili.com/read/cv33557374/ 1&#xff09;首先先安装好wsl ubuntu系统 2&#xff09;安装 Ubuntu 桌面版 sudo apt purge -y acpid acpi-support modemmanagersudo apt-mark hold acpid acpi-support modemmanager sudo apt install ubunt…

OpenSearch 实现自动化告警

本文将介绍如何使用 Amazon OpenSearch 服务设置自动化告警,并通过 SNS、Lambda 和钉钉实现告警通知。 1. 创建 SNS 主题和订阅 首先,我们需要创建一个 SNS 主题来发送通知: 登录 AWS 控制台,进入 SNS 服务。点击"创建主题",选择标准类型,为主题命名。创建主…

等保测评与业务连续性管理:确保业务不中断的安全策略

随着信息技术的飞速发展&#xff0c;企业信息化程度不断加深&#xff0c;信息安全问题日益凸显。数据泄露、网络攻击、系统瘫痪等安全事件频发&#xff0c;不仅威胁到企业的核心资产和业务连续性&#xff0c;还可能造成重大经济损失和社会影响。因此&#xff0c;构建和完善等级…

黑马头条Day09-用户行为

一、课前准备 1. long类型精度丢失问题 解决方案&#xff1a; 当后端响应给前端的数据中包含了id或者特殊标识&#xff08;可自定义&#xff09;的时候&#xff0c;把当前数据进行转换为String类型当前端传递给后端的dto中有id或者特殊标识&#xff08;可自定义&#xff09;的…

SSH跨操作系统免密文件传输

目录 一、Windows如何通过SSH向Linux系统传输文件 1.1. 安装SSH客户端&#xff1a; 1.2. 配置WinSCP&#xff1a; 1.3. 传输文件&#xff1a; 1.4. 文件传输免输入密码、RSA公钥设置流程 二、Linux系统之间的文件传输 2.1. 使用scp命令&#xff1a; 2.2. 从远程服务器下…

Windows环境下安装docker、配置Ubuntu容器并使用vscode ssh连接到容器

目录 一、Windows环境下安装docker二、配置Ubuntu三、在容器中安装ssh服务参考文章 一、Windows环境下安装docker 在任务栏中搜索**“Windows功能”** -将适用于Linux的Windows子系统和虚拟机平台选上 然后按照提示重启电脑。然后开始安装WSL。通过cmd以管理员身份打开命令提…

OSPF概述

OSPF OSPF属于内部网关路由协议【IGP】 用于单一自治系统【Autonomous System-AS】内决策路由 自治系统【AS】 执行统一路由策略的一组网络设备的组合 OSPF概述 为了适应大型的网络&#xff0c;OSPF在AS内划分多个区域 每个OSPF路由器只维护所在区域的完整的链路状态信息 …

Ubuntu-迁移22.04从机械盘到固态盘

使用dd迁移22.04到新硬盘 一、概述二、详细过程1. 拷贝数据2. 更新硬盘信息3. 修改Grub 引导4. 参考链接 一、概述 Ubuntu&#xff1a;22.04 记录一下把机械硬盘中的Ubuntu移动到新的固态硬盘中&#xff0c;原机械硬盘大小是1T&#xff0c;目标固态硬盘为1T。 之前的Ubuntu安…

ARM编程指令一

预备知识 1. 寻找地址表现形式 立即数地址&#xff08;Immediate Addressing&#xff09; LDR R0, 0x2000 // 将立即数 0x2000 作为地址加载到寄存器 R0 中寄存器间接寻址&#xff08;Register Indirect Addressing&#xff09; 使用寄存器的值作为内存地址进行数据存取。 …

oracle 查询锁表

oracle 查询锁表 SELECT o.object_name, s.sid, s.serial#, p.spid, s.username, s.program FROM v l o c k e d o b j e c t l J O I N d b a o b j e c t s o O N l . o b j e c t i d o . o b j e c t i d J O I N v locked_object l JOIN dba_objects o ON l.object_id …

ufw命令简介

正文共&#xff1a;3999 字 41 图&#xff0c;预估阅读时间&#xff1a;4 分钟 我们之前在CentOS系统中研究了iptables命令的使用方法&#xff08;iptables命令简介&#xff09;&#xff0c;还做了简单的应用实验&#xff08;如何通过iptables配置URL过滤黑名单&#xff1f;、如…

速盾 CDN 提高网络安全性的方法有哪些?

CDN&#xff08;内容分发网络&#xff09;是一种广泛应用于互联网的网络架构&#xff0c;其主要目的是提高网站的访问速度和网络安全性。速盾 CDN 作为一家网络安全服务提供商&#xff0c;采取了多种方法来提高网络安全性。 首先&#xff0c;速盾 CDN 利用分布式架构来提高网络…

Vue3 + Vite 打包引入图片错误

1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入&#xff0c;注意src最好引用为符引入&#xff0c;不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …