一步一步写算法(检查表)

一步一步写算法(检查表)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

【 声明:版权所有所有。欢迎转载,不用于商业用途。  联系我们:feixiaoxing @163.com】

    有时。在数据存储是不连续。所以这一次,我们需要在数据结构添加属性,这个属性会记录以下一个数据的地址。有了这个地址之后,全部的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用。

    相比較普通的线性结构,链表结构的优势是什么呢?我们能够总结一下:

    (1)单个节点创建很方便,普通的线性内存通常在创建的时候就须要设定数据的大小

    (2)节点的删除很方便,不须要像线性结构那样移动剩下的数据

    (3)节点的訪问方便,能够通过循环或者递归的方法訪问到随意数据。可是平均的訪问效率低于线性表

    那么在实际应用中,链表是怎么设计的呢?我们能够以int数据类型作为基础,设计一个简单的int链表:

    (1)设计链表的数据结构

typedef struct _LINK_NODE
{
    int data;
	struct _LINK_NODE* next;
}LINK_NODE;

    
(2)创建链表

LINK_NODE* alloca_node(int value)
{
    LINK_NODE* pLinkNode = NULL;
	pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE));
	
	pLinkNode->data = value;
	pLinkNode->next = NULL;
	return pLinkNode;
}

    (3)删除链表

void delete_node(LINK_NODE** pNode)
{
    LINK_NODE** pNext;
    if(NULL == pNode || NULL == *pNode)
	    return ;
		
	pNext = &(*pNode)->next;
	free(*pNode);
	delete_node(pNext);	
}

    
(4)链表插入数据

STATUS _add_data(LINK_NODE** pNode, LINK_NODE* pDataNode)
{
    if(NULL == *pNode){
	    *pNode = pDataNode;
		return TRUE;
	}
	
	return _add_data(&(*pNode)->next, pDataNode);
}

STATUS add_data(const LINK_NODE** pNode, int value)
{
    LINK_NODE* pDataNode;
    if(NULL == *pNode)
	    return FALSE;
		
	pDataNode = alloca_node(value);
	assert(NULL != pDataNode);
	return _add_data((LINK_NODE**)pNode, pDataNode);
}

    
(5)删除数据

STATUS _delete_data(LINK_NODE** pNode, int value)
{
    LINK_NODE* pLinkNode;
    if(NULL == (*pNode)->next)
	    return FALSE;
	
	pLinkNode = (*pNode)->next;
	if(value == pLinkNode->data){
	    (*pNode)->next = pLinkNode->next;
		free(pLinkNode);
		return TRUE;
	}else{
	    return _delete_data(&(*pNode)->next, value);
	}
}

STATUS delete_data(LINK_NODE** pNode, int value)
{
    LINK_NODE* pLinkNode;
    if(NULL == pNode || NULL == *pNode)
	    return FALSE;

    if(value == (*pNode)->data){
	    pLinkNode = *pNode;
		*pNode = pLinkNode->next;
		free(pLinkNode);
		return TRUE;
	}		
	
	return _delete_data(pNode, value);
}

    
(6)查找数据

LINK_NODE* find_data(const LINK_NODE* pLinkNode, int value)
{
    if(NULL == pLinkNode)
	    return NULL;
	
	if(value == pLinkNode->data)
	    return (LINK_NODE*)pLinkNode;
	
	return find_data(pLinkNode->next, value);
}

    
(7)打印数据

void print_node(const LINK_NODE* pLinkNode)
{
    if(pLinkNode){
	    printf("%d\n", pLinkNode->data);
		print_node(pLinkNode->next);
	}
}

  
 
(8)统计数据

int count_node(const LINK_NODE* pLinkNode)
{
    if(NULL == pLinkNode)
	    return 0;
		
	return 1 + count_node(pLinkNode->next);
}

【拖车: 下一步博客介绍双向链表】

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117813.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 时间序列数据库概览

    时间序列数据库概览

    2021年11月26日
    51
  • python中cPickle用法「建议收藏」

    python中cPickle用法「建议收藏」在python中,一般可以使用pickle类来进行python对象的序列化,而cPickle提供了一个更快速简单的接口,如python文档所说的:“cPickle–Afasterpickle”。cPickle可以对任意一种类型的python对象进行序列化操作,比如list,dict,甚至是一个类的对象等。而所谓的序列化,我的粗浅的理解就是为了能够完整的保存并能够完全可逆的恢复。在cPi…

    2022年6月29日
    24
  • 函数WSAStartup[通俗易懂]

    函数WSAStartup一、WSAStartup函数               intWSAStartup                      (                         WORDwVersionRequested,                         LPWSADATAlpWSAData                      

    2022年4月7日
    118
  • 使用SecureCRT连接AWS的EC2(Linux系统)亲测可行「建议收藏」

    使用SecureCRT连接AWS的EC2(Linux系统)亲测可行

    2022年2月15日
    40
  • php 虚拟ip 刷流量,浅析网站刷流量的利与弊「建议收藏」

    php 虚拟ip 刷流量,浅析网站刷流量的利与弊「建议收藏」估计不少站长都有过刷网站流量的经历,一般发生在网站刚刚上线的时候。网站刚上线时,流量来自哪里?搜索引擎肯定甚少,而推广也应该刚刚开始,推广带来的IP想必也并不乐观。每天登陆站长统计,都是看到寥寥的几十个IP,站长有可能会产生更多的想法。而刷网站IP,尤为常见。刷网站流量有几个常用的方法:1、通过js刷网站流量。这个方法是最初级的刷网页流量的方法,它只能够刷网页PV,而不能刷网站IP,因此几乎没有人…

    2022年9月29日
    3
  • mac下配置android开发环境

    1.安装java环境oracle官网下载java就可以,链接http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=ocomen我下载的是java72.安装adt-bundle形式的android开发环境由于google现在极力推广他的android studio,官网貌似已经把eclips

    2022年3月11日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号