12.17双向链表,循环链表

循环单向链表 

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;
}

 

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

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

相关文章

图的最小生成树(C++实现图【3】)

目录 1.最小生成树 1.1 Kruskal算法 代码部分 1.2 Prim算法 代码部分 1.最小生成树 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树就不在连通&#xff1b;反之&#xff0c;在其中引入任何一…

解决电脑网速慢问题:硬件检查与软件设置指南

电脑网速慢是许多用户在使用过程中常见的问题&#xff0c;它不仅会降低工作效率&#xff0c;还可能影响娱乐体验。导致电脑网速慢的原因多种多样&#xff0c;包括硬件问题、软件设置和网络环境等。本文将从不同角度分析这些原因&#xff0c;并提供提高电脑网速的方法。 一、检查…

Python-基于Pygame的小游戏(贪吃蛇)(一)

前言:贪吃蛇是一款经典的电子游戏&#xff0c;最早可以追溯到1976年的街机游戏Blockade。随着诺基亚手机的普及&#xff0c;贪吃蛇游戏在1990年代变得广为人知。它是一款休闲益智类游戏&#xff0c;适合所有年龄段的玩家&#xff0c;其最初为单机模式&#xff0c;后来随着技术发…

MySQL表的增删改查(2)

1.数据库约束 1)约束类型 not null指定某列不能存储null值unique保证某列的每一行必须有唯一值default规定没有给列赋值时的默认值primary keynot null和unique的结合,一张表里只能有一个,作为身份标识的数据foreign key保证一个表的数据匹配另一个表中的值的参照完整性check…

职场人如何提升职业技能?

职场人如何提升职业技能&#xff1f; 在职场中&#xff0c;每个人都像是一名航行在广阔大海上的水手&#xff0c;面对着不断变化的风浪和挑战。要想在这片职场海洋中稳步前行&#xff0c;甚至脱颖而出&#xff0c;提升职业技能是必不可少的。那么&#xff0c;职场人究竟该如何…

IVE Model 2.0.2运行报错:Error launching application × could not locate Java runtime

在windows电脑上运行IVE Model 2.0.2程序的时候弹窗报错: could not locate Java runtime 一、原因分析 第一次安装的时候,很确定自己的JDK环境安装是没有问题,但是运行仍然会报错,由于软件没有说明使用什么版本的JDK只能挨个尝试,换了几个版本仍然不行,忽然想到,这个软…

模型训练篇 | 关于常见的10种数据标注工具介绍

前言:Hello大家好,我是小哥谈。数据标注工具是一种用于标记和分类数字图像、音频、视频或文本等数据集的工具。数据标注工具可以自动或手动标记数据集中的对象、人脸、物体、文字等,以便机器学习模型能够理解和识别这些数据。数据标注工具通常由开发者或数据标注团队开发和使…

Linux应用开发————mysql数据库

数据库概述 什么是数据库(database)? 数据库是一种数据管理的管理软件&#xff0c;它的作用是为了有效管理数据&#xff0c;形成一个尽可能无几余的数据集合&#xff0c;并能提供接口&#xff0c;方便用户使用。 数据库能用来干什么? 顾名思义&#xff0c;仓库就是用来保存东…

c++理解(三)

本文主要探讨c相关知识。 模板是对类型参数化 函数模板特化不是模板函数重载 allocator(空间配置器):内存开辟释放,对象构造析构 优先调用对象成员方法实现的运算符重载函数,其次全局作用域找 迭代器遍历访问元素,调用erase&#xff0c;insert方法后&#xff0c;当前位置到容器…

动态规划——最长公共子序列

文章目录 概要整体流程问题描述递推公式由来两个序列的最后一位相等两个序列的最后一位不等左图右图 表格填写dp 表格定义递推公式填表过程填表过程解析最终结果 小结 概要 动态规划相关知识 求解最长的公共子序列 整体流程 问题定义与区分&#xff1a;理解最长公共子串与最…

Node的学习以及学习通过Node书写接口并简单操作数据库

Node的学习 Node的基础上述是关于Node的一些基础&#xff0c;总结的还行&#xff1b; 利用Node书写接口并操作数据库 1. 初始化项目 创建新的项目文件夹&#xff0c;并初始化 package.json mkdir my-backend cd my-backend npm init -y2. 安装必要的依赖 安装Express.js&…

arXiv-2024 | NavAgent:基于多尺度城市街道视图融合的无人机视觉语言导航

作者&#xff1a;Youzhi Liu, Fanglong Yao*, Yuanchang Yue, Guangluan Xu, Xian Sun, Kun Fu 单位&#xff1a;中国科学院大学电子电气与通信工程学院&#xff0c;中国科学院空天信息创新研究院网络信息系统技术重点实验室 原文链接&#xff1a;NavAgent: Multi-scale Urba…

易语言鼠标轨迹算法(游戏防检测算法)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

Three.js材质纹理扩散过渡

Three.js材质纹理扩散过渡 import * as THREE from "three"; import { ThreeHelper } from "/src/ThreeHelper"; import { LoadGLTF, MethodBaseSceneSet } from "/src/ThreeHelper/decorators"; import { MainScreen } from "/src/compone…

apache-tomcat-6.0.44.exe Win10

apache-tomcat-6.0.44.exe Win10

赫布定律 | 机器学习 / 反向传播 / 经验 / 习惯

注&#xff1a;本文为 “赫布定律” 相关文章合辑。 未整理。 赫布定律 Hebb‘s law 馥墨轩 2021 年 03 月 13 日 00:03 1 赫布集合的基本定义 唐纳德・赫布&#xff08;Donald Hebb&#xff09;在 1949 年出版了《行为的组织》&#xff08;The Organization of Behavior&a…

uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能

前言 这次的标题有点长&#xff0c;主要是想要表述的功能点有点多&#xff1b; 简单做一下需求描述 产品要求在商品详情页的头部轮播图部分&#xff0c;可以单击预览大图&#xff0c;同时在预览界面可以双指放大缩小图片并且可以移动查看图片&#xff0c;双击放大&#xff0…

杭州乘云联合信通院发布《云计算智能化可观测性能力成熟度模型》

原文地址&#xff1a;杭州乘云联合中国信通院等单位正式发布《云计算智能化可观测性能力成熟度模型》标准 2024年12月3日&#xff0c;由全球数字经济大会组委会主办、中国信通院承办的 2024全球数字经济大会 云AI计算创新发展大会&#xff08;2024 Cloud AI Compute Ignite&…

第6章图6.21-6.27-《分析模式》原图和UML图对比

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集

如何在谷歌浏览器中设置广告屏蔽

在数字时代&#xff0c;网络广告无处不在&#xff0c;虽然它们为网站提供了收入来源&#xff0c;但有时也会干扰我们的浏览体验。如果你正在寻找一种方法来减少这些干扰&#xff0c;那么在谷歌浏览器中设置广告屏蔽是一个不错的选择。本文将指导你完成这一过程&#xff0c;并简…