zoukankan      html  css  js  c++  java
  • 线性表的两种存储方式解析.

    顺序存储:

    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

     
  • 相关阅读:
    聊聊用机器人做无人驾驶
    透过国外初创公司看高精度地图难题
    百度Apollo无人驾驶入门课程下载
    关于高精度地图定义的探讨
    camera理论基础和工作原理
    FPGA配置OV5640摄像头及RGB图像数据采集
    详细的摄像头模组工作原理!!!
    摄像头PIN脚功能作用
    详解摄像头各个引脚的作用关系
    Linux下UDP的组播接收和发送的简单例子
  • 原文地址:https://www.cnblogs.com/c-slmax/p/5202514.html
Copyright © 2011-2022 走看看