2024.7.22 作业

news2024/11/24 3:35:54

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

循环链表

looplinklist.h
#ifndef LOOPLINKLIST_H
#define LOOPLINKLIST_H

#include <myhead.h>

typedef int datatype;

typedef struct Node
{
	union 
	{
		int len;
		datatype data;
	};
	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);

//链表销毁
void list_destroy(NodePtr L);

//约瑟夫环
void ysfh(NodePtr L,int m);

#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=1;i<=pos;i++)
	{
		q=q->next;
	}
	return q;
}


//链表尾插
int list_insert_tail(NodePtr L,datatype e)
{
	if( NULL==L )
	{
		printf("尾插失败\n");
		return -1;
	}
	NodePtr p = apply_node(e);
	if( NULL==p )
	{
		return -1;
	}
	NodePtr q = list_search_pos(L,L->len);
	p->next = q->next;
	q->next = p;
	L->len++;
	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("%d\t",q->data);
		q = q->next;
	}
	printf("\n");
	return 0;
}


//链表头删
int list_delete_head(NodePtr L)
{
	if( NULL==L || list_empty(L) )
	{
		printf("头删失败\n");
		return -1;
	}
	NodePtr q = L->next;
	L->next = q->next;
	L->len--;
	free(q);
	q=NULL;
	return 0;
}


//链表销毁
void list_destroy(NodePtr L)
{
	if( NULL==L )
	{
		printf("销毁失败\n");
		return ;
	}
	while( !list_empty(L) )
	{
		list_delete_head(L);
	}
	free(L);
	L=NULL;
	printf("销毁成功\n");
	return;
}

双向链表 

doublelinklist.h
#ifndef DOUBLELINKLIST_H
#define DOUBLELINKLIST_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);


#endif
doublelinklist.c
#include "doublelinklist.h"

//创建双向链表
NodePtr list_create()
{
	NodePtr L = (NodePtr)malloc(sizeof(Node));
	if( NULL==L )
	{
		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
}


//链表头插
int list_insert_head(NodePtr L,datatype e)
{
	if( NULL==L )
	{
		printf("头插失败\n");
		return -1;
	}
	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++;

	return 0;
}

//链表遍历
int list_show(NodePtr L)
{
	if( NULL==L || list_empty(L) )
	{
		printf("遍历失败\n");
		return -1;
	}
	printf("当前数据为:");
	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=1;i<=pos;i++)
	{
		q = q->next;
	}
	return q;
}


//链表任意位置删除
int list_delete_pos(NodePtr L,int pos)
{
	if( NULL==L || list_empty(L) || pos<1 || pos>L->len )
	{
		printf("删除失败\n");
		return -1;
	}

	NodePtr q = list_search_pos(L,pos);
	if( q->next==NULL )
	{
		q->prio->next==NULL;
	}
	else
	{
		q->prio->next = q->next;
		q->next->prio = q->prio;
	}
	free(q);
	q=NULL;
	L->len--;
	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 ;
}

 

2.使用循环链表完成约瑟夫环问题

//约瑟夫环
void ysfh(NodePtr L,int m)
{
	NodePtr p = L->next;
	NodePtr q = L;
	while( p->next!=p )
	{
		for(int i=1;i<m;i++)
		{
			q = p;
			p = p->next;
			if(p==L)
			{
				q=q->next;
				p=p->next;
			}
		}
		printf("%d\t",p->data);
		NodePtr a = p;           //标记
    		q->next = p->next;   //p->next 孤立
		p=p->next;
    		free(a);                   //释放
    		a = NULL;
	}
    	printf("\n最后剩下的节点: %d\n", p->data);  
    	free(p); // 释放最后一节点  

}

3.使用栈,完成进制转换

输入:一个整数,进制数

输出:该数的对应的进制数

void DC(StackPtr S,int m,int n)
{
	while(m/n!=0)
	{
		S->top++;
		S->data[S->top]=m%n;
		m=m/n;
	}
	S->top++;
	S->data[S->top]=1;
	while(S->top!=-1)
	{
		printf("%d",S->data[S->top]);
		S->top--;
	}
	printf("\n");
}

思维导图

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

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

相关文章

Jetpack Compose 通过 OkHttp 发送 HTTP 请求的示例

下面是一个使用 Kotlin 和 Jetpack Compose 来演示通过 OkHttp 发送 HTTP 请求的示例。这个示例包括在 Jetpack Compose 中发送一个 GET 请求和一个 POST 请求&#xff0c;并显示结果。 添加okhttp依赖 首先&#xff0c;在你的 build.gradle.kts 文件中添加必要的依赖&#xf…

解决:uniapp 小程序 使用swiper 内部嵌套另外一个拥有左右滑动组件导致滑动冲突

解决办法 在swiper-item 内增加这个属性进行包裹 touchmove.stop <div touchmove.stop><qiun-data-charts type"area" :opts"optsStg" :chartData"dateDataStg" /> </div>

最优化理论与方法-第十讲-对偶理论的基本性质和割平面法

文章目录 1. 向量化拉格朗日对偶函数2. 对偶问题是凹函数3. 对偶问题转换4. 外逼近法4.1 步骤4.2 注意事项 1. 向量化拉格朗日对偶函数 ( D ) max ⁡ d ( λ , μ ) s t . λ i ≥ 0 , i 1 , ⋯ , m , d ( λ , μ ) min ⁡ x ∈ X { f ( x ) ∑ i 1 m λ i g i ( x ) ∑ …

传神社区|数据集合集第7期|法律NLP数据集合集

自从ChatGPT等大型语言模型&#xff08;Large Language Model, LLM&#xff09;出现以来&#xff0c;其类通用人工智能&#xff08;AGI&#xff09;能力引发了自然语言处理&#xff08;NLP&#xff09;领域的新一轮研究和应用浪潮。尤其是ChatGLM、LLaMA等普通开发者都能运行的…

CrowdStrike更新致850万Windows设备宕机,微软紧急救火!

7月18日&#xff0c;网络安全公司CrowdStrike发布了一次软件更新&#xff0c;导致全球大范围Windows系统宕机。 预估CrowdStrike的更新影响了将近850万台Windows设备&#xff0c;多行业服务因此停滞&#xff0c;全球打工人原地放假&#xff0c;坐等吃瓜&#xff0c;网络上爆梗…

TCP并发服务器多线程

1.创建线程‐‐pthread_create int pthread_create( pthread_t *thread, // 线程 ID 无符号长整型 const pthread_attr_t *attr, // 线程属性&#xff0c; NULL void *(*start_routine)(void *), // 线程处理函数 void *arg); // 线程处理函数 参数&#xff1a; pthrea…

EXCEL怎么自动添加表格吗?

第一步&#xff0c;选中需要添加表格的范围 第二步&#xff0c;点击开始&#xff0c;选择条件格式&#xff0c;“使用公式确定要设置格式的单元格” 第三步&#xff0c;编辑规则说明加上<>"" 第四步&#xff0c;点击边框&#xff0c;选择外边框确定即可&#x…

STM32CubeIDE(CAN)

目录 一、概念 1、简述 2、CAN 的几种模式 二、实践 1、环回模式轮询通信 1.1 软件配置 1.2 代码编写 2、环回模式中断通信 2.1 软件配置 2.2 代码编写 一、概念 1、简述 STM32微控制器系列包含多个型号&#xff0c;其中一些型号集成了CAN&#xff08;Controller Are…

用移动硬盘装系统里面资料会全删吗?误装系统怎么办

使用‌移动硬盘装系统是一种可行的选择&#xff0c;尤其是当你需要在多台电脑上使用相同的操作系统时。然而&#xff0c;对于初次尝试的新手来说&#xff0c;可能会有一些疑虑&#xff1a;在将移动硬盘用作系统安装盘后&#xff0c;原有的数据是否会被完全删除&#xff1f;如果…

邮件安全篇:邮件反垃圾系统运作机制简介

1. 什么是邮件反垃圾系统&#xff1f; 邮件反垃圾系统是一种专门设计用于检测、过滤和阻止垃圾邮件的技术解决方案。用于保护用户的邮箱免受未经请求的商业广告、诈骗信息、恶意软件、钓鱼攻击和其他非用户意愿接收的电子邮件的侵扰。 反垃圾系统的常见部署形式 2. 邮件反垃圾…

3GPP眼中的XR及其技术特点

3GPP R18 支持了XR Services。XR需要高数据速率和低延迟通信&#xff0c;这也真是5G可以大展身手的地方。这篇就从3GPP的角度看下XR是什么以及XR有哪些技术特点。 Extended Reality (XR) 是指由计算机技术和可穿戴设备生成的所有现实与虚拟相结合的环境和人机交互技术。 实际上…

【ELK】window下ELK的安装与部署

ELK的安装与部署 1. 下载2. 配置&启动2.1 elasticsarch2.1.1 生成证书2.1.2 生成秘钥2.1.3 将凭证迁移到指定目录2.1.4 改配置2.1.5 启动2.1.6 访问测试2.1.7 生成kibana账号 2.2 kibana2.2.1 改配置2.2.2 启动2.2.3 访问测试 2.3 logstash2.3.1 改配置2.3.2 启动 2.4 file…

SQL injection UNION attacks SQL注入联合查询攻击

通过使用UNION关键字&#xff0c;拼接新的SQL语句从而获得额外的内容&#xff0c;例如 select a,b FROM table1 UNION select c,d FROM table2&#xff0c;可以一次性查询 2行数据&#xff0c;一行是a&#xff0c;b&#xff0c;一行是c&#xff0c;d。 UNION查询必须满足2个条…

Potree在web端显示大型点云模型文件

一、克隆项目代码&#xff08;准备好上网工具&#xff0c;得先有node.js npm 环境&#xff09; git clone https://github.com/potree/potree.git二、依赖安装&#xff08;换淘宝镜像能快一些&#xff09; cd potree npm install三、运行 npm start四、使用样例 打开浏览器…

【Linux学习】常用基本指令

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;Linux学习 目录 &#x1f308;前言&#x1f525;XShell的一些使用查看Linux主机IP使用XShell登录主机XShell下的复制粘贴 &#x1f525;Linux下常用基本指令ls指令pwd指令cd指定touch指令…

Java:115-Spring Boot的底层原理(下篇)

这里续写上一章博客&#xff08;115章博客&#xff09; SpringBoot视图技术&#xff1a; 支持的视图技术 &#xff1a; 前端模板引擎技术的出现&#xff08;jsp也是&#xff09;&#xff0c;使前端开发人员无需关注后端业务的具体实现&#xff08;jsp中&#xff0c;具体的…

Windows 如何把软件从C盘移到其他盘

不知道您有没有发现&#xff0c;当我们下载安装程序时&#xff0c;程序通常会默认自动安装在C盘驱动器中&#xff0c;如果您不手动修改路径的话&#xff0c;C盘驱动器上的可用空间将逐渐减少&#xff0c;并会在不久的将来出现 C盘已满 问题&#xff0c;这可能会导致您的电脑性能…

python实现责任链模式

把多个处理方法串成一个list。下一个list的节点是上一个list的属性。 每个节点都有判断是否能处理当前数据的方法。能处理&#xff0c;则直接处理&#xff0c;不能处理则调用下一个节点&#xff08;也就是当前节点的属性&#xff09;来进行处理。 Python 实现责任链模式&#…

【Python】sqlite加密库pysqlcipher3编译安装步骤

目录 说明准备工作openssl编译sqlite tclsetup.py修改quote_argumentopenssl路径 安装加密示例代码测试附录参考 说明 pysqlcipher3是针对Python 3使用的pysqlcipher的一个分支&#xff0c; 尽管仍然维护对Python 2的支持。它仍然处于测试阶段&#xff0c; 尽管这个库包含的最…

电脑没有摄像头怎么用手机当摄像头?虚拟摄像头使用的详细教程来了(全)

随着科技水平以及全球化经济的快速发展&#xff0c;视频会议、在线课程和直播已经成为日常办公或者生活中必不可少的一个环节。然而&#xff0c;在如今仍有许多台式电脑和一些老旧的笔记本电脑并没有内置摄像头&#xff0c;亦或者自带的摄像头质量不够理想&#xff0c;这使得视…