数据结构双向链表,实现增删改查

news2025/1/10 1:58:05

一、双向链表的描述

        在单链表中,查找直接后继结点的执行时间为O(1),而查找直接前驱的执行时间为O(n)。为克服单链表这种单向性的缺点,可以用双向链表

        在双向链表的结点中有两个指针域,一个指向直接后继,另一个指向直接前驱。

二、双向链表的存储结构

typedef char ElemType[20];  //重定义数据域的数据类型
typedef struct LNode  //定义双向链表存储结构
{
	ElemType data;
	struct LNode *next;
	struct LNode *prev;
}*DoubleLink;

三、双向链表的操作

2.1 双向链表结点创建

DoubleLink Request_space()  //在堆区申请一个结点空间
{
	DoubleLink node=(DoubleLink)malloc(sizeof(struct LNode));
	if(NULL==node)
		return NULL;
	strcpy(node->data,"");
	node->next=node->prev=NULL;
	return node;
}

2.2 双向链表遍历

int Output(DoubleLink L_list)  //实现输出
{
	if(NULL==L_list)
		return -1;
	DoubleLink p=L_list;
	do
	{
		printf("%s ",p->data);
		p=p->next;
	}while(p!=NULL);
	puts("");
	return 0;
}

2.3 双向链表头插

DoubleLink insert_head(DoubleLink L_list,ElemType value)  //实现头插
{
	DoubleLink node=Request_space();
	if(NULL==node)
		return L_list;  
	strcpy(node->data,value);
	if(NULL!=L_list)
	{
		node->next=L_list;
		L_list->prev=node;
	}
	L_list=node;
	return L_list;
}

2.4 双向链表尾插

DoubleLink insert_rear(DoubleLink L_list,ElemType value)  //实现尾插
{
	DoubleLink node=Request_space();
	strcpy(node->data,value);
	if(NULL==L_list)
		L_list=node;
	else
	{
		DoubleLink rear=L_list;
		while(rear->next!=NULL)
			rear=rear->next;
		rear->next=node;
		node->prev=rear;
	}
	return L_list;
}

2.5 双向链表头删

DoubleLink delete_head(DoubleLink L_list)  //实现头删
{
	if(NULL==L_list)
		return NULL;
	if(L_list->next==NULL)
	{
		free(L_list);
		L_list=NULL;
	}
	else
	{
		DoubleLink p=L_list->next;
		strcpy(L_list->data,p->data);
		L_list->next=p->next;
		if(p->next!=NULL)
			p->next->prev=L_list;
		free(p);
		p=NULL;
	}
	return L_list;
}

2.6 双向链表尾删

DoubleLink delete_rear(DoubleLink L_list)  //实现尾删
{
	if(NULL==L_list)
		return NULL;
	if(L_list->next==NULL)
	{
		free(L_list);
		L_list=NULL;
	}
	else
	{
		DoubleLink rear=L_list;
		while(rear->next!=NULL)
			rear=rear->next;
		rear->prev->next=NULL;
		free(rear);
		rear=NULL;
	}
	return L_list;
}

四、多文件编辑实现双向链表操作

头文件 head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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

typedef char ElemType[20];  //重定义数据域的数据类型
typedef struct LNode  //定义双向链表存储结构
{
	ElemType data;
	struct LNode *next;
	struct LNode *prev;
}*DoubleLink;

DoubleLink Request_space();  //在堆区申请一个结点空间
int Output(DoubleLink L_list);  //实现输出
DoubleLink insert_head(DoubleLink L_list,ElemType value);  //实现头插
DoubleLink insert_rear(DoubleLink L_list,ElemType value);  //实现尾插
DoubleLink delete_head(DoubleLink L_list);  //实现头删
DoubleLink delete_rear(DoubleLink L_list);  //实现尾删

#endif

自定义函数 fun.c

#include "head.h"
DoubleLink Request_space()  //在堆区申请一个结点空间
{
	DoubleLink node=(DoubleLink)malloc(sizeof(struct LNode));
	if(NULL==node)
		return NULL;
	strcpy(node->data,"");
	node->next=node->prev=NULL;
	return node;
}
int Output(DoubleLink L_list)  //实现输出
{
	if(NULL==L_list)
		return -1;
	DoubleLink p=L_list;
	do
	{
		printf("%s ",p->data);
		p=p->next;
	}while(p!=NULL);
	puts("");
	return 0;
}

DoubleLink insert_head(DoubleLink L_list,ElemType value)  //实现头插
{
	DoubleLink node=Request_space();
	if(NULL==node)
		return L_list;  
	strcpy(node->data,value);
	if(NULL!=L_list)
	{
		node->next=L_list;
		L_list->prev=node;
	}
	L_list=node;
	return L_list;
}

DoubleLink insert_rear(DoubleLink L_list,ElemType value)  //实现尾插
{
	DoubleLink node=Request_space();
	strcpy(node->data,value);
	if(NULL==L_list)
		L_list=node;
	else
	{
		DoubleLink rear=L_list;
		while(rear->next!=NULL)
			rear=rear->next;
		rear->next=node;
		node->prev=rear;
	}
	return L_list;
}

DoubleLink delete_head(DoubleLink L_list)  //实现头删
{
	if(NULL==L_list)
		return NULL;
	if(L_list->next==NULL)
	{
		free(L_list);
		L_list=NULL;
	}
	else
	{
		DoubleLink p=L_list->next;
		strcpy(L_list->data,p->data);
		L_list->next=p->next;
		if(p->next!=NULL)
			p->next->prev=L_list;
		free(p);
		p=NULL;
	}
	return L_list;
}

DoubleLink delete_rear(DoubleLink L_list)  //实现尾删
{
	if(NULL==L_list)
		return NULL;
	if(L_list->next==NULL)
	{
		free(L_list);
		L_list=NULL;
	}
	else
	{
		DoubleLink rear=L_list;
		while(rear->next!=NULL)
			rear=rear->next;
		rear->prev->next=NULL;
		free(rear);
		rear=NULL;
	}
	return L_list;
}

主函数 main.c

#include "head.h"
int main(int argc, const char *argv[])
{
	DoubleLink L_list=NULL;  //定义头指针变量,注意定义时一定要指向NULL
	int n;            //定义循环输入次数
	ElemType value;   //定义数据域元素
	int seat;  //定义元素位置

	printf("please enter n:");
	scanf("%d",&n);

 	for(int i=0;i<n;i++)  //头插
	{
		printf("please enter a value:");
		scanf("%s",value);
		L_list=insert_head(L_list,value);
	}
	
	for(int i=0;i<n;i++)  //尾插
	{	
		printf("please enter a value:");
		scanf("%s",value);
		L_list=insert_rear(L_list,value);
	}

	L_list=delete_head(L_list);  //头删
	L_list=delete_rear(L_list);  //尾删
	Output(L_list);

	return 0;
}

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

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

相关文章

AJAX: 事件循环(举例细论)

概念&#xff1a;执行任务和收集异步任务&#xff0c;在调用栈空闲时&#xff0c;反复调用任务队列里回调函数的一种执行机制 原因&#xff1a;JavaScript 是单线程的&#xff0c;为了不阻塞 JS 引擎&#xff0c;设计执行代码的模型 JS内代码如何执行&#xff1a; 执行同步代…

暴雪娱乐遭DDoS攻击,《暗黑破坏神》等多款游戏受影响

6月25日上午11点&#xff0c;有游戏玩家反应Blizzard Battle.net无法登入、连线缓慢及网站问题&#xff0c;暴雪也证实其电玩平台遭到DDoS攻击。 暴雪娱乐的 Battle.net在线服务遭到分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;导致玩家无法正常登录游戏或游戏…

Spring Cloud Alibaba【Nacos配置动态刷新、Nacos集群架构介绍 、Nacos的数据持久化、认识分布式流量防护 】(五)

目录 分布式配置中心_Nacos配置动态刷新 分布式配置中心_Dubbo服务对接分布式配置中心 分布式配置中心_Nacos集群架构介绍 分布式配置中心_Nacos的数据持久化 分布式配置中心_Nacos集群配置 分布式流量防护_认识分布式流量防护 分布式流量防护_认识Sentinel 分布式配置…

WIN无法访问linux开启的SAMBA服务器

WIN无法访问linux开启的SAMBA服务器 打开搜索框“管理Windows凭据” 点击编辑

Goby 漏洞发布|天擎终端安全管理系统 YII_CSRF_TOKEN 远程代码执行漏洞

漏洞名称&#xff1a;天擎终端安全管理系统 YII_CSRF_TOKEN 远程代码执行漏洞 English Name&#xff1a;Tianqing terminal security management system YII_CSRF_TOKEN remote code execution vulnerability CVSS core: 9.8 影响资产数&#xff1a;875 漏洞描述&#xff1…

标注工具Labelimg,正常运行显示,但是对图片点击Create RectBox画矩形框开始闪退

问题描述*&#xff1a;标注工具Labelimg&#xff0c;正常运行显示&#xff0c;但是对图片点击Create RectBox画矩形框开始闪退&#xff0c;闪退出现以下代码 File “C:\ProgramData\anaconda3\Lib\site-packages\libs\canvas.py”, line 530, in paintEvent p.drawLine(self.p…

接口测试 Fiddler 保存会话 (请求)

目录 前言&#xff1a; 为什么要保存请求&#xff1f; 保存单个请求 打开保存的请求文件 乱码的解决方法 保存所有请求 自动保存请求的猜想 自动保存已实现 前言&#xff1a; 在进行接口测试时&#xff0c;Fiddler是一个非常有用的工具&#xff0c;它可以帮助您捕获和…

【蓝图】p27开关门互动实现

p27开关门互动实现 创建一个门 添加初学者内容包 拖拽一个门到场景中 添加一个碰撞 创建盒体触发器 左侧模式->基础->盒体触发器&#xff0c;拖拽到门上&#xff0c;调整大小 开关门互动实现 做一个开门互动 要把开门逻辑写在关卡蓝图里 门设置为可移动 打开关卡蓝…

【JAVA】方法的使用:方法语法、方法调用、方法重载、递归练习

&#x1f349;内容专栏&#xff1a;【JAVA】 &#x1f349;本文脉络&#xff1a;JAVA方法的使用&#xff0c;递归练习 &#x1f349;本文作者&#xff1a;Melon_西西 &#x1f349;发布时间 &#xff1a;2023.7.19 目录 1. 什么是方法(method) 2 方法定义 2.1 方法定义语法格…

【OC总结- Block】

文章目录 前言2. Block2.1 Block的使用规范2.2 __block修饰符2.3 Block的类型2.4 Block的循环引用及解决循环引用的场景引入解决循环引用Block循环引用场景 2.5 Block的实现及其本质2.5.1 初始化部分2.5.2 调用部分2.5.3 捕获变量 Block本质2.6 Block捕获变量 和 对象2.7 Block…

【算法基础:数据结构】2.2 字典树/前缀树 Trie

文章目录 知识点cpp结构体模板 模板例题835. Trie字符串统计❤️❤️❤️❤️❤️&#xff08;重要&#xff01;模板&#xff01;&#xff09;143. 最大异或对&#x1f62d;&#x1f62d;&#x1f62d;&#x1f62d;&#x1f62d;&#xff08;Trie树的应用&#xff09; 相关题目…

河北幸福消费金融基于 Apache Doris 构建实时数仓,查询提速 400 倍!

本文导读&#xff1a; 随着河北幸福消费金融的客户数量和放贷金额持续上升&#xff0c;如何依托大数据、数据分析等技术来提供更好决策支持、提高工作效率和用户体验&#xff0c;成为了当前亟需解决的问题。基于此&#xff0c;公司决定搭建数据中台&#xff0c;从基于 TDH 的离…

IIS Express本地开发测试如何映射到外网访问?

1.IIS Express是什么 IIS Express是为开发人员优化的轻量级、自包含版本的IIS。它具有IIS 7及以上的所有核心功能&#xff0c;以及为简化网站开发而设计的附加功能。 IIS Express&#xff08;跟ASP.NET开发服务器一样&#xff09;可以快速地从硬盘上的某个文件夹上启动网站…

GO语言Metex

Mutex互斥锁 type Mutex struct{state int32 // 0表示未加锁 1表示加锁&#xff0c;原子操作sema uint32 // 信号量&#xff0c;用作等待队列 } Mutex正常模式: 尝试加锁的G会先自旋几次,若获不到锁,则加入等待队列. 正常模式下,自选和等待队列的一起竞争 因为G频繁的挂起…

适合小公司的自动化部署脚本

背景&#xff08;偷懒&#xff09; 在小小的公司里面&#xff0c;挖呀挖呀挖。快挖不动了&#xff0c;一件事重复个5次&#xff0c;还在人肉手工&#xff0c;身体和心理就开始不舒服了&#xff0c;并且违背了个人的座右铭&#xff1a;“偷懒”是人类进步的第一推动力。 每次想…

2023版7月软件测试面试题(800道)【附带答案】持续更新...

又到了立flag的时候&#xff0c;你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一…

数智领航 信创强基 | GBASE南大通用携手金仕达共助金融用户合规风控

GBASE南大通用董事长丁明峰先生应邀出席大会并在主论坛发表题为《去全球化背景下的中国数据库发展策略》的主题分享。 技术的迭代发展是经济增长、产业升级的核心动力。纵观近现代社会史&#xff0c;信息技术和通信技术的迅猛发展&#xff0c;帮助人类实现了PC互联网到移动互联…

初识C++(上)——“C++”

各位CSDN的uu们你们好呀&#xff0c;小雅兰的全新专栏又来啦&#xff0c;这次的专栏主要介绍的是C&#xff0c;下面&#xff0c;让我们进入C的世界吧&#xff01;&#xff01;&#xff01; 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的…

TMS FlexCel for VCL FMX Crack

TMS FlexCel for VCL & FMX Crack 强大、广泛和灵活的组件套件&#xff0c;用于VCL和FireMonkey的本地Excel报告、文件生成和操作。 FlexCel for VCL/FireMonkey是一套允许操作Excel文件的Delphi组件。它包括一个广泛的API&#xff0c;允许本地读/写Excel文件。如果您需要在…

无极低代码,免费工具在线实用工具分享

在当今数字化的时代&#xff0c;我们需要尽可能地减少手动操作&#xff0c;提高工作效率。这就是为什么我们需要一些在线工具来帮助我们完成一些繁琐的任务。以下是一些无极低代码网集成的在线工具&#xff0c;可以帮助您更快、更轻松地完成任务。 项目管理 项目周期计算&…