我有以下数据结构:
将矩阵表示为链表。
我需要在底部添加一个新的矩阵行,并用零初始化该列表的值。
问题:是否可以为每个节点使用带有两个链接的单一列表?这样,我们可以在底部添加一个带有水平指针(链接)的新列表。
但我不明白如何将垂直指针(链接)与下一个列表链接起来。
有人可以解释如何链接底部列表的垂直指针吗?
答案 0 :(得分:2)
如果我理解了这个问题,那么它是可能的,你可以使用指向指针和正向链接迭代地这样做,这是一种在输入遍历顺序中构建链表的常用技术。
给定这样的节点结构:
struct Node
{
struct Node *up;
struct Node *right;
int value;
};
您可以在"矩阵"的底部挂一个一对一的匹配节点。 (意思是,你当前的底行有N个节点,添加的行同样有N个节点):
struct Node *addRow(struct Node *mat)
{
struct Node *res = NULL, **pp = &res;
for (; mat; mat = mat->right)
{
*pp = malloc(sizeof **pp);
(*pp)->value = 0;
(*pp)->up = mat;
pp = &(*pp)->right;
}
*pp = NULL;
return res;
}
这是通过在正在创建的列表中遍历指针指针来工作的,它总是使它指向将被设置为指向下一个新节点的指针。列表完成后,最后的right
指针必须设置为NULL才能终止右链表(*pp = NULL;
完成此操作)。
执行只是变成
mat = addRow(mat);
那就是它。
答案 1 :(得分:1)
使用递归:
要将行添加到NULL
(表示空表),请返回NULL
(空表)。
要向non-NULL
元素bottomLeft
添加行:
newNode
up pointer
的{{1}}链接到newNode
bottomLeft
,将该行另存为bottomLeft->right
的{{1}}。right pointer
newNode
示例:
0