C - 将矩阵表示为链表

时间:2016-08-14 20:24:22

标签: c matrix linked-list

我有以下数据结构:

enter image description here

将矩阵表示为链表。

我需要在底部添加一个新的矩阵行,并用零初始化该列表的值。

问题:是否可以为每个节点使用带有两个链接的单一列表?这样,我们可以在底部添加一个带有水平指针(链接)的新列表。

但我不明白如何将垂直指针(链接)与下一个列表链接起来。

有人可以解释如何链接底部列表的垂直指针吗?

2 个答案:

答案 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添加行:

  1. 创建新元素newNode
  2. up pointer的{​​{1}}链接到newNode
  3. 将行添加到bottomLeft,将该行另存为bottomLeft->right的{​​{1}}。
  4. 将值设置为right pointer
  5. 返回newNode
  6. 示例:

    0