12.17双向链表,循环链表

news2024/12/18 20:18:35

循环单向链表 

1.头文件test.h

#ifndef __TEST_H_
#define __TEST_H_

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

typedef struct node
{
	union
	{
		int len;
		int data;
	};
	struct node *next;
}looplink,*looplinkPtr;

//创建
looplinkPtr create();

//判空
int empty();
//申请节点
looplinkPtr create_node();
//尾插
int tail_add(looplinkPtr H,int e);

//遍历
void  show(looplinkPtr H);
//尾删
void tail_del(looplinkPtr H);
//销毁
void my_free(looplinkPtr H);

#endif

2.源文件test.c

#include"test.h"

//创建
looplinkPtr create()
{
	looplinkPtr H=(looplinkPtr)malloc(sizeof(looplink));
	if (NULL==H)
	{
		printf("创建失败");
		return NULL;
	}
	H->len=0;
	H->next=H;
	printf("创建成功\n");
	return H;
}
//判空
int empty(looplinkPtr H)
{
	
	if(NULL==H)
	{
		printf("判空失败");
		return -1;
	}
	return H->len==0;

}
//申请节点
looplinkPtr create_node(int e)
{
	looplinkPtr p=(looplinkPtr)malloc(sizeof(looplink));
	if (NULL==p)
	{
		printf("申请失败\n");
		return NULL;
	}
	p->data=e;
	p->next=NULL;
	return p;

}
//尾插
int tail_add(looplinkPtr H,int e)
{
	if(NULL==H)
	{
		printf("尾插失败");
		return 0;
	}
//申请节点,封装数据
	looplinkPtr p = create_node(e);

	//定义一个指针,指向最后一个节点
	looplinkPtr q=H;
	while(q->next !=H)
	{
		q=q->next ;
	}
	//尾插
	q->next=p;
	p->next=H;

	H->len++;
	return 1;
	
}
//遍历
void  show(looplinkPtr H)
{
	if(NULL==H||empty(H))
	{
		printf("遍历失败");
		return;
	}
	looplinkPtr p=H;
	for(int i=0;i<H->len;i++)
	{
		p=p->next ;
		printf("%d ",p->data);
	}
	putchar(10);
}


//尾删
void tail_del(looplinkPtr H)
{
	if (NULL==H||empty(H))
	{
		printf("删除失败\n");
		return;
	}
	//定义一个指针,指向最后一个节点的前一个节点
	looplinkPtr q=H;
	for(int i=0;i<H->len-1;i++)
	{
		q=q->next;
	}
	free(q->next);
	q->next=H;

	H->len--;
	return ;

}

//销毁
void my_free(looplinkPtr H)
{
	if (NULL==H)
	{
		printf("销毁失败");
		return ;
	}
	while (H->len>0)
	{
		tail_del (H);
	}
	free(H);
	H=NULL;
	printf ("销毁成功\n");
}

3.测试文件main.c

#include "test.h"

int main()
{
    looplinkPtr H=create();

	tail_add (H,10);
	tail_add (H,20);
	tail_add (H,30);
	tail_add (H,40);
	tail_add (H,50);

	show(H);

	tail_del (H);
	tail_del (H);
	show(H);

	my_free(H);

	return 0 ;
}

双向循环链表

1.头文件test.h

#ifndef __TEST_H__
#define __TEST_H__

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

typedef struct node
{
	union
	{
		int len;
		int data;

	};
	struct node *next;
	struct node *prior;
}doublelooplink,*doublelooplinkptr;


//创建
doublelooplinkptr create();

//判空
int empty(doublelooplinkptr H);
//申请节点

doublelooplinkptr create_node(int e);
//尾插
int tail_add(doublelooplinkptr H,int e);
//遍历
void show(doublelooplinkptr H);
//尾删
int tail_del (doublelooplinkptr H);
//销毁
void my_free(doublelooplinkptr H);


#endif

  2.源文件test.c

#include "test.h"

//创建
doublelooplinkptr create()
{
	doublelooplinkptr H=(doublelooplinkptr)malloc(sizeof(doublelooplink));
	if(NULL==H)
	{
		printf("创建失败\n");
		return NULL;

	}
	H->len==0;
	H->next=H;
	H->prior=H;
	printf("创建成功\n");
	return H;

}
//判空
int empty(doublelooplinkptr H)
{
	if (NULL==H)
	{
		printf("判空失败\n");
		return -1;
	}
	return H->len==0;
}

//申请节点

doublelooplinkptr create_node(int e)
{
	doublelooplinkptr p=(doublelooplinkptr)malloc (sizeof(doublelooplink));
	if (NULL==p)
	{
		printf("申请失败\n");
		return NULL;
	}
	p->data=e;
	p->next=NULL;
	p->prior=NULL;
	return p;

}
//尾插
int tail_add(doublelooplinkptr H,int e)
{
	if (NULL==H)
	{
		printf("尾插失败\n");
		return 0;
	}
	//申请节点 封装数据
	doublelooplinkptr p=create_node (e);
	//定义一个指针
	doublelooplinkptr q=H;
	while(q->next!= H)
	{
		q=q->next;
	}


	//尾插
	p->next=H;
	p->prior=q;
	q->next=p;
	H->prior=p;

	H->len++;
	return 1;
}
//遍历
void show(doublelooplinkptr H)
{
	if (NULL==H)
	{
		printf("遍历失败");
		return;
	}
	doublelooplinkptr p=H;
	for (int i=0;i<H->len;i++)
	{
		p=p->next;
		printf("%d ",p->data);
	}
	putchar(10);
}
//尾删
int tail_del (doublelooplinkptr H)
{	if (NULL==H||empty(H))
	{
		printf("删除失败\n");
		return 0;
	}
	doublelooplinkptr q=H;
for (int i=0;i<H->len-1;i++)
	{
		q=q->next;
	}

	free(q->next);
	q->next=H;
	H->prior =q->next->prior; 


	H->len--;
	return 1;
				
}
//销毁
void my_free(doublelooplinkptr H)
{
	if (NULL==H)
	{
		printf("销毁失败");
		return ;
	}
	while (H->len>0)
	{
		tail_del (H);
	}
	free(H);
	H=NULL;
	printf ("销毁成功\n");
}


 3.测试文件main.c

#include "test.h"


int main()
{
	doublelooplinkptr H=create();

	tail_add(H,10);
	tail_add(H,20);
	tail_add(H,30);
	tail_add(H,40);
	show(H);
	
	tail_del(H);
	tail_del(H);
	show(H);

	my_free(H);	
	return 0;
}

 

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

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

相关文章

【多模态】MiniCPM-V多模态大模型使用学习

MiniCPM-V模型使用 前言1. 模型文件下载和选择2. 环境安装配置3. 模型微调3.1 qlora微调minicpm-v-int43.2 lora微调minicpm-v3.3 merge_lora3.4 lora微调后量化int4 4. 模型推理4.1 huggingface API4.2 swift API(A) swift&#xff08;不支持batch inference&#xff09;(B) s…

VMware ubuntu12.04怎么设置静态IP联网

记得刚开始学习嵌入式就是从ubuntu12.04的环境开始学习的C语言&#xff0c;当时没有弄清楚怎么设置静态IP联网&#xff0c;现在写一篇文章。 1.首先&#xff0c;关闭ubuntu的网络&#xff1b; 2.电脑使用的是wifi,将VMware桥接到该网卡上&#xff1b; 3.在虚拟机设置里面选择桥…

vs 调试

常用&#xff1a; 调试->窗口-> 断点 监视 自动窗口 局部变量 调用堆栈 内存 反汇编&#xff08;也可以右键&#xff0c;转到反汇编&#xff09; 寄存器 快捷键&#xff1a; F5:启用调试&#xff0c;经常用来跳到下一个断点处 F9创建断点和取消断点。断点的重要作用&…

从构想到实现:EasyOne 多模态 AI 产品开发历程

在人工智能技术飞速发展的今天&#xff0c;智能产品和服务已经从单一的应用向多模态智能系统进化。随着大语言模型、计算机视觉、语音识别等领域的突破&#xff0c;开发集成多种 AI 技术的平台变得日益重要。为此&#xff0c;我们开发了 EasyOne&#xff0c;一个全新的 AI 多模…

游戏引擎学习第43天

仓库 https://gitee.com/mrxiao_com/2d_game 介绍运动方程 今天我们将更进一步&#xff0c;探索运动方程&#xff0c;了解真实世界中的物理&#xff0c;并调整它们&#xff0c;以创建一种让玩家感觉愉悦的控制体验。这并不是在做一个完美的物理模拟&#xff0c;而是找到最有趣…

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程,必须以管理员身份运行此实时调试器。是否调试该进程?

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程&#xff0c;必须以管理员身份运行此实时调试器。是否调试该进程? 目录一、前言二、具体原因三、解决方法 目录 报错截图 一、前言 进行应用程序开发时&#xff0c;需要对w3wp进行附加调试等场景&#xff…

idea无法识别文件,如何把floder文件恢复成model

前景&#xff1a; 昨天&#xff0c;我在之前的A1214模块包下新增了一个demo类&#xff0c;然后又新建了一个A1216模块&#xff0c;写了算法题&#xff0c;后面打算用git提交&#xff0c;发现之前的A1214模块下的demo类和新建的模块源文件都已经被追踪了&#xff0c;都是绿色的&…

2024三掌柜赠书活动第三十六期:深度学习高手笔记系列

目录 前言 理解深度学习基础 数据预处理技巧 关于《深度学习高手笔记》 编辑推荐 内容简介 作者简介 图书目录 媒体评论 《深度学习高手笔记》全书速览 结束语 前言 不用多讲&#xff0c;近两年的技术圈关于AI相关的技术讨论层出不穷&#xff0c;而深度学习作为人工…

【技术干货】移动SDK安全风险及应对策略

移动SDK&#xff08;软件开发工具包&#xff09;已经成为应用开发中不可或缺的一部分。通过SDK&#xff0c;开发者能够快速集成分析、广告调度、音视频处理、社交功能和用户身份验证等常见功能&#xff0c;而无需从零开始构建。这不仅能节省时间和资源&#xff0c;还能提高开发…

【一文概述】常见的几种内外网数据交换方案介绍

一、内外网数据交换的核心需求 内外网数据交换的需求核心在于“安全、效率、合规”&#xff0c;而应用场景的多样性使得不同企业需要定制化的解决方案。通过结合业务特性和安全等级要求&#xff0c;企业能够选择适合的技术方案来实现高效、安全的内外网数据交换。 1、数据安全…

【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程

文章目录 【Linux 篇】Docker 容器星河与镜像灯塔&#xff1a;Linux 系统下解锁应用部署奇幻征程前言一 、docker上部署mysql1. 拉取mysql镜像2. 创建容器3. 远程登录mysql 二 、docker上部署nginx1. 拉取nginx镜像2. 在dockerTar目录下 上传nginx.tar rz命令3. 创建nginx容器4…

Pytorch | 从零构建Vgg对CIFAR10进行分类

Pytorch | 从零构建Vgg对CIFAR10进行分类 CIFAR10数据集Vgg网络结构特点性能应用影响 Vgg结构代码详解结构代码代码详解特征提取层 _make_layers前向传播 forward 训练和测试训练代码train.py测试代码test.py训练过程和测试结果 代码汇总vgg.pytrain.pytest.py 前面文章我们构建…

实战 | 某院校小程序记录

更多大厂面试经验的视频分享看主页和专栏 目录&#xff1a; 前言&#xff1a; 渗透思路 1.绕过前端 2.信息泄露 3.爆破用户账号密码 4.信息泄露2 结束 前言&#xff1a; 遇到一个学校小程序的站点&#xff0c;只在前端登录口做了校验&#xff0c;后端没有任何校验&#x…

k8s kubernetes

文章目录 CGroupk8s运行时k8s组件k8s组件安装kubeadm命令kubectl命令k8s官网代码 CGroup 在 Linux 上&#xff0c;控制组&#xff08;CGroup&#xff09;用于限制分配给进程的资源。kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、…

uniapp中vuex(全局共享)的应用

一、Vuex概述 1.1 官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 它采用集中式存储管理 应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化 - Vuex 也集成到 Vue 的官方调试工具 devtools extension&#xff0c;提供了诸…

React简单入门 - [Next.js项目] - 页面跳转、AntD组件、二级目录等

须知 1Next.js 官网(英文)Next.js by Vercel - The React Framework2Next.js 文档(中文)简介 | Next.js 中文文档3React官网(中文)https://react.docschina.org/learn4Ant Design组件总览组件总览 - Ant Design5tailwindcss类名大全 官网英Justify Content - TailwindCS…

【十进制整数转换为其他进制数——短除形式的贪心算法】

之前写过一篇用贪心算法计算十进制转换二进制的方法&#xff0c;详见&#xff1a;用贪心算法计算十进制数转二进制数&#xff08;整数部分&#xff09;_短除法求二进制-CSDN博客 经过一段时间的研究&#xff0c;本人又发现两个规律&#xff1a; 1、不仅仅十进制整数转二进制可…

企业内训|阅读行业产品运营实战训练营-某运营商数字娱乐公司

近日&#xff0c;TsingtaoAI公司为某运营商旗下数字娱乐公司组织的“阅读行业产品运营实战训练营”在杭州落下帷幕。此次训练营由TsingtaoAI资深互联网产品专家程靖主持。该公司的业务骨干——来自内容、市场、业务、产品与技术等跨部门核心岗位、拥有8-10年实战经验的中坚力量…

pinctrl子系统学习笔记

一、背景 cpu的gpio引脚可以复用成多个功能&#xff0c;如可以配置成I2C或者普通GPIO模式。配置方式一般是通过写引脚复用的配置寄存器&#xff0c;但是不同芯片厂商配置寄存器格式内容各不相同&#xff0c;设置引脚复用无法做到通用且自由的配置&#xff0c;只能在启动初始化…

免费开源了一个图床工具 github-spring-boot-starter

文章目录 第一步&#xff0c;新建一个SpringBoot项目第二步&#xff0c;在pom文件里面引入jar包第三步&#xff0c;配置你的github信息github.authorization1、进入github官网&#xff0c;登录账号&#xff0c;点击头像&#xff0c;选择setting2、选择[Developer Settings](htt…