数据结构(六)——数组

本文探讨数组在数据结构中的应用,包括顺序结构和链式结构的分类,以及静态和动态存储的区别。特别关注多维数组的存储方式,如按行优先和按列优先,以及矩阵的压缩存储,尤其是稀疏矩阵的三元组表和十字链表存储方法。文中还介绍了十字链表的结构设计和相关操作函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组(array),在c语言里是最早接触到的数据结构。但是如果作为数据结构这门课来学,在c中学到的关于它的知识,还不足够。

数组的分类:
按物理结构来看,数组分为顺序结构和链式结构。
在顺序结构里,即便是多维数组(矩阵,Matrix),它还是按一维的形式存放在一组连续的存储空间里(别无他选)。一般有两种实现方法:按行顺序存储,称为以行为主(Row Major Order)。c、PASCAL等都采用这种方式。
按列顺序存储,称为以列为主(Column Major Order),FORTRAN使用这种结构。

数组还分为静态存储和动态存储。
静态的就是,int array[10] = {……};这种。
动态存储的是,int * array = new int[10];这一种。动态存储的区别就在于,是实例化后,才分配空间的,是动态地建立和撤销。

矩阵的存储:
矩阵的存储,可以是像每个元素都有独立的空间,还有一种就是压缩存储。即是对为多个值相同的元素,只分配一个存储空间,对零元素不分配空间。这是压缩存储的定义,也是我们在设计程序的效果体现。
如果值相同的元素或者零元素,在矩阵中的分布有一定额规律,即称为特殊矩阵反之为稀疏矩阵(Sparse Matrix )。
对称矩阵、三角矩阵、三对角矩阵都算是特殊矩阵。设计他们的压缩存储,其实思路不难。
稀疏矩阵的压缩存储,有三元组表,和链式结构的十字链表(Orthogonal List)。三元组表,即是(x坐标,y坐标,val值),只有有数值的才存储,0元素就不存储。这种方法在进行转置运算等非零个数在运算中保持不变时,有效。
但是在做加减等运算时,非零元素位置会变化,不适合三元组表。一般采用十字链表结构。不过,好像正统的定义是,每一行每一列都做一个链表,m行n列则需要m x n个链表了。而且每一个结点是由5个域组成:行域(row)、列域(column)、值域(val)、向下域(down)、向右域(right)。每个域都要有相应的值。
我在设计的时候,没认真看,以为总共row一个链表,column一个链表。就只有两个。

以下程序就算是半成品的十字链表吧:

结点的结构体类型和整个十字链表的结构体类型

typedef struct Olnode{
	int row,column;
	elementype val;
	struct Olnode * right;
	struct Olnode *down;
}Olnode ,*Olchain;

typedef struct Crosschain{
	int rownum,colnum;
	struct Olink *rowhead, * colhead;
}Crosschain;

各个函数:

void  insertNodeColumn(Olchain colhead,elementype val,int column); 
void  insertNodeRow(Olchain rowhead,elementype val,int row); 
void insertCrossChain(Crosschain * CrossChain,elementype val,int row,int column);

void printNode(Crosschain * CrossChain);
void printColumn(Olchain colhead);
void printRow(Olchain rowhead);


void deleteNode(Crosschain * CrossChain,elementype val);
void deleteNodeColumn(Olchain colhead,elementype val);
void deleteNodeRow(Olchain rowhead,elementype val);

void destroyChain(Crosschain * CrossChain);
void destroyColumn(Olchain colhead); 
void destroyRow(Olchain rowhead);

插入函数:

void insertCrossChain(Crosschain * CrossChain,elementype val,int row,int column)
{
	insertNodeColumn(CrossChain->colhead,val,column);
	insertNodeRow(CrossChain->rowhead,val,row);
	printf("insert the  CrossChain is succeed\n");
	
} 


void  insertNodeColumn(Olchain colhead,elementype val,int column)
{
	Olchain NodetoColumn = (Olnode *)malloc(sizeof(Olnode));
	NodetoColumn->val = val;
	NodetoColumn->column = column;
	NodetoColumn->right = NULL;
	
	Olchain TempNode = colhead;
	
	while(TempNode->right != NULL){
		if((TempNode->column < column) &&((TempNode->right->column > column)|(TempNode
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值