02黑马数据结构笔记之单向链表搭建(list)

2023-11-01

02黑马数据结构笔记之单向链表搭建(list)

1 思路:以STL的容器list类似,将各个数据节点存放在链表当中。实现是靠一个结构体来管理各个数据节点

//定义一个节点类型
typedef struct Node{
	//接收任何数据
	void* data; 
	struct Node *next;	
}SNode;

//定义一个结构体管理链表
typedef struct LinkList{
	SNode *head;
	int size;           //链表大小
}SList;                 //和动态数组比,需要容量吗? 不需要,动态且内存不连续,在关系上线性

代码实现:
1)头文件.h:

#ifndef MYLIST_H
#define MYLIST_H

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

//定义一个节点类型
typedef struct Node{
	//接收任何数据
	void* data; 
	struct Node *next;	
}SNode;

//定义一个结构体管理链表
typedef struct LinkList{
	SNode *head;
	int size;           //链表大小
}SList;                 //和动态数组比,需要容量吗? 不需要,动态且内存不连续,在关系上线性

//使用函数指针对万能数据打印
typedef void(*PrintList)(void* data);

//链表初始化
SList *List_Init();
//链表的打印
int Print_List(SList *l,PrintList print);
//插入链表
int Insert_List(SList *l,int pos,void* data);
//删除一个指定位置链表节点
int Del_List_One(SList *l,int pos);
//查找链表
int Find_List(SList *l,void* data);
//返回第一个节点
void *Get_Effitive_First(SList *l);
//返回链表大小
int Get_Size(SList *l);
//销毁内存
int Destory_List(SList *l);

#endif

2).cpp文件:

#include"MyList.h"

//链表初始化
SList *List_Init(){

	//给结构体赋值
	SList *list=(SList *)malloc(sizeof(SList));
	list->head=(SNode *)malloc(sizeof(SNode));
	list->size=0;
	
	//给头结点赋值
	list->head->data=NULL;
	list->head->next=NULL;

	return list;
}
//链表的打印
int Print_List(SList *l,PrintList print){

	if(l==NULL){
		return -1;
	}

	SNode *pCur=l->head->next;
	while(pCur!=NULL){
		print(pCur->data);  //将参数传给自定义函数打印
		pCur=pCur->next;
	}

	return 0;
}
//利用下标插入链表
int Insert_List(SList *l,int pos,void* data){
	//链表为空,直接返回
	if(l==NULL ){
		return -1;
	}
	//如果下标越界,则插入尾部
	if(pos<0 || pos >= l->size){
		pos=l->size;
	}

	   //插入
	//1.先找到插入点的前一节点——————与C语言用两个节点插入的有点差别,但道理是一样的
	SNode *pCur=l->head;
	for(int i=0;i<pos-1;i++){
		pCur=pCur->next;
	}

	//2.创建新节点
	SNode *New=(SNode*)malloc(sizeof(SNode));
	New->data=data;
	New->next=NULL;

	//3.与链表建立关系
	New->next=pCur->next;
	pCur->next=New;

	l->size++;

	return 0;
}
//删除一个指定位置链表节点
int Del_List_One(SList *l,int pos){

	if(l==NULL){
		return -1;
	}
	if(pos<0|| pos >= l->size){
		return -1;
	}
	//找到要删除的节点的前一节点
	SNode *pPre=l->head;	
	for(int i=0;i<pos-1;i++){
		pPre=pPre->next;
	}
	//使用临时变量删除pos节点
	SNode *pCur=pPre->next;

	//删除
	pPre->next=pCur->next;
	free(pCur);
	pCur->next=NULL;

	l->size--;

	return 0;
}
//查找链表 返回第一个相等数据的下标
int Find_List(SList *l,void* data){

	if(l==NULL){
		return -1;
	}
	//计算节点的返回值下标
	int count=0;

	SNode *pCur=l->head->next;
	while(pCur!=NULL){
		if(pCur->data==data){
			break;
		}
		pCur=pCur->next;
		count++;
	}
	//判断是否找到
	if(count==l->size){
		printf("找到链表尾部,没找到\n");
		return -1;
	}

	return count;

}
//返回第一个节点
void *Get_Effitive_First(SList *l){
	return l->head->next->data;
}
//返回链表大小
int Get_Size(SList *l){
	return l->size;
}
//销毁内存
int Destory_List(SList *l){

	if(l==NULL){
		return -1;
	}
	//销毁内存
	while(l->head!=NULL){
		SNode *pCur=l->head->next;
		free(l->head);
		//l->head->next=NULL; //可以不要
		l->head=pCur;
	}

	//最后释放管理链表的结构体内存
	free(l);

	return 0;
}

3)主函数测试:

#include"MyList.h"

//自定义数据类型
typedef struct Student{
	char name[64];
	int age;
	int score;
}Stu;

//回调打印函数 打印时需要用户自定义一个打印函数传进来
void MyPrint(void *data){
	//将void*数据转成用户自定义数据
	Stu *s=(Stu*)data;
	printf("名字:%s 年龄:%d 分数:%d\n",s->name,s->age,s->score);
}

void test01(){

	//创建链表
	SList *list=List_Init();

	//创建数据
	Stu s1={"aaa",18,100};
	Stu s2={"bbb",19,77};
	Stu s3={"ccc",20,88};
	Stu s4={"ddd",22,99};
	Stu s5={"eee",12,59};

	//插入数据 因为是void*,所以要传地址
	Insert_List(list,0,&s1);
	Insert_List(list,0,&s2);
	Insert_List(list,0,&s3);
	Insert_List(list,0,&s4);
	Insert_List(list,0,&s5);

	//打印数据    需要给函数指针传函数名调用该自定义函数
	Print_List(list,MyPrint);

	printf("============\n");

	//删除
	Del_List_One(list,3);
	Print_List(list,MyPrint);

	//返回第一个有效节点
	printf("============\n");
	Stu *s=(Stu*)Get_Effitive_First(list);
	printf("名字:%s 年龄:%d 分数:%d\n",s->name,s->age,s->score);

	printf("============\n");
	//查找
	int pos=Find_List(list,&s2);
	printf("查找到的节点下标:%d\n",pos);
	Del_List_One(list,pos);
	Print_List(list,MyPrint);

	//返回链表大小
	int size=Get_Size(list);
	printf("链表大小为:%d\n",size);

	//销毁内存
	Destory_List(list);

}

int main(){

	test01();

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

02黑马数据结构笔记之单向链表搭建(list) 的相关文章

  • 如何编写一个含有抄底信号的副图指标

    如果你作为通达信软件源代码的程序维护员 如何编写一个含有抄底提示的副图指标 请看下面的的示例教程 python语言 python 导入所需的库 import talib 计算移动平均线 def moving average data per

随机推荐

  • 【哈佛积极心理学笔记】第6讲 乐观主义

    第6讲 乐观主义 How can we create consciously and subconsciously a positive environment where we actually can take out the most
  • 小白学习一周 Linux命令

    文件系统管理相关命令 clear 清屏 pwd 打印当前工作目录 tmp 打开文件夹 cd 改变当前工作目录 mkdir 创建一个新文件夹 mkdir 在根目录下创建一个新文件夹 mkdir p 套娃创建文件夹 rmdir 删除当前目录下的
  • 图像数据处理 pytorch

    coding utf 8 Transfer Learning Tutorial Author Sasank Chilamkurthy
  • 双非计算机学硕报录比竟然有28:1?深圳大学20考研居然如此爆炸!

    深圳大学是一所双非大学 计算机学科评估B 软件工程学科评估没有 由于计算机实力在双非中很强 而且地处广东深圳 是信息行业和互联网行业比较发达的地区 因此深圳大学很受考生欢迎 但是深圳大学也很难考 深圳大学基本所有计算机相关专业都考408 这
  • 【Git】(一)基本操作

    读完本文后 您会了解 1 如何在本地配置GIT环境 2 环境配置成功后 如何从远端下载一个已有仓库到本地 1 配置全局用户名 邮箱 git config global user name username git config global
  • LeetCode 0198. House Robber

    问题简析 作为职业小偷 我要去打家劫舍 但是注意如果两家相邻房子在同一夜被打劫了 则会触发警报 现在给定一个非负整数构成的数列 代表连续的若干房屋中的财产数量 计算一晚上最多能偷多少钱 例如 nums 1 2 3 1 最大值为1 3 4 n
  • 论文End To End speech里一种seq2seq

    在End To End speech里介绍了一种更好的seq2seq的模型 效果我没有实际比较过 但是思路值得学习 接下来分享下 我的理解 虽然这篇论文讲的是Text To speech 但是主要模型架构使用的是seq2seq 主要的改进也
  • 高效真实的云渲染算法

    高效真实的云渲染算法 转 原文链接 http www cnblogs com effulgent archive 2008 10 06 1305029 html 原文 Realistic and Fast Cloud Rendering N
  • 飞书与IAI国际广告奖,协同实现国内营销史上的创新“云终审”

    防疫时期 线下营销活动暂停或无限延期 转型线上迫在眉睫 而想要高效地进行线上远程办公 一套实用而全面的线上协同工具不可或缺 今天的主角 IAI国际广告奖 是由中国传媒大学广告学院与IAI国际广告研究所联合主办的中国大型广告作品案例评选活动
  • 随笔:MySQL 查询事务状态字段说明

    今天一个朋友想查看一下的MySQL层事务提交状态经历的过程 比如我们常说的prapare flush sync commit 几个阶段 但是找了一下发现视乎没有视图可以看到一共看了3个地方 information schema INNODB
  • Elasticsearch实战(十二)---搜索推荐 match_phrase_prefix及fuzzy错误拼写模糊查询

    Elasticsearch实战 搜索推荐 match phrase prefix 文章目录 Elasticsearch实战 搜索推荐 match phrase prefix 1 搜索推荐场景 1 1 准备数据 2 搜索推荐实现 2 1 ma
  • nginx报404 not found错误解决

    一般报404错误都是因为nginx做了伪静态 去除了框架的index php 访问某域名时 去掉index php目录时达到效果一样 如 www test1 index php test2跟www test1 test2效果一致 在vhos
  • stm32flash碰到hex文件出错,读取超慢, 占用内存超多的问题解决

    这个问题是因为sdcc生成的hex的每行的地址并不是排序的好的 有些高的地址在前面 低的地址在后面 这样的话 stm32flash这个hex c并不能处理这个情况 里面有一个逻辑是用来填补0xff的 当后面的地址比前面大 一减得负数 但是变
  • TCP协议详解(三次握手,传输数据,四次挥手)

    首先来了解一下什么是TCP 传输控制协议 简单点来讲TCP它是一种网络通信协议 旨在通过internet发送数据包 TCP是OSI层中的传输层协议 第四层 用于通过传输和确保通过支持网络和internet传递消息来在远程计算机之间创建连接
  • React Native环境及项目配置搭建

    安装RN环境卡了我好久 在网上搜了很多都不全遇到很多坎儿 时至今日我终于装好了 打算写一个详细过程造福大众 也算是对自己总结更深层的记忆 1 首先看官网 React 注意要点 必须要有node javaJDK和AndroidStudio 再
  • iOS 4层结构(iOS技术概要)—— Media 层(二)

    Media层 媒体层提供了图形 音频和视频技术支持 以达到移动设备上极佳的多媒体体验 一 图形技术 高品质图形是iOS应用程序非常重要的一部分 最简单 和最有效 的方法来创建一个应用程序是使用预渲染图片与UI标准控件结合实现系统绘制 然而
  • 如何用git将本地文件放到github上

    1 在github上新建一个仓库 2 使用如下命令操作 前提 本地已安装git 使用git Bash运行如下代码 git init 使本地文件夹成为一个本地git仓库 运行后文件夹下会生成一个 git文件夹 git add 将本地文件夹添加
  • Seata解析-数据源代理DataSourceProxy详解

    本文基于seata 1 3 0版本 前面通过十多篇文章详细介绍了TC端 从这篇文章开始介绍RM RM是资源管理器 资源指的就是数据库 RM主要与分支事务有关 RM会处理业务数据 在 Seata解析 seata部署启动初体验 中 使用了类Da
  • osg学习(五十二)加载的牛模型cow.osg没有纹理 黑色

    1 纹理文件 Images reflect rgb 没有正确加载 2 Android 的gles中没有glTexGen函数 需要通过着色器程序实现 参看C 学习 三三六 球面贴图Sphere mapping 立方体贴图Cube mappin
  • 02黑马数据结构笔记之单向链表搭建(list)

    02黑马数据结构笔记之单向链表搭建 list 1 思路 以STL的容器list类似 将各个数据节点存放在链表当中 实现是靠一个结构体来管理各个数据节点 定义一个节点类型 typedef struct Node 接收任何数据 void dat