今天写了个链表,好累。

[数据结构]好好思考一下吧,单链表真的那么难写吗? 故事还在继续,菜鸡大学生写完顺序表,感觉十分良好,萌生了把数据结构都撸一遍的想法。他自信满满的翻到后面的高阶数据结构,然后合上了,做出了一个伟大的决定:还是先挑软的欺负。 于是,今天的受害者就是单链表。 链表 什么是链表? 链表,是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接顺序实现的。 (链表的娇容) 好,我们已经解决了什么是,下面来解决为什么要有链表的问题,是顺序表不香了吗? 香,特香,嘎嘎香。 但是,顺序表存在几个小问题: 头插/指定位置删除,时间复. 阅读详情
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>

#define TRUE 1
#define FALSE 0
#define EXIT 0

//定义结点
struct nodetype 
{
	int data;
	struct nodetype *next;
};

typedef struct nodetype *node;
//判断链表是否为空
int IsEmpty(node L)
{
	if(L->next==NULL)
		return TRUE;
	return FALSE;
}
//初始化链表
node ListInit(void)
{
	node L;
	L=(node) malloc ( sizeof(struct nodetype) );
	if(L==NULL)
		printf("Out of memory!\n");
	L->data=0;
	L->next=NULL;

	return L;
}
//获取第i个结点的数值
int GetNode(node L,int i)
{
	int count;
	node p;

	if( IsEmpty(L) ){
		printf("List is empty!\n");
		return INT_MAX;
	}
	else if(i<=0 || i>L->data){
		printf("Insert position is ERRO! Plsease retry.\n");
		return INT_MAX;
	}
	else{
		for(count=0,p=L; count<i; count++)
			p=p->next;
		return p->data;
	}
}
//在第i个结点后插入数值x
void NodeInsert(node L,int i,int x)
{
	node p,p0;
	int count;

	if(i<0 || i>L->data)
		printf("Insert position is ERRO! Plsease retry.\n");
	else{
		for(count=0,p=L; count<i; count++)
			p=p->next;

		p0=(node) malloc ( sizeof(struct nodetype) );
		if(p0==NULL)
			printf("Out of memory!\n");
		else{
			p0->data=x;
			p0->next=p->next;
			p->next=p0;
			L->data++;

			if(i!=0)
				printf("%d was been inserted after Node-%d.\n",x,i);
			else	
				printf("%d was been inserted after Head.\n",x);
		}
	}
}
//删除第i个结点
void NodeDelete(node L,int i)
{
	int count,x;
	node p,pre;

	if( IsEmpty(L) )
		printf("List is empty!\n");

	else if(i<=0 || i>L->data)
		printf("Insert position is ERRO! Please retry.\n");

	else{	
		for(count=0,p=L; count<i; count++){
			pre=p;
			p=p->next;
		}
		x=p->data;
		pre->next=p->next;
		free(p);
		L->data--;
		printf("Node-%d=%d has beed deleted.\n",i,x);
	}
}
//遍历链表
void ListTraverse(node L)
{
	node p=L->next;

	if(p==NULL)
		printf("List is empty.\n");
	else{
		printf("List_number=%d: ",L->data);

		while(p!=NULL){	
			printf("%d ",p->data);
			p=p->next;
		}
	}
	printf("\n");
}
//销毁链表
void ListDestroy(node L)
{
	int n=L->data;
	
	if(n==0)
		printf("List is empty.\n");
	while(n!=0){
		NodeDelete(L,n);
		n--;
	}
	L->data=0;
	L->next=NULL;
}
//打印菜单
void MenuPrint(void)
{
	printf("=======================\n");
	printf("1.Initialize List\n");
	printf("2.Insert x after Node-i\n");
	printf("3.Delete Node-i\n");
	printf("4.Get Node-i\n");
	printf("5.If List is empty\n");
	printf("6.Traverse List\n");
	printf("7.Destroy List\n");
	printf("0.Exit!\n");
	printf("=======================\n");
	printf("\n");
}



//主函数
int main(void)
{
	int i,x;
	int input=1;
	node list;
	//输入选项
	while(input!=EXIT){
		MenuPrint();
		printf("Choose >>>: ");
		scanf("%d",&input);
		if(input<0 || input>7){
			printf("\n");
			printf("Your choice is ERRO!\n");
			printf("\n");
		}
		//处理选项
		switch(input)
		{
			case 1:	
				list=ListInit();
				printf("List has been initialized.\n");
				printf("\n");
				break;
			case 2:	
				printf("Input i x: ");
				scanf(" %d %d",&i,&x);
				printf("\n");
				NodeInsert(list,i,x);
				printf("\n");
				break;
			case 3:
				printf("Input i: ");
				scanf(" %d",&i);
				printf("\n",i);
				NodeDelete(list,i);
				printf("\n");
				break;
			case 4:
				printf("Input i: ");
				scanf(" %d",&i);
				printf("\n");
				printf("Node-%d=%d\n",i,GetNode(list,i));
				printf("\n");
				break;
			case 5:
				if(IsEmpty(list))
					printf("Yes.It is.\n");
				else
					printf("No.It is not.\n");
				printf("\n");
				break;
			case 6:
				ListTraverse(list);
				printf("\n");
				break;
			case 7:	
				ListDestroy(list);
				printf("List has been destroyed.\n");
				printf("\n");
				break;
			case 0:
				input=0;
		}
	}

	system("PAUSE");
	return 0;
}


 说明:(1) 第一步务必输入:1, 即:1.Initialize List 分配表头。

             (2) 在使用时请输入数字对应菜单选项,不要使用字母,否则会出错。

今天开始学Java 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。 题目描述输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。链表结点定义如下:struct ListNode{      int       m_nKey;      ListNode* m_pNext;};详细描述:本题为考察链表的插入和删除知识。链表的值不能重复构造过程,例如1 -&gt; 23 -&gt; 25 -&gt; 14 -&gt; 5... 阅读详情

相关推荐

【数据结构】链表OJ第一篇 —— 移除链表元素 && 反转链表 && 合并两个有序链表

移除链表元素、反转链表、合并两个有序链表

StackFrame 1543

欧姆龙PLC仿真环境搭建及通信测试

欧姆龙PLC是工控领域市场率较高的品牌之一,有低端CP/CH系列,中端CJ系列,高端NX/NJ系列。对于上位机开发来说,主要的协议有Hostlink协议、FinsTCP/UDP协议、EtherNetIP协议,今天主要跟大家分享一下,我们在上位机学习中如何通过软件来搭建仿真环境,在没有硬件的情况下,也可以进行协议测试。

yjg428的专栏 9491

国税局发票查验中英文验证码识别最新版,识别率99.9%

采用深度学习进行发票查验验证码模型的训练,在我电脑上模型训练的环境如下: 显卡:RTX 2080TI tensorflow-gpu:2.5.3 1 训练集和测试集的准备 发票查验的验证码分为4种类型,分别为黑色、红色、黄色、蓝色,经过我的测试,采用4个模型的效果最好,每个模型对应识别一种类型的验证码。 首先我们4种类型的验证码都准备10万张。 00黑色类型的验证码: 01红色类型的验证码: 02黄色类型的验证码: 03蓝色类型的验证码: 验证码图像图像准备好后,对其进行标记,也就是对验证码重命名:

Keras深度学习 83万+

今天小胡杨手绘28张图只为教会你单链表

学数据结构你不画图吗? 小胡杨今天手绘30张图,12个函数接口手把手教你实现,必须教会你单链表的实现。

m0_64770095的博客 3539

安卓7.0+抓包难题:雷电模拟器9.0+Charles系统证书安装全攻略

HTTPS协议通过SSL/TLS加密保障网络通信安全,其核心机制依赖于证书信任链。在Android系统中,自7.0版本起,谷歌收紧了证书信任策略,默认仅信任系统预置的CA证书,这直接导致了传统抓包方法失效。理解这一原理对于移动开发、测试及安全研究至关重要,它揭示了应用层安全策略与系统底层机制的关联。通过将用户证书安装至系统信任区,可以突破此限制,实现HTTPS流量的解密与分析。这一技术在App调试、接口测试、安全审计等场景中具有广泛的应用价值。本文以雷电模拟器9.0和Charles抓包工具为例,详细演示了如

weixin_42521843的博客 279

Maya vray 3S皮肤材质球设置与材质节点连接

Maya vray 3S皮肤材质球设置与材质节点连接

WETQETF的博客 2697

【从今天开始好好学数据结构03】链表

今天我们来聊聊“链表(Linked list)”这个数据结构,相比数组,链表是一种稍微复杂一点的数据结构。对于初学者来说,掌握起来也要比数组稍难一些。这两个非常基础、非常常用的数据结构,我们常常将会放到一块儿来比较。所以我们先来看,这两者有什么区别。数组需要一块连续的内存空间来存储,对内存的要求比较高。而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,链表...

宜春 4968

LangChain与SkillLite集成:AI Agent安全沙箱实践

在AI与自动化技术领域,安全沙箱是实现可信计算的核心机制。其原理是通过资源隔离与权限控制,构建受限的执行环境。技术价值在于平衡功能开放性与系统安全性,尤其适用于处理用户提交的非受信代码或敏感数据。典型应用场景包括AI插件系统、在线代码评测平台等。本文以LangChain框架与SkillLite沙箱的深度集成为例,详解如何通过命名空间隔离、cgroups限制等机制,为AI Agent赋予安全执行动态技能的能力。其中涉及的关键技术点包括Python运行时隔离、动态资源配额管理,以及如何防范Shell注入等常见攻

weixin_34189116的博客 405

一步一步写算法(之双向链表)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     前面的博客我们介绍了单向链表。那么我们今天介绍的双向链表,顾名思义,就是数据本身具备了左边和右边的双向指针。双向链表相比较单向链表,主要有下面几个特点:     (1)在数据结构中具有双向指针     (2)插入数据的时候需要考虑前后的方向的操作     (3)同样,删

嵌入式-老费,一个分享专业嵌入式知识的blog 8万+

国产安路FPGA(二)-TD软件时序约束与硬件调试实战

本文深入探讨了国产安路FPGA开发中TD软件时序约束的实战应用。文章详细解析了SDC文件的核心语法,包括基础时钟、生成时钟及输入输出延迟约束的编写方法,并针对硬件调试中常见的时序问题提供了解决方案。通过一个图像处理流水线的优化案例,阐述了如何结合代码修改与约束设置,实现设计从“能跑”到“跑得稳”的关键提升,是掌握FPGA可靠设计的实用指南。

weixin_29183637的博客 377

【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调

【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调

perseverance51博客 2117

今天写链表时候遇到的问题,请高手解答一下

蛙人Ryan的水池 427

YOLO26优化:AAAI2026 | 融合PartialNet Block的C3k2-YOLO高效目标检测网络 | 轻量化涨点设计

PartialNet Block 结合YOLO26的C3k2模块,进行二次创新。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 592

代码随想录day3(今天链表写的很痛苦

203.移除链表元素今日任务。

cookieeee_的博客 368

SOME/IP协议详解「总目录」

SOME/IP系列文章总目录

雪云飞星的博客 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

今天继续链表的学习

单链表的学习

xjm18326122914的博客 98

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

从零开始写算法——链表篇:相交链表 + 反转链表

leetcode hot100中链表的两个题

m0_59624833的博客 659

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

链表:想写好链表代码可真要下点功夫

前言 上一篇文章我们探讨了数组这个非常基础的数据结构。对于数组,我们知道了数组在内存中是按照顺序存储并线性排列,所以具有“随机访问"的能力,但是对于删除和插入等操作却十分低效。 今天我们一起探讨一个新的数据结构—链表,看看链表是什么?学习链表有什么用? 链表是什么 链表是一种非常重要的数据结构,应用的非常广泛,在写链表代码非常容易出错,所以面试中链表经常会被用来考察面试者的逻辑是否严谨。 链表它不像数组,数组需要的是一块连续的内存空间来存储,而链表并不需要一块连续的内存你空间(也就是可连续也可不连续),它可

三毛码代码 214

【数据结构】如何写好面试中的链表【上】

相信很多刚找工作时的同学,都遇到过面试时被问链表的情景,有些面试官还喜欢直接要你在纸上写。

xiaod_szu的专栏 463

用模板写通用链表的方法之一

模板,链表

qq_25097487的博客 527

开始复习链表,今天写了两个函数,一个创建节点,一个遍历节点

#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct node { int data; struct node *pNext; }Node; Node *create_list() { int i; int num; ...

Solong 276

使用C语言写带头结点的链表,含有创建、输出、查找、删除、插入、合并

用C语言写出带头结点的链表那些带头结点的链表的题目必要代码定义一个结构体创建一个带头结点的单链表 今天有一位学弟在网上向我吐血求助,让我帮他写c语言带头结点的链表题目。 我想了想,c语言我有一年半载没有接触了。正好温习温习一下,就写下此博客,来回顾一下我学习c语言的汗(Lei)水(Shui)与快(Tong)乐(Ku)。尽管我没有老师写的那么详尽,也没有教科书式的讲的那么专业。但我是站在学生的角度去...

hua_you_qiang的博客 4997

今天开始学Java 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。

题目描述输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。链表结点定义如下:struct ListNode{      int       m_nKey;      ListNode* m_pNext;};详细描述:接口说明原型:ListNode* FindKthToTail(ListNode* pListHead, unsignedint k);输入参数:    ...

u014566193的博客 2073

从零开始,教你写FreeRTOS双向链表

迷你节点也是节点,但迷你节点仅用于标记链表的末尾和挂载其他插入链表中的节点,用户是用不到迷你节点的,链表头节点和普通节点可以不一样。下面这个头即使链表定义,也是链表头,链表头节点和普通节点可以不一样。节点在FreeRTOS中叫做链表项。

an520_的博客 720

java的链表怎么实现_java 实现链表(自己写的)

今天用java写了下的链表, 还是有点糊涂的。这和C语言写的链表还是有点不太一样的。感觉C语言的结构清晰点的,可能是内存中保存的值是引用还是真的值有关系吧有两点要说明下的:1、Head --> Node --> Node --> Node --> Node链表的head是不保存数据的,一般开辟内存然后在里面放null空对象。保存值从第一个Node开始的。C语言好像也是这样的...

weixin_36411884的博客 553

(C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)

我学习了几天数据结构,今天下午自己写了一个单向链表的程序。我也是新手,所以刚开始学习数据结构的菜鸟们(有大牛们能屈尊uY3Nkbi5uZXQvZmlzaGVyd2Fu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity看一看,也是我的荣幸)可以和我一起共同学习、讨论,当然也很高兴能指出我的错误,因为这是我们一起成长的过程

菜鸟学C/C++ 4万+
上一篇: 找工作
下一篇: 插入排序法_c实现 (2)
cpprogrammer
博客等级 码龄15年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值