博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一步一步写算法(之单向链表)
阅读量:7240 次
发布时间:2019-06-29

本文共 2351 字,大约阅读时间需要 7 分钟。

【 声明:版权全部,欢迎转载,请勿用于商业用途。  联系信箱: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);}

【预告: 下一篇博客介绍双向链表】

你可能感兴趣的文章
关于权限系统的自定义标签
查看>>
函数相关内容
查看>>
Sublime Text3
查看>>
latex简历遇到的问题
查看>>
工作中不要为了用系统而用系统
查看>>
如何在HTML使用JavaScript
查看>>
apache代理服务器设置
查看>>
endnote下载的文献导入到Jabref
查看>>
java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory的解决(碰到问题,转载答案)...
查看>>
.NET之枚举
查看>>
关于四则运算表达式分析思路
查看>>
OC基础第三讲
查看>>
数据库发布订阅:发送邮件
查看>>
更改XML文件内容(发票管理软件)
查看>>
JVM 监控相关
查看>>
Mac下配置mnmp环境
查看>>
嘉兴婚庆业冷热不均 亟待一条龙服务
查看>>
转:Java中的StringTokenizer类的使用方法
查看>>
4、CommonChunkPlugin提取公共js-提取多个
查看>>
(八)Java 修饰符
查看>>