数据结构-链表篇

数据结构伪代码的实现(链表篇) 标题 数据结构伪代码的实现(初学者,持续更新) 链表篇 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include <stdbool.h> typedef struct Node { int data; struct Node* pNext; }NODE,* pNODE; //函数声明 pNODE create_list(viod); void traverse_list 阅读详情

链表的优点:

  1. 插入和删除速度快
  2. 内存利用率高
  3. 可以随时扩展,不必担心存储满

链表的缺点:

  1. 不能随机查找,只能通过从头一个一个找,查找效率低

实现如下:

#include <stdio.h>
#include <malloc.h>

typedef struct Node
{
	int data;            //数据域
	struct Node *pNext;  //指针域,存储下一个节点的地址
}Node;

//函数声明
Node* head_create_list();  //头插法创建链表
Node* end_create_list();   //尾插法创建链表
void insert(Node *phead, int address, int val);  //插入节点
void removes(Node *phead, int address, int *removeItem);  //删除节点
void sort(Node *phead);   //排序
void show(Node *head);  //输出链表的所有元素
int number(Node *head);  //判断链表里面元素的个数


void main()
{
	int choose;
	int address, val, removeItem;
	Node *phead = NULL;      //声明头指针,指向头节点
	while(1)
	{
		printf("为链表提供以下功能选项:\n");
		printf("1. 使用头插法建立链表\n");
		printf("2. 使用尾插法建立链表\n");
		printf("3. 插入元素\n");
		printf("4. 删除元素\n");
		printf("5. 排序\n");
		printf("6. 输出所有元素\n");
		printf("请输入选项(输入0退出): ");
		scanf("%d", &choose);
		switch(choose)
		{
			case 1:
				phead = head_create_list();
				break;
			case 2:
				phead = end_create_list();
				break;
			case 3:
				printf("请输入要插入的位置: ");
				scanf("%d", &address);
				printf("请输入要插入的元素: ");
				scanf("%d", &val);
				insert(phead, address, val);
				printf("插入成功!!\n\n");
				break;
			case 4:
				printf("请输入要删除的位置: ");
				scanf("%d", &address);
				removes(phead, address, &removeItem);
				printf("删除成功, 删除的元素为%d\n\n", removeItem);
				break;
			case 5:
				printf("正在排序中...\n");
				sort(phead);
				break;
			case 6:
				show(phead);
				break;
			default:
				exit(-1);
		}
	}
}

//头插法
Node* head_create_list()
{
	int i, size, val;
	Node *phead = (Node*)malloc(sizeof(Node));    //为头节点分配空间
	phead->pNext = NULL;
	printf("请输入元素的个数:");
	scanf("%d", &size);
	if(size <= 0)
	{
		printf("值无效!\n\n");
		free(phead);
		return NULL;
	}
	for(i=1; i<=size; i++)
	{
		Node *pnew = (Node*)malloc(sizeof(Node));
		printf("输入第%d个节点的值: ", i);
		scanf("%d", &val);
		if(pnew == NULL)
		{
			printf("分配空间失败!");
			exit(-1);
		}
		pnew->data = val;
		pnew->pNext = phead->pNext;
		phead->pNext = pnew;
	}
	printf("头插法链表建立成功!\n\n");
	return phead;
}

//尾插法
Node* end_create_list()
{
	int i, size, val;
	Node *phead = (Node*)malloc(sizeof(Node));
	Node *p = phead;        //声明一个指针,用来指向最末尾的节点
	phead->pNext = NULL;
	printf("请输入元素的个数:");
	scanf("%d", &size);
	if(size <= 0)
	{
		printf("值无效!\n\n");
		free(phead);
		return NULL;
	}
	for(i=1; i<=size; i++)
	{
		Node *pnew = (Node*)malloc(sizeof(Node));
		printf("请输入第%d个节点的值: ", i);
		scanf("%d", &val);
		if(pnew == NULL)
		{
			printf("分配空间失败!");
			exit(-1);
		}
		pnew->data = val;
		p->pNext = pnew;
		pnew->pNext = NULL;
		p = pnew;
	}
	printf("尾插法链表建立成功!\n\n");
	return phead;
}

//插入节点
void insert(Node *phead, int address, int val)
{
	Node *p = phead;
	Node *pnew = (Node*)malloc(sizeof(Node));
	int i;
	if(address>number(phead)+1 || address<=0)
	{
		printf("不在范围内!\n\n");
		return;
	}
	else
	{
		for(i=0; i<address-1; i++)
		{
			p = p->pNext;
		}
		pnew->data = val;
		pnew->pNext = p->pNext;
		p->pNext = pnew;
	}
}

//删除节点
void removes(Node *phead, int address, int *removeItem)
{
	int i;
	Node *p1, *p2;
	p1 = phead;
	p2 = phead;
	if(number(phead) == 0)
	{
		printf("链表无元素!\n\n");
		return;
	}
	else if(address>number(phead) || address <=0)
	{
		printf("不在范围内!\n\n");
		return;
	}
	for(i=0; i<address; i++)
	{
		if(i == address-1)
		{
			p2 = p2->pNext;
		}
		else
		{
			p1 = p1->pNext;
			p2 = p2->pNext;
		}
	}
	p1->pNext = p2->pNext;
	p2->pNext = NULL;
	*removeItem = p2->data;
	free(p2);
}

//排序
void sort(Node *phead)
{
	if(number(phead) == 0)
	{
		printf("链表无元素!\n\n");
		return;
	}
	else
	{
		Node *p = phead;
		Node *p1;
		int i, j;
		int temp;
		int all = number(phead);
		for(i=0,p=p->pNext; i<all-1; i++,p=p->pNext)
		{
			for(j=i+1,p1=p->pNext; j<all; j++,p1=p1->pNext)
			{
				if(p->data > p1->data)
				{
					temp = p->data;
					p->data = p1->data;
					p1->data = temp;
				}
			}
		}
		printf("排序成功!\n\n");
	}
}

//输出链表的所有元素
void show(Node *phead)
{
	Node *p = phead;
	if(p == NULL)
	{
		printf("链表无元素!\n\n");
		return;
	}
	else
	{
		while(p->pNext != NULL)
		{
			printf("%d ",p->pNext->data);
			p = p->pNext;
		}
		printf("\n\n");
	}

}

//返回当前链表中节点的个数
int number(Node *phead)
{
	Node *p = phead;
	int num = 0;
	if(phead == NULL)
	{
		return 0;
	}
	while(p->pNext != NULL)
	{
		num++;
		p = p->pNext;
	}
	return num;
}
java复习篇 数据结构:链表第一节 链表头插、尾插等,一文掌握 阅读详情

相关推荐

【数据结构与算法】第1篇:链表基础讲解

1 概述 链表是一直常见且重要的数据结构。它是动态地进行存储分配的一种结构。 节点: 链表中每个元素称为节点。 2 链表创建 2.1 静态链表 静态链表: 所有节点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称之为静态链表。 【例程】 #include <stdio.h> struct student{ char *name; unsigned int score; struct student *next; }; void main(void) { stru

黑猫奥利奥的博客 281

数据结构---链表、堆栈、队列详解

数据结构---链表、堆栈、队列详解 一、两种存储方式 1、顺序存储 2、链式存储 二、顺序表 顾名思义,顺序表就是一段连续的存储空间,知道首地址,可以访问表中的任意元素;比如数组; 像这样的一段存储空间。 typedef struct { datatype data[MAXSIZE]; int len; }sqlistnode, *sqlistlink;

ManagerUser的博客 8869

【论文阅读】AU检测|《Deep Adaptive Attention for Joint Facial Action Unit Detection and Face Alignment》

摘要 本文旨在从大量没有人工标注的视频中学习用于面部动作单元检测的区分表示。受面部动作是面部肌肉运动这一事实的启发,论文将这些运动描述为不同帧中两幅面部图像之间的转换,并将其用作学习表示的自我监控信号。但是,在不受控制的情况下,这种转换是由面部动作和头部运动引起的。为了消除头部运动的影响,我们提出了一个双圈自动编码器(TCAE),它可以解开面部动作相关运动和头部运动相关运动。具体而言,TCAE被训练成分别将源面部的面部动作和头部姿态改变为目标面部的面部动作和头部姿态。我们的实验验证了TCAE解耦运动的能力。

Celine的博客 4554

《剑指offer》-数据结构篇-链表

本文总结了链表9道算法的典型题目及解法,包括:1. 从尾到头打印链表(利用辅助栈);2. 反转链表(改变指针指向);3. 链表中倒数第K个结点(快慢指针);4. 合并有序链表(构建新链表);5. 复杂链表复制(哈希表存储);6. 删除重复元素(指针操作);7. 寻找公共结点(双指针);8. 环的入口检测(快慢指针);9. 二叉搜索树转双向链表(中序遍历)。文中提供了Python实现代码,并强调指针操作在链表问题中的重要性。这些题目涵盖了链表操作的基本技巧,是算法学习的基础内容。

乐于创作,乐于分享,志于创作高价值博文 1192

allegro转AD-(附工具)

本文介绍了将Allegro的.brd文件转换为Altium Designer可用的.alg文件的操作流程。首先需要下载专用转换工具,然后通过运行.bat脚本将.brd文件转换为.alg格式。最后在Altium Designer中使用导入向导完成文件转换,生成可用的PCB设计文件。整个过程简单快捷,只需三个步骤即可实现Allegro到Altium Designer的工程文件转换。

weixin_50120208的博客 1717

GB28181安防平台未授权访问漏洞:原理、复现与修复指南

未授权访问漏洞是Web安全中常见的访问控制缺陷,其本质在于应用在提供对敏感功能或数据的访问前,未能对请求者的身份和权限进行充分验证。从技术原理上看,这类漏洞常源于拦截器配置错误、安全注解遗漏或自定义校验逻辑缺陷,导致本应受保护的API接口被意外暴露。在工程实践中,此类漏洞危害巨大,攻击者无需登录即可直接访问系统核心接口,可能引发敏感信息泄露、权限提升甚至系统接管。尤其在安防监控、物联网管理平台等场景中,一旦涉及用户管理接口(如`/api/user/**`),风险会急剧放大。本文以GB28181视频监控管理平

weixin_30271335的博客 440

【数据结构】链表篇

手把手教你实现链表~

Yui_的博客 1592

Anomalib实战:从零开始构建自定义数据集的异常检测模型

本文详细介绍了如何使用Anomalib 2.1.0从零开始构建自定义数据集的异常检测模型。通过实战演示,指导读者准备符合规范的数据集结构,快速上手训练Patchcore等先进算法,并完成模型推理与调优,为工业质检、医疗影像等场景提供高效的视觉异常检测解决方案。

weixin_29165465的博客 109

数据结构之链表篇

链表是一种在 物理存储上不连续,但是在逻辑结构上通过指针链接下一个节点的形成一个连续的结构。他和我们的火车相似,我们的元素是可以类比成车厢,需要将⽕⻋⾥的某节⻋厢去掉/加上,不会影响其他⻋厢,每节⻋厢都是独⽴存在的。这就挺现了一个好处:就是我们在插入删除的时候不用将其他的元素进行移动,我们只需要将指针的指向进行改变就行。所以在我们考虑使用顺序表还链表的时候,就可以考虑我们是否需要频繁的插入和删除我们的元素。

2301_80028974的博客 2670

RK3566基于Buildroot定制QT开发环境的完整指南

本文详细介绍了如何在RK3566开发板上使用Buildroot定制QT开发环境的完整流程。从基础环境搭建、Buildroot初始配置到QT模块选择与编译验证,提供了实战经验和常见问题解决方案,帮助开发者高效完成嵌入式Linux下的QT开发环境部署。

weixin_26804345的博客 360

国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

DLL,非.net开发,所以无需安装配置,直接程序引用开发即可,支持各类开发语言。已知省份有广西、贵州、安徽、河北、黑龙江、湖南、吉林、江苏、四川、新疆等各地方。国家医保移动支付国密算法SM2签名验签、SM4加解密DLL。//SM4加密与解密。支持医保移动支付(国家统一版),//SM2签名与验签。

4266

c# 数据结构 链表篇 有关双向链表的一切

本人能力有限,如有不足还请斧正。

咩咩的博客 1286

STP生成树/BPDU保护小实验

HCIA部分—STP生成树小实验 实验环境如图所示,要求: 1.在SW1上配置为根桥,使SW3的G0/0/1口作为根端口 2.在SW1的G0/0/3配置为边缘端口 3.若在SW1的G0/0/3口收到BPDU,能自动关闭该端口 4.通过配置bpdu保护,使端口能自动恢复up状态 首先,我们可以通过命令dis stp brief或者dis stp命令来得知SW1在生成树中的角色 确认SW1为非根交换机,此时可以通过修改stp优先级来让SW1成为根桥: 优先级数值缺省为32768,数值越小,优先级越高,数值

1mih的博客 5150

c++数据结构篇——链表

通过文字很难明白链表到底是一种什么样的数据结构,所以我们一起来试着将理解到的东西画出来:试着想想,生活中的铁链是怎么构成的,是不是想到了最基础的部分——链结?所以我们先画个链结吧。然后将很多个 这样的链结首尾相连起来我们就得到了这样一个链子。这时候我们发现,只要用一个指针储存一个链结的头节点(也就是其首地址)在将这个指针放在前一个链结的内部形成尾节点。就能将两个链结连接起来形成一条铁链。再然后,由于指针的存在,所以每个链结就不用紧紧排列在一起。

2301_79702677的博客 1373

Vue3 - 详细实现调用浏览器摄像头拍照并生成图片预览,支持将抓拍的图像保存到用户本地或上传到服务器、调取前置摄像头和后置摄像头,开启摄像头并进行拍照,vue实现调用摄像头,电脑或手机调用摄像头拍照

vue3,nuxt3,摄像头,vue3网站打开摄像头拍照,vue3项目调用摄像头实现拍照功能,拍照后怎么保存,照相后上传到后端服务器,开启摄像头黑屏,如何默认后置摄像头,网页开启电脑摄像头并照相,前置拍照,vue3如何调用手机摄像头进行拍摄,拒绝权限后不再弹出了,微信公众号网页,摄像头报错,拍照左右镜像反了,浏览器不兼容怎么办,vue3调用电脑端摄像头实时拍照,解决调用摄像头权限无法弹出,打不开摄像头,Vue3如何调用手机的摄像头,调用本地摄像头实现拍照,浏览器不弹摄像头权限了,如何不使用https运行测试

🏆 前端领域优质创作者 8654

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c# 数据结构 链表篇 有关单链表的一切

算代码一万一千多字 为了让新手也能看明白,我也是出息了

咩咩的博客 1770

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数据结构初探:链表之单链表篇

单链表保姆级教学

ChrisJamesljl的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

数据结构基础篇之链表

数据结构基础篇之链表

2301_76874968的博客 927

数据结构->链表篇

我们把每个数据看作每一个车厢,如果没有连接车厢的装置的话,那么每个车厢就是独立的.我们通过记录下一个节点的地址实现每个节点的链接.我们通过上面的图可以知道我们的每组数据。纵使有这么多的类型但是使用率最高的是。data表示的这个节点存储的数据.next存储的是下一个节点的地址.所以我们先要找尾节点.

jiaomorning的博客 1362

数据结构与算法之链表篇

关于链表的一些常见面试题

葵的博客 197

重学数据结构之链表篇

本文是重学数据结构系列文章的第二篇,本文和大家一起探讨链表的相关知识。 重学数据结构之数组篇 文章目录链表是怎么样的数据结构链表的特点常见的链表结构单链表双向链表循环链表链表or数组链表的应用正确写出链表的6个技巧 链表是怎么样的数据结构 链表,不需要连续的内存空间,通过“指针(引用)”将一组零散的内存块串联起来的数据结构。 内存块在链表中也叫“结点”,每个结点除了存储数据,还需要记录链上的下一个或者上一个结点的地址。 链表的特点 1.插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低

wayne214的博客 539

数据结构初探:链表之双向链表篇

双向带头循环链表(保姆级教程)

ChrisJamesljl的博客 1891

数据结构——链表,单链表篇

链表 概述:线性表的链式存储结构称为链表,其中每个节点不仅包含元素本身信息,而且包含标识元素之间的逻辑关系的信息,在C/C++中常用指针来实现,这称为指针域。 在线性表的链式存储中,每个链表都头结点,并通过头结点唯一标识该链表,称为头指针,相应指向首节点指针称为首指针,尾结点称为尾指针(切记单链表是无前驱的),如下图: 链表与顺序表的比...

奔跑的程序猿 1915

数据结构,链表篇

关于它的顺序是由链表中的成员变量next和prev链接实现的,是一种递归的数据结构,链表有一系列节点组成,而这些节点会在运行时动态生成。链表是由一个个节点组成的,每一个节点包括一个人val域和一个next域(指向下一个节点),双向链表还包括prev域(指向上一个节点)双向链表可以向前或向后查找,与单向链表的区别就是它不仅有后继节点(next),还有前驱节点(prev)。到这里,链表的基础知识就结束了,循环链表我会单独出一个博客,想看的朋友可以期待下。show()(展示每一个节点)clear()(清空链表)

Kve_MAN的博客 734
上一篇: 数据结构-数组篇
下一篇: 数据结构-栈
SSSuperbeyond
博客等级 码龄8年 22粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值