链表接口的实现

【数据结构】双向链表的接口实现(附图解和源码) 本文介绍双向链表的接口实现(附图解和源码),如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持! 阅读详情

# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# define StopCondition t!=0  /***根据实际程序需要修改***/

typedef int DataType;   /***根据实际程序需要修改***/

typedef struct node{
    
	DataType data;
    struct node *next;
	
}Node;


typedef Node* LinkList;

/*****根据实际程序需要修改*******/
static void GetData(DataType *pdata);   
static void TraverseFunc(DataType tdata); 
/***********END*************/ 

/***********ADT接口声明***************/ 
void InitList(LinkList *pphead);
void CreatList(LinkList *pphead);
int DeleteNode(LinkList *pphead,int n,DataType *pdata);
int InsertNode(LinkList *pphead,int n,DataType tdata);
void TraverseList(LinkList*pphead,void(*pfunc)(DataType));
unsigned int ListLength(LinkList *pphead);
int ListIsEmpty(LinkList *pphead);
void DestroyList(LinkList *pphead);
/**************END***********/



int main (void)
{
	
	LinkList mylist;
	DataType t= 100;
	DataType data;
	int n;
	
	
	
	InitList(&mylist);
	 
	puts("请输入数据,输入 0 结束输入"); 
	CreatList(&mylist);
	
	puts("数据录入成功");
	TraverseList(&mylist,&TraverseFunc);
	
	
	
	#if 0
	puts("开始删除测试");
	while(!ListIsEmpty(&mylist))
	{
		scanf("%d",&n);
		DeleteNode(&mylist,n,&data);
		printf("%d已成功删除\n",data);
		
	}
	# endif
	
	DestroyList(&mylist);
	return 0;
}



static void GetData(DataType *pdata)  ///
{
	
	int ch;
	while(1!=scanf("%d",pdata))
	{
		fputs("illegal input,try again !\n",stderr);
		while((ch=getchar())!=EOF && ch!='\n')
		continue ;
	}
	
	
	return ;
}

static void TraverseFunc(DataType tdata)
{
	
	printf("%d\n",tdata);
	return ;
}




void InitList(LinkList *pphead)
{
	
	
	*pphead=(Node*)malloc(sizeof(Node));
	if(*pphead==NULL)
	{
		fputs("memory allocate error!\n",stderr);
	    exit(EXIT_FAILURE);
	}
	
	(*pphead)->next=NULL;
	
	
	return ;
	
}


void CreatList(LinkList *pphead)
{
	
	Node * p1, *p2;
	
	DataType t;

	GetData(&t);
	while(StopCondition)
	{
		
		p1=(Node*)malloc(sizeof(Node));
		if(p1==NULL)
		{
			fputs("memory allocate error!\n",stderr);
	        exit(EXIT_FAILURE);
			
		}
		
		p1->data=t;
		p1->next=NULL;
		
		if((*pphead)->next==NULL)
		    (*pphead)->next=p1;
		
		else 
		    p2->next=p1;
		    
		    
		p2=p1;    
		
		GetData(&t);
		
		
	}
	
    return ;
	
}

int DeleteNode(LinkList *pphead,int n,DataType *pdata)
{
	int j = 1 ;
	Node*pt;
	Node*p=*pphead;
	
	if(n<1)
	   return 0;
	
	while(p->next!=NULL && j< n)
	{
		p=p->next;
		++j;
	}
	
	if(p->next==NULL)
	    return 0;
	
	pt=p->next;  //pt保存待删除节点地址 
	
	*pdata=pt->data;  //取出节点的数据 
	
	p->next=p->next->next;   //跨越待删节点 再连接 
	free(pt);
	
	return 1;
}


int InsertNode(LinkList *pphead,int n,DataType tdata)
{                       //将tdata数据所在的结点插为第n个结点 
	int j =1;
	Node*p=*pphead;
	
	Node*pnew;
	
	if(n<1)
	    return 0;
	
	while(p!=NULL && j< n)
	{
		p=p->next;
		++j;
	}
	
	if(p==NULL)    //插入的位置不在范围内 
	    return 0;
	
	pnew=(Node*)malloc(sizeof(Node));
	if(pnew==NULL)
	    return 0;
	
	pnew->data=tdata;    //存入结点数据 
	pnew->next=p->next;  //新节点连接后面的结点 
	
	p->next=pnew;       //新节点被前面连接 
	
	return 1;
}

void TraverseList(LinkList*pphead,void(*pfunc)(DataType))
{
	
    Node*p=(*pphead)->next;  //取出第一个数据结点的指针 
	
	while(p!=NULL)
	{
		(*pfunc)(p->data);    //函数作用与节点数据 
		p=p->next;
			
	}
	
	
	return ;
		
}



unsigned int ListLength(LinkList *pphead)
{
	Node*p=(*pphead)->next;   //取出第一个数据结点的指针 
	
	unsigned count = 0;
	
	while(p!=NULL)
	{
		p=p->next;
		++count;
		
	}
	
	
	return count;
}

int ListIsEmpty(LinkList *pphead)
{
	
	return (*pphead)->next==NULL;
	
}

void DestroyList(LinkList *pphead)
{
	Node*p=*pphead; 
	Node*pt;          
	
	while(p!=NULL)
	{
		pt=p;          //临时保存待释放的目标结点 
		p=p->next;     //后移 
		
		free(pt);     
	}
	
	return ;
		
}



1.为了统一接口,函数都是用了2级指针:LinkList *,调用时都使用LinkList*类型

2.用Node**对ADT接口实现来说更加直观,但是鉴于一般编译器都有函数接口类型提示效果,所以接口都做了修改。用LinkList* 而不是Node**

3.优化,使更加适合重用。上面的main函数用来驱动测试,实际开发一般多文件分开写。

 





Python 基于数组、链表实现的包接口 包接口包操作及其方法用户的包操作Bag类中的方法b = &lt;class name&gt;(&lt;optional collection&gt;)__init__(self,sourceCollection = None)b.isEmpty()isEmpty(self)len(b)__len__(self)str(b)__str__(self)item in b__contains__(sel... 阅读详情

相关推荐

74、链表操作与接口实现全解析

本文深入解析了链表的基本操作和复杂操作,重点探讨了如何实现有序添加元素的 `addSorted` 方法。文章还介绍了链表接口的设计与实现,支持泛型的自定义 `LinkedList<E>` 类,并对单向链表、循环链表、带虚拟节点的链表和双向链表进行了详细对比。同时,分析了不同类型链表的操作复杂度,并介绍了如何实现迭代器以支持 `for-each` 循环。适合希望深入理解链表操作和接口设计的开发者阅读。

o9p0q1的博客 70

单链表的常见接口/函数的实现

链表是一种 物理存储结构 上非连续 ,非顺序的存储结构 , 数据元素的逻辑顺序是通过链表中的指针链接次序实现的

原来是猿的成长足迹 1096

初阶数据结构【单链表及其接口的实现】

在前面我们学到了数据结构中一个简单的数据结构—顺序表,通过我们对其的了解,我们不难知道,其实顺序表就是一个可以动态增长的数组,但是我们在对其进行增容时,往往增容是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。这期我们主要介绍了链表的相关概念和单链表的接口实现,下期我们将实现常用链表之一的双链表的接口实现;最后,祝26考研一战成硕,加油!

吴先生的博客 1585

【C语言】超详细的单链表实现及接口执行逻辑解析~

在上两篇博文中,我写了顺序表及以顺序表为底层结构实现通讯录项目的相关内容,这都是线性表的一种,本文将详细介绍另一种线性表数据结构——链表。本文中有超多画图讲解,请你一定不要错过哟!

careathers的博客 392

75、链表操作与接口实现全解析

本文深入解析了链表的基本操作,包括插入、删除和查找节点,并详细讲解了如何实现有序插入方法addSorted。文章还介绍了如何通过引入IntList接口提高代码复用性,展示了链表与接口的结合应用。此外,探讨了链表的多种变体,如循环链表、带虚拟节点的链表和双向链表,分析了它们的特点和适用场景,帮助读者全面掌握链表相关知识。

k0l1m2n3o的博客 67

链表常用操作API函数示例

该API用于实现链表的一系列常用操作,包括:创建、增加节点、查找节点、删除节点、显示所有节点、删除链表的操作,代码中加入了各种异常处理。

单链表各个接口的实现

注意单链表的方向不能逆转 //接口声明 #define _CRT_SECURE_NO_WARNINGS 1 #define _CRT_SECURE_NO_WARNINGS 1 #ifndef Seqlist_H #define Seqlist_H #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;malloc.h&gt;...

yam_sunshine的博客 492

CTP接口入门

该文章主要讲什么 这篇文章的面向对象是有一些C++基础,并且想用C++来做程式化交易的同学。 这篇文章可以算是我的程式化学习笔记中的一篇。其中介绍了CTP的简单的使用方式,并且附上了一些代码以及我在试用的时候遇到的一些小坑。 什么是CTP CTP是上海期货推出的一套可供程序调用的交易接口。就好比官方给程序化交易提供了的一个专门的业务窗口。 接口相关文件下载 CTP接口可以在上期...

weizehua的专栏 4万+

链表操作接口

链表(Linked List)数据结构概览链表(Linked List)是线性表的一种(线性表包含顺序表与链表),通过指针将一系列位于不连续的内存空间中的元素连接起来,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理,但也失去了快速随机存取的优点,同时增大了内存开销(存储指针域)。 链表数据结构由一连串节点(Node)组成,每个节点包含数据域(Data Fields)和一或两个用来指向上一个/或下一个节点位置的指针域(Pointer Fields)。链表可以方便地...

weixin_41839388的博客 564

COMSOL仿真分析高压直流GIS/GIL绝缘性能优化

高压直流气体绝缘设备(GIS/GIL)的绝缘性能是保障电网可靠运行的关键。通过COMSOL Multiphysics多物理场仿真,可以深入分析气固界面电场分布与电荷积聚机理。该技术结合静电场、热场和电荷传输耦合计算,能准确模拟温度梯度对SF6气体与环氧树脂界面特性的影响。工程实践中,这类仿真可优化导体结构设计、改进绝缘材料配方,并建立电场-温度关联预警模型。特别是在80℃高温工况下,仿真显示界面电荷密度会显著增加23%,这对设备安全运行具有重要指导价值。

weixin_32075843的博客 194

ubuntu安装FSL

1.下载fslinstaller.py 官网下载地址:https://fsl.fmrib.ox.ac.uk/fsldownloads_registration 或者去我的百度网盘取: 链接:https://pan.baidu.com/s/1d5eHm48oamFdYdKm84nifw 提取码:6ff9 2.将base环境改成python2.0版本 本来想在服务器安装,服务器没有sudo权限,网上很多教程都装不了,于是就自己安装虚拟机再装了一个ubuntu,然后安装了python2环境,再开始装fsl,fsl

qq_36421001的博客 4098

链表函数 (接口实现)范例

头文件(函数接口,链表类型定义)typedef struct node* link; struct node { int item; link next; }; typedef link Node; void initNodes(int); void freeNode(link); link newNode(int); void insertNext(link,link); link d...

MACHINE_128的博客 413

sentinel——SLC数据下载、DEM数据下载拼接、精密轨道数据下载方法

Sentinel——SLC数据下载、DEM数据下载、精密轨道数据下载方法 SLC数据下载 网址:https://search.asf.alaska.edu DEM数据下载 1 手动下载 http://srtm.csi.cgiar.org/srtmdata/ 3.在SARscape中使用下载好的DEM 将下载好的DEM放在软件默认下载DEM路径下(默认路径是C:\Users<用户名&g...

u011322358的博客 2万+

双向链表常见接口实现

链表的八种分类 ,以及带头双向循环链表接口的实现

原来是猿的成长足迹 903

vhr 微人事系统安装与部署教程(SpringBoot + Vue 项目实战)

vhr(微人事)是一个开源的人力资源管理系统项目。系统采用前后端分离架构,主要技术栈包括:后端:MyBatis前端:VueElement UIAxios数据库:MySQL系统通常包含以下模块:员工管理部门管理职位管理薪资管理权限管理系统管理整体功能已经接近企业级后台系统。vhr(微人事)是一个非常经典的开源人力资源管理系统项目,基于SpringBoot + Vue 前后端分离架构。系统包含:员工管理部门管理权限管理薪资管理。

m0_69484557的博客 488

7.DJI-PSDK:psdk负载应用固件升级(基于RTOS)

在单片机应用程序开发阶段,我们可以借助keil5和J-LINK来直接下载应用程序进行开发和调试, 但在产品交付之后,我们对应用程序做了改动和升级,是断然不可能采用这种方式的,我们应该将新版本的程序固件打包发给客户, 能够方便用户通过DJI Assistant2选择更新负载设备的固件,导入本地固件程序包,更新负载设备。使用STM32F4 开发的负载设备从Flash 中直接读取固件文件并运行负载设备程序,因此开发者需先烧录Bootloader 再烧录应用固件,烧录Bootloader 的步骤不再赘述。

哒宰的博客 677

【数据结构】速速收藏,一文带你参透双向链表各接口实现

上节课中我们完整的实现了无头单向链表的各个功能接口,但是我们也注意到,由于单向链表只保存指向下一节点的指针,于是我们在进行前插等操作时,还需要遍历链表来找到前一个节点,效率不高且步骤繁琐。于是为了克服类似这样的问题,我们更多的会使用另一种数据结构,即带头双向循环链表,本文就将带领各位小伙伴们一起实现带头双向循环链表的各接口功能。

weixin_59392935的博客 5015

基于STM32+华为云设计的智慧农业灌溉系统(2023升级版)(158)

本项目设计一种基于STM32的智慧农业监测系统。该系统能够检测空气温度、湿度、光强度和土壤湿度等关键指标,并自动调节浇水量,实现作物生长环境的精细化管理。同时,本项目还支持本地LCD屏幕数据显示和通过ESP8266上传数据到华为云物联网平台,同时搭建流媒体服务器实现摄像头远程监控。最重要的是,本项目将利用Qt开发Android手机APP,使用户可以远程查看监测情况,了解农作物生成情况。

1万+

Golang 接口及使用接口实现链表插入

文章目录1. 接口定义 1. 接口定义 Interface 类型可以定义一组方法,不需要实现,并且不能包含任何的变量,称之为接口 接口不需要显示的实现,只需要一个变量,含有接口类型中的所有方法,那么这个变量就实现了这个接口,如果一个变量含有多个interface 类型的方法,那么这个变量就实现了多个接口 语法 type example interface{ Method1(参数列表)返回值列表 Method2(参数列表)返回值列表 ... } 示例 package main

不要因为走的太远而忘了为什么出发 821

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【数据结构初阶】链表分类与双向带头循环链表接口实现

1. 链表的分类 2. 双向带头循环链表接口实现 2. 1 结点声明 2. 2 创建链表节点 2. 3 初始化链表 2. 4 打印链表 2. 5 尾插 2. 6 判空 2. 7 尾删 2. 8 头插 2. 9 头删 2. 10 查找 2. 11 在指定位置删除与插入 2. 12 销毁 3. 链表接口测试 4. 单链表与双链表 5. 顺序表与链表

fhvyxyci的博客 2220

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

双链表接口的简单实现

双向链表相当于单链表来说,实现的几个接口无疑是比较简单的,在这一篇博客中,我将会整理一下关于双向链表的几个接口实现的过程,希望各位大佬多多指正。 1.首先创建一个带有双向链表的节点 代码如下 typedef int LTDataType; typedef struct ListNode { LTDataType _data; struct ListNode* _next; struct Li...

ChaserZHY的博客 327

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

初阶数据结构【双链表及其接口的实现】

前面我们介绍了数据结构中的链表,并实现了我们在实际中最常用的两个链表之一——无头单向非循环链表,这期我们继续来用C语言实现第二个常用链表——带头双向循环链表;26考研一战成硕!

吴先生的博客 1128

DS--链表的概念及单链表接口的实现及其应用

链表 概念:链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接此项实现的。 链表的结构类型可分为: 1,单链表,双向链表 2,不带头单链表,带头链表 3,单链表,循环单链表 链表的实现 一,单链表接口的实现 声明文件SList.h SList.h #ifndef _SLIST_H_ #define _SLIST_H_ #include<Window...

烟华的博客 463

数据结构——单链表接口实现(C语言)

单链表的接口实现一、链表的概念及结构1.1 概念1.2 结构二、链表的接口实现2.1 链表的存储三级目录 一、链表的概念及结构 1.1 概念 链表是一种物理结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2 结构 二、链表的接口实现 2.1 链表的存储 三级目录 ...

2599

Lava链表(双向链表---接口实现)

在Java中连标配的结点需要用类来封装,下面的简单的双向链表实现: class Node { private Object data; private Node next; public Node(Object data) { this.data = data; } public Object getData() { re...

sophia__yu的博客 292
上一篇: 约瑟夫环问题的解决
下一篇: 链式栈的接口实现
love1code
博客等级 码龄12年 19粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值