双向链表增删改查、遍历、倒置、销毁等——数据结构——day3

首先,我先把我的头节点写出来,里面有整理好的结构体

#ifndef __DOULINK_H__
#define __DOULINK_H__

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

typedef struct student
{
	int id;
	char name[50];
	int score;
}DATA_TYPE;		//构造数据结构体

typedef struct node
{
	DATA_TYPE data;	//数据
	struct node *ppre;		//前驱节点指针
	struct node *pnext;		//后继节点指针
}DOULINK_NODE;	//构造节点结构体

typedef struct list
{
	DOULINK_NODE *phead;	//头节点指针
	int clen;				//计算个数
}DOULINK_LIST;	//构造链表结构体

extern DOULINK_LIST *CreatDouLinkList();	//创建链表
extern DOULINK_NODE *CreatNode(DATA_TYPE *data,int num);	//创建节点
extern int PushHeadDouLink(DOULINK_LIST *plist,DOULINK_NODE *pnode);	//头插
extern int PopHeadDouLink(DOULINK_LIST *plist);							//头删
extern int PushTailDouLink(DOULINK_LIST *plist,DOULINK_NODE *pnode);	//尾插
extern int PopTailDouLink(DOULINK_LIST *plist);							//尾删
extern void ListForEach(DOULINK_LIST *plist);							//遍历
extern DOULINK_NODE *FindNodeDouLink(DOULINK_LIST *plist,int (*pfun)(DOULINK_NODE *,void *),void *t);														//查找指定的数据并修改
extern void DestoryDouLink(DOULINK_LIST *plist);						//销毁
extern int DeleteNodeDouLink(DOULINK_LIST *plist,char *name);			//删除指定的数据
extern void ReverseDouLink(DOULINK_LIST *plist);						//倒置
#endif

创建链表

DOULINK_LIST *CreatDouLinkList()
{
	DOULINK_LIST *ptemp = malloc(sizeof(DOULINK_LIST));	//申请空间
	if(NULL == ptemp)
	{
		perror("fail to creat list malloc");
		return NULL;
	}

	ptemp->phead = NULL;
	ptemp->clen = 0;

	return ptemp;
}

创建节点

DOULINK_NODE *CreatNode(DATA_TYPE *data,int num)
{
	DOULINK_NODE *pnode = malloc(sizeof(DOULINK_NODE));
	if(NULL == pnode)
	{
		perror("fail to creat node malloc");
		return NULL;
	}

	pnode->data = data[num];
	pnode->ppre = NULL;
	pnode->pnext = NULL;
	
	return pnode;
}

判断链表是否为空

int IsEmptyLink(DOULINK_LIST *plist)
{
	return NULL == plist->phead;
}

头插

int PushHeadDouLink(DOULINK_LIST *plist,DOULINK_NODE *pnode)
{
	if(NULL == plist || NULL == pnode)
	{
		return -1;
	}

	pnode->pnext = plist->phead;
	if(plist->clen != 0)
	{
		plist->phead->ppre = pnode;
	}
	plist->phead = pnode;

	plist->clen++;

	return 0;
}

头删

int PopHeadDouLink(DOULINK_LIST *plist)
{
	if(IsEmptyLink(plist))
	{
		return 0;
	}
	
	DOULINK_NODE *ptmp = plist->phead;

	if(plist->clen == 1)
	{
		free(ptmp);
		plist->phead = NULL;
		plist->clen--;
		return 0;
	}

	plist->phead = plist->phead->pnext;
	free(ptmp);
	plist->phead->ppre = NULL;
	plist->clen--;

	if(plist->clen == 1)
	{
		plist->phead->pnext = NULL;
	}

	return 0;
}

尾插

int PushTailDouLink(DOULINK_LIST *plist,DOULINK_NODE *pnode)
{
	if(NULL == plist || NULL == pnode)
	{
		return -1;
	}

	if(IsEmptyLink(plist))
	{
		plist->phead = pnode;
	}
	else
	{
		DOULINK_NODE *ptmp = plist->phead;

		while(ptmp->pnext)
		{
			ptmp = ptmp->pnext;
		}

		ptmp->pnext = pnode;
		pnode->ppre = ptmp;
	}
	plist->clen++;
	return 0;
}

尾删

int PopTailDouLink(DOULINK_LIST *plist)
{
	if(IsEmptyLink(plist))
	{
		return 0;
	}

	DOULINK_NODE *ptmp = plist->phead;
	while(ptmp->pnext)
	{
		ptmp = ptmp->pnext;
	}

	if(ptmp->ppre != NULL)
	{
		ptmp->ppre->pnext = NULL;
	}
	else
	{
		plist->phead = NULL;
	}

	free(ptmp);
	plist->clen--;

	return 0;
}

遍历

void ListForEach(DOULINK_LIST *plist)
{
	DOULINK_NODE *ptmp = plist->phead;
	
	while(ptmp)
	{
		printf("id = %d\n",ptmp->data.id);
		printf("name = %s\n",ptmp->data.name);
		printf("score = %d\n",ptmp->data.score);
		ptmp = ptmp->pnext;
	}
}

查找指定的数据并修改

int compare_id(DOULINK_NODE *pnode,void *t)
{
	if(*(int *)t == pnode->data.id)
	{
		return 1;
	}
	return 0;
}

int compare_name(DOULINK_NODE *pnode,void *t)
{
	if(!strcmp(pnode->data.name,(char *)t))
	{
		return 1;
	}

	return 0;
}

int i = 3;
DOULINK_NODE *p = FindNodeDou_Link(plist,compare_id,&i);
if(NULL != p)
{
	p->data.score = 99;
}
p = FindNodeDou Link(plist, compare_name,"zhangsan"); 
if(NULL != p)
{
	strcpy(p->data.name,"wuhuuuuu");
}

DOULINK_NODE *FindNodeDouLink(DOULINK_LIST *plist,int (*pfun)(DOULINK_NODE *,void *),void *t)
{
	if(IsEmptyLink(plist))
	{
		return NULL;
	}

	DOULINK_NODE *ptmp = plist->phead;

	while(ptmp)
	{
		if(pfun(ptmp,t))
		{
			return ptmp;
		}
		ptmp = ptmp->pnext;
	}

	return NULL;
}

结果:
在这里插入图片描述

销毁

void DestoryDouLink(DOULINK_LIST *plist)
{
	
	while(!IsEmptyLink(plist))
	{
		PopHeadDouLink(plist);
	}

	free(plist);
}

删除指定的数据

int DeleteNodeDouLink(DOULINK_LIST *plist,char *name)
{
	if(IsEmptyLink(plist))
	{
		return -1;
	}

	DOULINK_NODE *ptmp = plist->phead;
	DOULINK_NODE *p = NULL;
	int del_cnt = 0;

	while(ptmp)
	{
		if(!strcmp(ptmp->data.name,name))
		{
			if(ptmp == plist->phead)
			{
				plist->phead = ptmp->pnext;
				free(ptmp);
				ptmp = plist->phead;
			}
			else
			{
				p->pnext = ptmp->pnext;
				free(ptmp);
				ptmp = p->pnext;
			}
			plist->clen--;
			del_cnt++;
		}
		else
		{
			p = ptmp;
			ptmp = ptmp->pnext;
		}
	}
	
	return del_cnt;
}

倒置

void ReverseDouLink(DOULINK_LIST *plist)
{
	int i = 0;
	if(IsEmptyLink(plist))
	{
		return ;
	}

	DOULINK_NODE *prev = plist->phead;
	DOULINK_NODE *p = NULL;

	plist->phead = NULL;

	while(prev)
	{
		p = prev;
		prev = prev->pnext;
		p->pnext = NULL;
		p->ppre = NULL;

		p->pnext = plist->phead;
		if(i > 0)
		{
			plist->phead->ppre = p;
		}
		plist->phead = p;
		++i;
	}
}

结果:
在这里插入图片描述

以上就是今天内容

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

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

相关文章

【数据可视化】Echarts中的其它图表

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 绘制散点图2.1 绘制基本散点图2.2 绘制两个序列的散点图2.3 绘制带涟漪特效的散点图 3. 绘制气泡图3.1 绘制标准气泡图3.2 绘制各国人均寿命与GDP气泡图3.3 绘制城市A、城市B、城市C三个城市空气污染指数气…

负数,小数转换二进制

负数转换二进制 例&#xff1a;在带符号整数signed char的情况下&#xff0c;-57如何被表示成负数呢&#xff1f;在计算机中又是如何计算66-57呢&#xff1f; 解析 考虑int占有32位太长&#xff0c;因此使用只占8位的signed char类型来举例。57用二进制表示位00111001&#…

28-5 文件上传漏洞 - 图片马

一、文件内容检测 解析漏洞定义 控制文件是否被当做后端脚本处理 二、图片马绕过 图片马;在图片中包含一句话木马。利用解析漏洞如.htaccess 或文件包含漏洞,对图片马进行解析,执行其中的恶意代码。优势在于可以绕过多种防护机制。 三、图片马制作方法: # 一句话马示例…

nRF Sniffer在wireshark下的环境搭建

一、准备 nRF Sinffer 安装包&#xff1a; 直接下载&#xff1a;https://nsscprodmedia.blob.core.windows.net/prod/software-and-other-downloads/desktop-software/nrf-sniffer/sw/nrf_sniffer_for_bluetooth_le_4.1.1.zip 官网下载&#xff1a; nRF Sniffer for Bluetooth…

Elasticsearch - Docker安装Elasticsearch8.12.2

前言 最近在学习 ES&#xff0c;所以需要在服务器上装一个单节点的 ES 服务器环境&#xff1a;centos 7.9 安装 下载镜像 目前最新版本是 8.12.2 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2创建配置 新增配置文件 elasticsearch.yml http.host…

实现防抖函数并支持第一次立刻执行(vue3 + ts环境演示)

1、先看一效果&#xff1a; 2、实现思路&#xff1a; 使用定时器setTimeout和闭包实现常规防抖功能&#xff1b;增加immediate字段控制第一次是否执行一次函数&#xff08;true or false&#xff09;&#xff1b;增加一个flag标识&#xff0c;在第一次执行时&#xff0c;将标…

Aspose.PDF功能演示:在 JavaScript 中优化 PDF 文件

PDF 文件是一种普遍存在的文档共享格式&#xff0c;但它们有时可能会很大&#xff0c;导致加载时间变慢并增加存储要求。优化 PDF 文件对于确保无缝的用户体验至关重要&#xff0c;尤其是在 Web 应用程序中。因此&#xff0c;在这篇博文中&#xff0c;我们将探讨如何使用 JavaS…

软考网工学习笔记(6) 广域通信网

公共交换电话网&#xff08;pstn&#xff09; 在pstn是为了语音通信而建立的网络。从20世纪60你年代开始用于数据传输 电话网有三个部分组成&#xff1a; 本地回路 &#xff0c;干线 和 交换机 。 干线 和 交换机 一般采用数字传输和交换技术 &#xff0c;而 本地回路基本采…

Ubuntu18.04桌面版设置静态IP地址

引用: Ubuntu配置静态IP_ubuntu配置静态ip地址-CSDN博客 正文 默认Unbuntu 18.04 Desktop桌面版使用 netplan 管理网卡网络地址。使用Unbuntu 18.04 桌面版配置&#xff0c;可以通过桌面上的设置图标配置网卡的静态IP地址。 点击桌面右上角下拉框&#xff0c;点击“设置”按…

流畅的 Python 第二版(GPT 重译)(六)

第三部分&#xff1a;类和协议 第十一章&#xff1a;一个 Python 风格的对象 使库或框架成为 Pythonic 是为了让 Python 程序员尽可能轻松和自然地学会如何执行任务。 Python 和 JavaScript 框架的创造者 Martijn Faassen。 由于 Python 数据模型&#xff0c;您定义的类型可以…

【Linux】进程详解

目录 一、进程基本概念&#xff1a; 二、进程的五种基本状态&#xff1a; 三、Linux的进程状态&#xff1a; 四、控制进程状态相关指令&#xff1a; 五、僵尸进程与孤儿进程&#xff1a; 六、进程的优先级&#xff1a; 七、进程的四个重要特性&#xff1a; 八、环境变量…

ping 通ip,ping 不通域名

在linux 系统中&#xff0c;ping 通ip,ping 不通对应的域名时&#xff0c;可直接修改系统配置文件 vi /etc/hosts 加入 ip 域名

好就业三种专业#信息安全#云计算#网络工程

一、信息安全专业 根据2021年网络安全宣传周白皮书的观察结果&#xff0c;网络安全产业对于人才的需求正以高速增长的趋势呈现&#xff0c;当前网络安全行业存在着巨大的人才缺口&#xff0c;平均供求比例约为1:2。这一现象导致了资深人才的储备不足&#xff0c;并且新人才的培…

智慧校园数据可视化有什么好处?怎么推进数字化校园方案?

在当今数字化时代&#xff0c;越来越多学校开始实施智慧校园计划&#xff0c;旨在为学生和教师提供更高效、便捷的学习和教学环境。智慧校园运用互联网、大数据、人工智能等技术&#xff0c;对校园内各信息进行收集、整合、分析和应用&#xff0c;实现教学、管理、服务等多方面…

MySQL 索引的分类和优化

​ 优质博文&#xff1a;IT-BLOG-CN 索引是什么 &#xff1a; MySQL 官方对索引的定义&#xff1a;索引&#xff08;Index&#xff09;是帮助 MySQL 高效获取数据的数据结构。可以得到索引的本质&#xff1a;索引是数据结构。索引的目的在于提高查询效率。可以简单理解为&#…

AI PPT生成工具 V1.0.0

AI PPT是一款高效快速的PPT生成工具&#xff0c;能够一键生成符合相关主题的PPT文件&#xff0c;大大提高工作效率。生成的PPT内容专业、细致、实用。 软件特点 免费无广告&#xff0c;简单易用&#xff0c;快速高效&#xff0c;提高工作效率 一键生成相关主题的标题、大纲、…

基于Springboot的防疫物资管理信息系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的防疫物资管理信息系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

开源表单设计器vue-form-design自动化校验实现原理

表单校验可以改善用户体验和减轻服务器的压力, 而动态配置表单校验能极大的提高动态表单的扩展性、灵活性, 满足多样性、差异化需求 目标 &#x1f44c;&#xff0c;首先我们简要说下要实现的目标功能&#xff1a; 具有基础的表单验证功能提供一些内置验证规则提供对外开放的…

精读《useRef 与 createRef 的区别》

1 引言 useRef 是常用的 API&#xff0c;但还有一个 createRef 的 API&#xff0c;你知道他们的区别吗&#xff1f;通过 React.useRef and React.createRef: The Difference 这篇文章&#xff0c;你可以了解到何时该使用它们。 2 概述 其实原文就阐述了这样一个事实&#xf…

ICT产品供应链安全现状分析与对策建议

本文尝试分析ICT产品供应链的安全背景、政策法规&#xff0c;并给出具体针对性的建议供ICT产品供应链的供需双方参考。 当今网络安全威胁和攻击的形式正在发生深刻的变化&#xff0c;已经从传统的网络安全领域逐渐扩展到供应链安全方向。ICT&#xff08;信息通信技术&#xff…