具体功能介绍:
将一个已经申请好的结点插入到现有的十字链表中。传入的参数为一个结点的地址,和一个十字链表的地址。新的结点是已经申请好的,所以只需要找到具体的新节点的位置即可。
这里插入主要分为两大部分,一个是行的插入、一个是列的插入。行列插入基本一致,所以这里介绍一下行的插入、列的插入自行理解。
将一个结点插入新的十字链表的行头指针中,由于已经知道新节点的横坐标值,所以不需要循环,直接判断即可。插入的位置可以分为两种:
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;
}
}
/* ************************************************************************** */