Orthogonal-List 十字链表(更新时间:2016-04-15)
在课上边听着哈希表,便看着科比告别直播,边写这个十字链表,23333,感觉好充实。
果然,在看完科比最后一场比赛神奇的演出之后,当天就不想好好学习了,就拖了一天。
十字链表
十字链表是一维链表的扩展,通过将以一个指针域扩展到两个指针域使得链表能够以二维的形式串联起来,我们可以形象的使用二维数组来描述十字链表(实际实现效果基本与二维数组无异)。
在定义结构的时候,Doge使用了union
来复合使用Data
域从而使得我们不需要重新定义新的行列头节点。
对于Insert()
以及Find()
这类的函数实现的时候所需要用到的遍历操作,Doge均采用先访问行,在访问列的方式直接去查找。
另外Delete()
的实现与Insert()
的实现基本没有差异,只是在搜索的时候返回的是前驱结点然后将其从十字链表中移除即可,Doge在这里就不给出了,留待读者自行编写。
十字链表的删除实质上等价于先将每一行(或者每一列,二选一即可)的链表进行删除,再将行列头数组删除即可,均使用free()
函数来释放空间。
十字链表最经典的应用就是用于计算稀疏矩阵,之后Doge会将自己做的矩阵运算整理后上传。
下面直接给出代码示例:
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode OList; //十字链表头指针定义
typedef PtrToNode OLNode; //十字链表节点定义
typedef int ElementType; //十字链表数据类型定义