十字链表实现稀疏矩阵系列1-----插入元素

具体功能介绍:

        将一个已经申请好的结点插入到现有的十字链表中。传入的参数为一个结点的地址,和一个十字链表的地址。新的结点是已经申请好的,所以只需要找到具体的新节点的位置即可。

        这里插入主要分为两大部分,一个是行的插入、一个是列的插入。行列插入基本一致,所以这里介绍一下行的插入、列的插入自行理解。

        将一个结点插入新的十字链表的行头指针中,由于已经知道新节点的横坐标值,所以不需要循环,直接判断即可。插入的位置可以分为两种:

        1、在该行的第一个位置直接插入,满足条件为:头结点为空,或者是新节点的纵坐标要比该行的第一个结点值要小。

if (rowNode == NULL || rowNode -> col > newnode -> col) // 插在该行的第一个结点处 
		{
			newnode->right = rowNode;
			M.rhead[newnode->row] = newnode;
		}

2、不在该行的第一个位置插入,这里需要去找到正确的位置(循环不断往纵坐标大的位置靠),判断条件有两个,

第一个是如果发现当前节点的右指针已经是NULL,可以插入

第二个是当前节点的值比新节点的纵坐标要大了,可以插入

如果不满足,继续往右走

这里采用取反 可以理解为:满足插入条件(1)(2)取反

(1)、左边结点的纵坐标要比新结点纵坐标小,右边结点的纵坐标要比新节点的纵坐标大

(2)、左边结点的纵坐标要比新结点纵坐标小,右边结点的右指针已经为空(NULL)

else 
		{
            //寻找插的位置的前一个结点
			for (; !(rowNode->col < newnode->col && (rowNode->right == NULL||rowNode -> right -> col > newnode->col)); rowNode = rowNode->right);
			newnode->right = rowNode->right; //完成行插入 
			rowNode->right = newnode;
		}

列的插入判断条件一样,在这里就不具体介绍了。

具体代码如下:

/*                        7.  插入结点值                                        */

void InsertElem(OLink &newnode, CrossList &M){
    //将非零元素结点插入矩阵中
    OLink rowNode = M.rhead[newnode->row];
    //行的插入
    if (rowNode == NULL || rowNode -> col > newnode -> col) // 插在该行的第一个结点处 
		{
			newnode->right = rowNode;
			M.rhead[newnode->row] = newnode;
		}
	else 
		{
            //寻找插的位置的前一个结点
			for (; !(rowNode->col < newnode->col && (rowNode->right == NULL||rowNode -> right -> col > newnode->col)); rowNode = rowNode->right);
			newnode->right = rowNode->right; //完成行插入 
			rowNode->right = newnode;
		}

    //列的插入
    OLink colNode = M.chead[newnode -> col];
    if (colNode == NULL || colNode -> row > newnode -> row) // 插在该行的第一个结点处 
		{
			newnode->down = colNode;
			M.chead[newnode->col] = newnode;
		}
	else 
		{
            //寻找插的位置的前一个结点
			for (; !(colNode -> row < newnode->row && (colNode -> down == NULL || colNode -> down -> row > newnode->row)); colNode = colNode->down);
			newnode->down = colNode->down; //完成列插入 
			colNode->down = newnode;
		}
}

/*   ************************************************************************** */

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值