线性表的两种存储方式解析.

顺序存储:

typedef struct _tag_LinkNode
{
	int length;
	int capacity;
	void **node;
}Link;

用以上结构体表达,length表示线性表目前有多少元素,capacity表示整个线性表的容量(创建之时已固定)

而这个node,最不容易理解,可以抽象为一个指针数组.每个元素都指向一个业务节点的内存地址,在创建之时必须与capacity动态绑定,代表可以容纳多少个业务节点.

在封装内部方法时,核心思想是业务层将业务节点转换成void *传递进来.保存在**node数组指针中,(unsigned int)类型也可以保存指针值.

内部再提供一个方法,将数组指针的某一个指针返回给业务层,业务层再根据实际情况进行指针转换,拿到数据进行操作.

链式存储:

typedef struct _tag_LinkListNode  //h头文件
{
	struct _tag_LinkListNode* next;
}LinkListNode;

typedef struct _tag_LinkList    //内部封装
{
	//这个句柄里面,需要保存所有节点信息。需要有一个起始点
	//就是带头节点的链表。。。
	LinkListNode header;
	int length;
}TLinkList;

typedef struct Teacher    //上层业务
{
	LinkListNode node;
	char name[64];
	int age;
}Teacher;

如代码所示,头文件定义的这个节点,是所有实现的核心,内部封装需要包含它,业务节点也需要包含它,但均要将其放在第一个域中,

用图来表示

-------
TLinklist其实就是左边最大的那个,与我以前所学习的不一样.以前学习的只是定义一个节点,将指针域放在其中,而这里,定义的是一个链表,不包含业务数据,将业务数据与链表算法分离开来,实现低耦合,其技术的精华之处在以下代码
 ------
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
	int i = 0;

	TLinkList *tList  = NULL;
	LinkListNode *current = NULL;

	tList = (TLinkList *)list;
	//准备环境让辅助指针变量 指向链表头节点
	current = &tList->header;
	for (i=0; i<pos &&(current->next!=NULL); i++)
	{
		current = current->next;
	}

	//让node节点链接后续链表
	node->next = current->next ;
	//让前边的链表。链接node
	current->next = node;
	tList->length ++;
	return 0;
}

在17行的node->next = current->next ,这个node就是业务层传递进来的业务节点,将其转换成了LinkListNode,

关键来了,在业务节点里,node在第一个域,以前学习过->,.其实就是寻址操作(然后自动加*号取值)

而使用第一个域node,对于业务节点,只偏移了四个字节,前面说过,node就

是业务层传递进来的业务节点,虽然类型发生了变化,但里面的内容没变,偏移的四个字节刚好只是访问了业务节点中的node域,进而实现的业务节点的串连

17行的这个node就是间接地操作业务节点中的node

 
时间: 2024-10-10 08:50:27

线性表的两种存储方式解析.的相关文章

SVN的两种存储方式FSFS和BDB比较【转】

版本库数据存储 在Subversion1.2中,版本库中存储数据有两种方式.一种是在Berkeley DB数据库中存储数据:另一种是使用普通的文件,使用自定义格式.因为Subversion的开发者称版本库为(版本化的)文件系统,他们接受了称后一种存储方式为FSFS[14]的习惯,也就是说,使用本地操作系统文件系统来存储数据的版本化文件的系统. 建 立一个版本库时,管理员必须决定使用Berkeley DB还是FSFS.它们各有优缺点,我们将详细描述.这两个中并没有一个是更正式的,访问版本库的程序与

SVN中两种存储方式的比较(BDB vs. FSFS)

Subversion 的版本库(repository),就是位于服务器端,统一管理和储存数据的地方.本文中,我们以 Linux 为例,介绍在服务器端配置和管理 Subversion 版本库的基本方法. 要创建一个版本库,首先要确定采用哪种数据存储方式.在 Subversion 中,版本库的数据存储有两种方式,一种是在 Berkeley DB 数据库中存放数据:另一种是使用普通文件,采用自定义的格式来储存,称为 FSFS. 两种存放方式各有优缺点,读者可以参考 http://svnbook.org

oracle_外部表的两种实现方式oracle_loader[datapump]

外部表可以实现,通过数据库对象直接访问目录文件里的格式数据,加载方式分为两种oracle_loader和oracle_datapump,oracle_loader方式通过sqlldr引擎方式加载,访问flat格式文件:oracle_datapump通过datapump接口来加载,访问通过oracle_datapump方式卸载的dmp文件: ------oracle_loader ----自定义两个格式文件内容如下: ====a.dat==== 360,Jane,Janus,ST_CLERK,12

html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage。

sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁.因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储. 而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的

线性表的2种实现方式:数组和链表

数组实现方式: 1 #ifndef LINEARLIST_H 2 #define LINEARLIST_H 3 #include<iostream> 4 #include<cstdlib> 5 #include<new> 6 using std::cout; 7 using std::endl; 8 template<class T> 9 class LinearList 10 { 11 public: 12 LinearList(int MaxListSi

前端提交表单两种验证方式记录 jq或h5 required属性

JQuery: <form id="form"> <input type="text" name="aaa"> <select name="bbb"> <option value="">请选择</option> <option value="1">选项1</option> <option value

线性表的两种形式的定义与相关操作(单链表和顺序表)

#include <stdio.h> #include <string.h> #include <malloc.h> #pragma warning(disable:4996) #define ERROR 0 #define OK 1 #define MAXSIZE 100 typedef int ElemType; typedef int Status; typedef struct LNode; typedef struct { ElemType *elem; in

MySQL 的两种存储引擎

MyISAM 是MySQL的默认数据库引擎(5.5以后默认是InnoDB)性能极佳,但不支持事务处理. InnoDB 是MySQL的数据库常用的数据引擎. MyISAM 和 InnoDB 两者之间有明显的区别,简单梳理一下: 事务 m:每次查询具有原子性,执行速度比i快但是不支持事务操作. i:提供事务.回滚.崩溃修复能力的事务安全(ACID)型数据引擎 存储 m:每个m表在磁盘上存储成三个文件.分别是表定义文件(表名xx.frm).数据文件(表名xx.MYD).索引文件(表名xxx.MYI).

Unity3d Android SDK接入解析(二)Unity3d Android SDK的设计与两种接入方式

一.前言 上篇说清楚了Unity和Android调用的方式,但很多实际接入的部分没有讲的很详细,因为重头在这篇,会详细讲述具体接入Android SDK的方式,和怎么去做一个方便Unity接入的SDK. 传送门: 前篇:Unity3d 与 Android之间的互相调用 http://blog.csdn.net/yang8456211/article/details/51331358 后篇:Unity3d Android SDK接入解析(三)接入Android Library的理解 http://