C语言对另一种企业单向链表的初始化、插入、删除、销毁等操作

2023-05-16

链表模型

只将前四个字节用来作为指针域,并且只对指针域进行操作即可,并不会对数据进行操作。

在这里插入图片描述

链表代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//节点的结构体
struct LinkNode {
	struct LinkNode* next;
};

//链表的结构体
struct LinkList {
	int m_size;
	struct LinkNode pHeader;
};

typedef void* LList;

//链表的初始化
LList init_LinkList() {

	struct LinkList* myList = malloc(sizeof(struct LinkList));
	if (myList == NULL)
		return NULL;
	myList->m_size = 0;
	myList->pHeader.next = NULL;

	return myList;
}


//链表的插入
void insert_LinkList(LList list, int pos, void* data) {
	if (list == NULL || data == NULL)
		return;
	struct LinkList* myList = list;
	//如果插入位置不适合就直接进行尾插
	if (pos < 0 || pos > myList->m_size-1)
	{
		pos = myList->m_size;
	}
	//只操作数据的前四个字节,因为企业中前四个字节保存的是指针域
	struct LinkNode* myNode = data;

	//进行插入前先找到前驱结点 
	struct LinkNode* pCurrent = &myList->pHeader;
	for (int i = 0; i < pos; i++) {
		pCurrent = pCurrent->next;
	}//此处将指针pCurrent移动到 要插入位置的上一个节点

	//更新节点的连接关系
	myNode->next = pCurrent->next;
	pCurrent->next = myNode;

	//更新链表的长度
	myList->m_size++;
}

//遍历链表
void for_each_LinkList(LList list, void(*myPrint)(void* data)) {
	if (list == NULL)
		return;
	struct LinkList* myList = list;
	struct LinkNode* pCurrent = myList->pHeader.next;
	for (int i = 0; i < myList->m_size; i++) {

		myPrint(pCurrent);
		pCurrent = pCurrent->next;
	}
}

//删除节点,按位置进行删除
void delete_by_pos(LList list, int pos) {
	if (list == NULL)
		return;
	struct LinkList* myList = list;
	if (pos < 0 || pos >= myList->m_size)
		return;
	struct LinkNode* myNode = &myList->pHeader;
	for (int i = 0; i < pos; i++)
	{
		myNode = myNode->next;//此时的myNode指向的是要删除位置的前驱节点
	}
	//找到要删除的节点
	struct LinkNode* delNode = myNode->next;
	//更新节点的连接关系,将要删除节点的后继节点地址赋给前驱节点的指针域
	myNode->next = delNode->next;

	删除当前位置节点
	//free(delNode);//这里并没有用malloc去开辟空间,不应该去用free释放
	//delNode = NULL;

	//更新链表中节点个数
	myList->m_size--;
}

//对链表进行销毁
void destroy_LinkList(LList list) {
	if (list == NULL)
		return;
	struct LinkList* myList = list;
	myList->m_size = 0;
	myList->pHeader.next = NULL;
	free(list);
	list = NULL;
}



//测试
typedef struct Person {
	void* node;
	char name[64];
	int age;
}Person;
void myPrint(void* data) {
	Person* p = data;
	printf("姓名:%s, 年龄:%d\n", p->name, p->age);
}
void test01() {
	Person p1 = { NULL, "bobo",23 };
	Person p2 = { NULL, "hoho",24 };
	Person p3 = { NULL, "toto",25 };
	Person p4 = { NULL, "yoyo",26 };
	//初始化得到链表
	struct LinkList* myList = init_LinkList();

	//插入链表
	insert_LinkList(myList, 0, &p1);
	insert_LinkList(myList, 1, &p2);
	insert_LinkList(myList, 0, &p3);
	insert_LinkList(myList, 2, &p4);

	//对链表进行遍历
	for_each_LinkList(myList, myPrint);

	//按照位置进行删除
	delete_by_pos(myList, 3);
	printf("++++++++++++++++++++++++++\n");
	//对链表进行遍历
	for_each_LinkList(myList, myPrint);

	//对链表进行清空销毁
	destroy_LinkList(myList);
	myList = NULL;
}

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

C语言对另一种企业单向链表的初始化、插入、删除、销毁等操作 的相关文章

  • Linux网络设置

    文章目录 引言一 查看网络配置1 查看网络接口信息ifconfig2 修改网络配置文件3 设置网络接口参数 二 主机名称配置文件hostname1 hostname命令2 三种修改主机名的方式2 1 临时修改主机名 xff08 hostna
  • Java中的集合类

    Java中所有的类都位于java util包下 xff0c 主要由两个接口派生出来 分别是Collection xff08 集合 xff09 和Map Collection xff08 映射集合 xff09 xff0c 包含了List和Se
  • 退出VM VirtualBox独占的键盘和鼠标

    今天无意之间点了菜单栏的 热键 鼠标集成 xff0c 结果鼠标被锁在了里面出不来 xff0c 试了好多方法都不行 xff0c 有点奔溃 xff0c 最后发现 右边的Alt 43 Ctrl组合键可以跳出
  • Linux - 第11节 - 网络入门

    目录 1 计算机网络背景 1 1 网络发展 1 2 认识 34 协议 34 2 网络协议初识 2 1 协议分层 2 2 OSI七层模型 2 3 TCP IP五层 xff08 或四层 xff09 模型 3 网络传输基本流程 3 1 同局域网的
  • @PathVariable注解的用法和作用

    64 PathVariable注解的用法和作用 64 PathVariable 映射 URL 绑定的占位符 通过 64 PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中 URL 中的 xxx 占位符可以通过
  • 最新虚拟机中Ubuntu18.04安装教程(傻瓜教程)

    1 文件和软件下载 下载Ubuntu18 04文件 可以直接点下方的链接下载 Ubuntu18 04安装链接 下载VMware Workstation 笔者这边使用的是VMware Workstation15 5pro xff0c 大家也可
  • optimizer优化器详解

    在机器学习中 xff0c 优化器 xff08 optimizer xff09 是一种用于更新模型参数以最小化训练误差的算法 它可以将损失函数的梯度作为输入 xff0c 并根据该梯度调整模型参数的值 常见的优化器算法包括随机梯度下降 xff0
  • Java创建多线程的四种方式

    一 继承Thread类 1 创建一个继承于Thread类的子类 2 重写Thread类的run gt 将此线程执行的操作声明在run 中 3 创建Thread类的子类的对象 4 通过此对象调用start 启动当前线程 调用当前线程的run
  • MySQL基础

    本单元目标 一 为什么要学习数据库 二 数据库的相关概念 DBMS DB SQL 三 数据库存储数据的特点 四 初始MySQL MySQL产品的介绍 MySQL产品的安装 MySQL服务的启动和停止 MySQL服务的登录和退出 MySQL的
  • Thread类中的常用方法

    Thread类中的常用方法 xff08 学习总结 xff09 xff1a 序号函数作用1start 启动当前线程 xff1b 调用当前线程的run 2run 通常需要重写Thread类中的此方法 xff0c 将创建的线程要执行的操作生命在此
  • 线程的同步机制

    方式一 xff1a 同步代码块 span class token keyword synchronized span span class token punctuation span 同步监视器 span class token punc
  • Java常用类总结

    一 字符串相关的类 String类及其常用方法 1 String声明为final的 xff0c 不可被继承 2 String实现了Serializable接口 xff1a 表示字符串是支持序列化的 xff1b 实现了Comparable接口
  • java获取两个字符串中最大相同字串

    span class token keyword import span span class token keyword static span java span class token punctuation span lang sp
  • jdk提供的4种注解

    元注解 xff1a 对现有的注解进行解释说明的注解 Retention xff1a 指定所修饰的Annotation的生命周期 xff1a SOURCE CLASS xff08 默认行为 xff09 RUNTIME xff0c 只有声明为R
  • Java中List接口常用方法

    List除了从Collection集合继承的方法外 xff0c List集合里添加了一些根据索引来操作集合元素的方法 xff1a 序号返回值函数作用1voidadd int index Object ele 在index位置插入ele元素2
  • 对Java中Class类的理解并获取Class实例

    关于java lang Class类的理解 类的加载过程 xff1a 程序经过javac exe命令以后 xff0c 会生成一个或多个字节码文件 class结尾 接着我们使用java exe命令对某个字节码文件进行解释运行 相当于将某个字节
  • 类加载器ClassLoader及应用

    类加载器ClassLoader span class token keyword public span span class token keyword class span span class token class name Cla
  • 创建运行时类的对象、调用运行时类的指定结构以及获取运行时类的完整结构

    创建两个类 一个注解 一个接口 用来准备测试 span class token keyword public span span class token keyword class span span class token class n

随机推荐