C-矩阵作为链表的表示

C-矩阵作为链表的表示,c,matrix,linked-list,C,Matrix,Linked List,我有以下数据结构: 将矩阵表示为链表的 我需要在底部添加一个新的矩阵行,并用零初始化该列表的值 问题:是否可以为每个节点使用带有两个链接的单独列表?这样,我们可以在底部添加一个带有水平指针(链接)的新列表 但我不明白如何将垂直指针(链接)链接到下一个列表 有人能解释一下如何链接底部列表的垂直指针吗?使用递归: 要将行添加到NULL(表示空表),请返回NULL(空表) 要将行添加到非空元素左下角: 创建新元素newNode 将newNode的向上指针链接到bottomLeft 将行追加到bott

我有以下数据结构:

将矩阵表示为链表的

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

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

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

有人能解释一下如何链接底部列表的垂直指针吗?

使用递归:

要将行添加到
NULL
(表示空表),请返回
NULL
(空表)

要将行添加到
非空
元素
左下角

  • 创建新元素
    newNode
  • newNode的
    向上指针链接到
    bottomLeft
  • 将行追加到
    bottomLeft->right
    将该行另存为
    newNode
    右指针
  • 将值设置为
    0
  • 返回
    newNode
  • 例如:

    struct Node;
    
    struct Node {
        struct Node *up;
        struct Node *right;
        int value;
    };
    
    struct Node *addRow(struct Node *bottomLeft) {
        if(bottomLeft == NULL) {
            return NULL;
        } else {
            struct Node* newNode = malloc(sizeof(struct Node));
            newNode->value = 0;
            newNode->up = bottomLeft;
            newNode->right = addRow(bottomLeft->right);
            return newNode;
        }
    }
    

    如果我理解了这个问题,那么是的,这是可能的,您可以使用指针到指针和前向链接迭代地这样做,这是一种按照输入遍历顺序构建链表的常用技术

    给定如下节点结构:

    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;
    }
    
    这是通过在创建的列表中遍历指向指针的指针来实现的,始终让它在下一个新节点中寻址将被设置为指向的指针。列表完成后,最后一个
    指针必须设置为NULL以终止右链列表(
    *pp=NULL;
    完成此操作)

    执行变得简单

    mat = addRow(mat);
    

    就这样

    这个图表绝对不是一个数组。我想你可以把它描述为2D链表。为什么2D链表是矩阵的好数据结构呢?@Oliver Charlesworth你说这种数据结构可以描述为2D链表,但这不意味着它可以展平吗?这似乎不能被展平。这对于sparese矩阵可能是有意义的,也就是说,只有很少的非零项。不过,这需要更多的信息。如图所示,这似乎没有什么意义。但由于你没有告诉我们你想要什么,我们无法进一步帮助你,你的问题也不清楚。