C++数据结构笔记(8)循环链表实现

news2024/9/25 1:22:56

1.循环链表与单链表的区别在于尾部结点存在指向头结点的指针

2.无论尾部结点指向第一个结点(头结点)还是第二个结点(第一个有效结点),都可以被称为循环链表

3.判断循环结束的两种方式:遍历次数等于size;或判断next指针是否指向头结点

4.在初始化时,头结点需要指向自己


CirCleLinkLsist.h头文件

#ifndef CIRCLELINKLIST
#define CIRCLELINKLIST

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

//结点结构体 
typedef struct CirCleLinkNode{
	struct CirCleLinkNode* next;
}CirCleLinkNode;
//链表结构体 
typedef struct CirCleLinkList{
	CirCleLinkNode head;
	int size;
	//结构体的本质就是维护链表的诸多性质 
}CirCleLinkList;

//比较回调 
typedef int(*ComPareNode)(CirCleLinkNode*,CirCleLinkNode*);
//打印回调
typedef void(*PrintNode)(CirCleLinkNode*); 

//初始化
CirCleLinkList* Init_CirCleLinkList();
//插入
void Insert_CirCleLinkList(CirCleLinkList *clist,int pos,CirCleLinkNode* data);
//获取第一个元素 
CirCleLinkNode* Front_CirCleLinkList(CirCleLinkList* clist,int pos);
//根据位置删除
void RemoveByPos_CirCleLinkList(CirCleLinkList* clist,int pos);
//根据值删除 
void RemoveByValue_CirCleLinkList(CirCleLinkList* clist,CirCleLinkNode* data,ComPareNode compare);
//获得链表长度
int Size_CirCleLinkList(CirCleLinkList* clist); 
//判断是否为空
int IsEmpty_CirCleLinkList(CirCleLinkList* clist); 
//按值查找
int Find_CirCleLinkList(CirCleLinkList* clist,CirCleLinkNode* data,ComPareNode compare);
//打印
void Print_CirCleLinkList(CirCleLinkList* clist,PrintNode print);
//释放内存
void FreeSpace_CirCleLinkList(CirCleLinkList* clist);

#endif

CirCleLinkLsist.c源文件

初始化

CirCleLinkList* Init_CirCleLinkList(){
	
	CirCleLinkList* clist=(CirCleLinkList*)malloc(sizeof(CirCleLinkList)) ;
	clist->head.next=&(clist->head);
	clist->size=0;
	
	return clist;
}

插入

void Insert_CirCleLinkList(CirCleLinkList *clist,int pos,CirCleLinkNode* data){
	if(clist==NULL)
		return;
	if(data==NULL)
		return;
	if(pos<0||pos>clist->size)
		pos=clist->size;
	//如果越界则直接在最后一位插入即可 
	//创建辅助指针
	CirCleLinkNode* pCurrent=&(clist->head);
	for(int i=0;i<pos;i++)
	 	pCurrent=pCurrent->next;
	//新数据入链表
	data->next=pCurrent->next;
	pCurrent->next=data;
	
	clist->size++;
	
}

获取第一个元素 

CirCleLinkNode* Front_CirCleLinkList(CirCleLinkList* clist,int pos){
	return clist->head.next;
	//注意返回的是头结点的下一位 
}

根据位置删除

void RemoveByPos_CirCleLinkList(CirCleLinkList* clist,int pos){
	if(clist==NULL)
		return;
	if(pos<0||pos>=clist->size)
		return;
	CirCleLinkNode* pCurrent=&(clist->head);
	for(int i=0;i<pos;i++)
	 	pCurrent=pCurrent->next;
	
	//缓存目标被删除结点的下一个结点
	
	CirCleLinkNode* pNext=pCurrent->next; 
	pCurrent->next=pCurrent->next;
	
	clist->size--;
}

根据值删除 

void RemoveByValue_CirCleLinkList(CirCleLinkList* clist,CirCleLinkNode* data,ComPareNode compare){
	if(clist==NULL)
		return;
	if(data==NULL)
		return;
		
	CirCleLinkNode* pPrev=&(clist->head);
	CirCleLinkNode* pCurrent=pPrev->next;
	for(int i=0;i<=clist->size;i++)
	{
		if(compare(pCurrent,data)==1)
		{
			pPrev->next=pCurrent->next;
		}
			break;
		//指针后移 
		pPrev=pCurrent;
		pCurrent=pPrev->next;
	}
	clist->size--;
}

获得链表长度

int Size_CirCleLinkList(CirCleLinkList* clist){
	return clist->size;
}

判断是否为空

int IsEmpty_CirCleLinkList(CirCleLinkList* clist){
	if(clist->size==0)
		return 1;
	else
		return 0;
	
	return 0;
}

按值查找

int Find_CirCleLinkList(CirCleLinkList* clist,CirCleLinkNode* data,ComPareNode compare){
	if(clist==NULL)
		return -1;
	if(data==NULL)
		return -1;
	
	int flag=-1;
	CirCleLinkNode* pCurrent=clist->head.next;
	for(int i=0;i<clist->size;i++)
	{
		if(compare(pCurrent,data)==1)
		{
			flag=i;
			break;
		}
		pCurrent=pCurrent->next;
	} 
	return flag;
}

打印

void Print_CirCleLinkList(CirCleLinkList* clist,PrintNode print){
	if(clist==NULL)
		return;
	CirCleLinkNode* pCurrent=clist->head.next;
	for(int i=0;i<clist->size;i++)
	{
		if(pCurrent==&(clist->head))
			pCurrent=pCurrent->next;
			//成倍打印时要跳过头结点 
		print(pCurrent);
		pCurrent=pCurrent->next;
	}

}

释放内存

void FreeSpace_CirCleLinkList(CirCleLinkList* clist){
	if(clist==NULL)
		return;
	free(clist); 
}

main.cpp测试文件

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#include"CircleLinkList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

typedef struct goal{
	CirCleLinkNode node;
	int num;
	string name;
}goal; 

void MyPrint(CirCleLinkNode* data)
{
	goal* g=(goal*)data;
	cout<<(g->name)<<":"<<(g->num)<<endl;	
} 

int main(int argc, char** argv) {
	goal g1,g2;
	
	g1.name="Jsl";
	g2.name="Hyh";
	g1.num=2019;
	g2.num=2013;
	
	CirCleLinkList* clist=Init_CirCleLinkList();
	
	Insert_CirCleLinkList(clist,0,(CirCleLinkNode*)&g1);
	Insert_CirCleLinkList(clist,0,(CirCleLinkNode*)&g2);
	cout<<"一共有几个元素:"<<(Size_CirCleLinkList(clist))<<endl;
	//头部插入(合法范围内任意) 
	Print_CirCleLinkList(clist,MyPrint);
	FreeSpace_CirCleLinkList(clist);
	
	return 0;
}

测试结果如下:

 

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

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

相关文章

《深度探索c++对象模型》笔记

非原创&#xff0c;在学习 1 关于对象&#xff08;Object Lessons&#xff09; 这里最开始从C语言的结构体引出C中的”抽象数据类型&#xff08;ADT&#xff09;“。 而加上封装之后&#xff0c;布局成本没有增加&#xff0c;三个data member直接内含在每一个class object之中…

深入选择屏幕

2.3.4.4 屏幕输入报表筛选条件等 &--------------------------------------------------------------------- *& selection-screen /option/parameter:屏幕输入报表赛选条件 *& TABLES . *selection-screen begin of block test select-options: selection-screen…

PHY芯片快速深度理解

摘要&#xff1a; 什么是phy 为什么要熟悉RJ45网口 网络七层协议 两个模块进行通信 什么是MDIO协议 MDIO的作用 MDIO没那么重要 MDIO读写时序 为什么说读取的phy最多32个 什么是phy 物理层芯片称为PHY、数据链路层芯片称为MAC。 可以看到PHY的数据是RJ45网络接口&am…

linux常见指令下

接下来我们就聊聊linux的后面十条指令。 一:echo 作用是往显示器输出内容&#xff0c;和printf类型&#xff0c;但是该指令最核心的是与之相关的一些概念 概念1.输出重定向&#xff1a; echo不仅可以向显示打印内容&#xff0c;还可以向文件输出内容&#xff0c;本应该输出到…

在服务器上启动springboot项目

环境搭建&#xff1a;要在服务器上运行SpringBoot Web项目&#xff0c;需要先在服务器上安装JDK&#xff08;CentOS系统安装JDK参考&#xff1a;http://t.csdn.cn/0zYml&#xff09; 第一步&#xff1a;创建项目 创建一个简单的springboot项目&#xff0c;并通过测试&#xf…

Java Web Servlet (2)23.7.8

1.7 urlPattern配置 Servlet类编写好后&#xff0c;要想被访问到&#xff0c;就需要配置其访问路径&#xff08;urlPattern&#xff09; 一个Servlet,可以配置多个urlPattern package com.itheima.web;import javax.servlet.ServletRequest; import javax.servlet.ServletRes…

嵌入式基础知识-流水线

提到流水线&#xff0c;最先想到的可能是流水线车间中的产品制造过程。 工业上的流水线&#xff0c;又称装配线&#xff0c;指每一个生产单位只专注处理某一个片段的工作&#xff0c;以提高工作效率及产量。 在计算机领域中&#xff0c;也有流水线的概念&#xff0c;其核心原理…

互联网医院系统定制|互联网医院在线诊疗平台

互联网医院系统对医院有以下几个方面的帮助&#xff1a;   提升医疗服务效率&#xff1a;互联网医院系统可以为医院提供在线挂号、在线问诊、远程会诊等功能&#xff0c;减少患者排队等待时间&#xff0c;提高医疗服务效率。   扩大服务范围&#xff1a;互联网医院系统可以…

【数据结构二叉树OJ系列】6、平衡二叉树

目录 题述&#xff1a; 思路&#xff1a; 正确代码如下&#xff1a; 时间复杂度分析&#xff1a; 现让你把代码优化时间复杂度为O&#xff08;N&#xff09; 思路&#xff1a; 题述&#xff1a; 给定一个二叉树&#xff0c;判断他是否是高度平衡的二叉树。 本题中&#xf…

HttpRunner自动化之接口关联和常用断言

接口关联 第一个test接口获取token,并提取出存储到变量中&#xff0c;在第二个test接口中直接调用该变量&#xff0c;如下图 # 接口关联 - config:name: 微信接口base_url: https://api.weixin.qq.com - test:name: 获取tokenrequest:url: /cgi-bin/tokenmethod: GETparams:g…

在vue3项目中加载Cesium立体地形信息并调整初始化角度

在vue3项目中加载Cesium立体地形信息并调整初始化角度 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium vite -D配置 &#xff08;1&#xff09;在项目的vite.config.js文件中添加&#xff1a; impo…

Java模拟cookie登陆操作

Java模拟cookie登陆操作 在使用java访问URL时&#xff0c;如果该URL需要身份验证&#xff0c;那么就不能够直接访问&#xff0c;因为没有登陆。那么&#xff0c;如何解决这个问题呢&#xff1f; 方法是使用java模拟登陆&#xff0c;登陆后记录下cookie信息&#xff0c;在下次发…

【算法集训之线性表篇】Day 07

文章目录 题目基本设计思想代码实现效果 题目 一个长度为L(L>1)的升序序列S&#xff0c;处在第[L/2]个位置的数称为S的中位数。例如&#xff0c;若序列S1{11,13,15,17,19},则S1的中位数是15&#xff0c;两个序列的中位数是含它们所有元素的升序序列的中位数&#xff0c;例如…

使用ida pro反编译并修改so库

快速搜索 图表视图 找到需要修改的行 Edit -> Patch program -> change byte… 复制指令 到这个网站Online ARM to HEX 点击可以切换为HEX to ARM 构造待修改的指令 修改好后复制HEX字符串 Edit -> Patch program -> Apply patches to input file

测试工程师的个人年终总结报告模板

目录 正文之前的思考&#xff1a; 年终总结报告 开篇语 1.  项目概述 1.1  项目情况 1.2  工作流程 1.3  个人角色 1.4  完成情况 2.  工作业绩 3.  亮点和不足 4.  未来展望 总结&#xff1a; 正文之前的思考&#xff1a; 开始编排文档之前来做一个…

FAM NHS ester,5-FAM azide,两者用于标记核苷酸的荧光试剂

一、FAM NHS ester,6-isomer&#xff0c;92557-81-8 理论分析&#xff1a; 中文名&#xff1a;羧基荧光素-活性酯&#xff0c;6-异构体&#xff0c;6-羧基荧光素琥珀酰亚胺酯,6-羧基荧光素-活性酯 英文名&#xff1a;FAM NHS ester,6-isomer&#xff0c;6-FAM-NHS&#xff0c;…

D. Survey in Class

D. Survey in Class Problem - D - Codeforces 思路&#xff1a;题目要求的是最大值与最小值的差值最大&#xff0c;那么我们能够想到&#xff0c;一定是两个人比较得到的最大的差值&#xff0c;假设a与b比较得到的最大的差值&#xff0c;因为如果提问了这两个区间都不包含的&…

单个电源模块带电感的直流压降仿真(二)

单个电源模块带电感的直流压降仿真(二) 接 单个电源模块带电感的直流压降仿真(一) 在右侧net manager disable all nets鼠标移动到需要仿真的电感前后两端的铜皮上,select net and enable net并且把GND也select和enable上

ceph用户认证

Cephx认证机制 ceph使用cephx协议对客户端进行身份认证 cephx用于对ceph保存的数据进行认证访问和授权&#xff0c;用于对访问ceph的请求进行认证和授权检测&#xff0c;于mon通信的请求都要经过ceph认证通过&#xff0c;但是也可以在mon节点关闭cephx认证&#xff0c;但是关…

微信小程序的目录结构及页面结构的说明

微信小程序的目录结构及页面结构的说明 1. 项目结构2.小程序的页面组成部分3.项目结构和页面结构文件的一些说明3.1. json文件3.2. wxml和wxss3.2.1. wxml3.2.2. wxss 3.2.3. 小程序中的.js文件 4. 微信小程序的宿主环境及运行机制4.1. 宿主环境4.2. 运行机制4.2.1. 小程序启动…