如何在C

时间:2016-02-11 03:14:26

标签: c matrix linked-list dynamic-memory-allocation

在这个问题中,我会使用部分代码。所以你看我想解释的是什么。 我有这种结构,它有矩阵信息和位置。

typedef struct mylist {
    struct mylist *link;
    int **info;
    int **position;
}Node;

稍后,我创建了链接列表(这部分代码在循环中),其变量为“matDim”(让我们假设在每个循环中变量是一个随机整数,循环重复100次)。

for(x = 0; x<100;x++){
    srand(time(NULL));
    int matDim = rand();
    matrixA -> link = (Node*) malloc (sizeof (Node));
    matrixA = matrixA -> link;
    matrixA -> info = malloc(sizeof(int*)*(matDim));
    matrixA -> position = malloc(sizeof(int*)*(matDim);
    for(matCount = 0; matCount < (matDim); matCount++){
        matrixA -> info[matCount] = malloc(sizeof(int)*(matDim));
        matrixA -> position[matCount] = malloc(sizeof(int)*(matDim));

    }
 }

在此循环之前我也创建了

 Node *matrixA = (Node*) malloc (sizeof (Node));
matrixA -> info = malloc(sizeof(int*)*(matDim));
matrixA -> position = malloc(sizeof(int*)*(matDim));
for(matCount = 0; matCount < (matDim); matCount++){
    matrixA -> info[matCount] = malloc(sizeof(int)*(matDim));
    matrixA -> position[matCount] = malloc(sizeof(int)*(matDim));
    }
matrixA -> link = NULL;
Node *matrixB = matrixA;

我的问题是,如果您知道矩阵A的大小,那么如何在链接列表中释放已分配的内存?信息和矩阵 - &gt;每个循环中的位置都在变化(没有特定的模式)。根据我的理解,你必须释放每个矩阵A - &gt; info [x] [y]和matrixA - &gt;位置[x] [y]分别在每个节点中。

我想在结构中包含一个数组[100],以便存储大小,因为矩阵是正方形。但是,我在想是否有办法让程序找出矩阵的大小并释放矩阵的每个变量。

这是两个矩阵 - &gt;信息的示例(我只是将一些随机输入放入内存并在终端中像矩阵一样打印出来)

enter image description here

2 个答案:

答案 0 :(得分:0)

当您在节点中分配大小不同的矩阵时,您必须存储此大小 有了这个,你就可以循环你的节点来解除分配你矩阵的每个单元格 根据您的代码,我认为您可以在节点结构中使用一个int,这样您就可以完成所有free

答案 1 :(得分:0)

您可以在节点结构中添加matdim元素,以便记住matDim

的值

这是调整后的代码。我已经编译但没有测试它[请原谅无偿的样式清理]:

#include <malloc.h>
#include <time.h>
#include <stdlib.h>

typedef struct mylist {
    struct mylist *link;
    int matdim;
    int **info;
    int **position;
} Node;

int
main(void)
{
    Node *matrixA;
    int matDim;
    int matCount;
    int x;

    srand(time(NULL));
    matDim = rand();

    matrixA = malloc(sizeof(Node));
    matrixA->info = malloc(sizeof(int *) * matDim);
    matrixA->position = malloc(sizeof(int *) * matDim);

    // NOTE: now node can remember its dimensions
    matrixA->matdim = matDim;

    for (matCount = 0; matCount < matDim; matCount++) {
        matrixA->info[matCount] = malloc(sizeof(int) * matDim);
        matrixA->position[matCount] = malloc(sizeof(int) * matDim);
    }

    matrixA->link = NULL;
    Node *matrixB = matrixA;

    for (x = 0; x < 100; x++) {
        matDim = rand();

        matrixA->link = malloc(sizeof(Node));
        matrixA = matrixA->link;

        // NOTE: now node can remember its dimensions
        matrixA->matdim = matDim;

        matrixA->info = malloc(sizeof(int *) * matDim);
        matrixA->position = malloc(sizeof(int *) * matDim);

        for (matCount = 0; matCount < matDim; matCount++) {
            matrixA->info[matCount] = malloc(sizeof(int) * matDim);
            matrixA->position[matCount] = malloc(sizeof(int) * matDim);
        }
    }

    return 0;
}

另外,我认为可能还有一两个错误(一个多余的malloc或两个?)。我注意到infoposition总是&#34;并行&#34;。每当我看到这一点,我就开始思考&#34;新的结构&#34;,所以我记住了这一点。它可能[或可能不]满足您的需求:

#include <malloc.h>
#include <time.h>
#include <stdlib.h>

typedef struct _info {
    int info;
    int position;
} Info;

typedef struct mylist {
    struct mylist *link;
    int matdim;
    Info **xinfo;
} Node;

int
main(void)
{
    Node *matrixA;
    int matDim;
    int matCount;
    int x;

    srand(time(NULL));
    matDim = rand();

    matrixA = malloc(sizeof(Node));
    matrixA->xinfo = malloc(sizeof(Info *) * matDim);

    // NOTE: now node can remember its dimensions
    matrixA->matdim = matDim;

    for (matCount = 0; matCount < matDim; matCount++)
        matrixA->xinfo[matCount] = malloc(sizeof(Info) * matDim);

    matrixA->link = NULL;
    Node *matrixB = matrixA;

    for (x = 0; x < 100; x++) {
        matDim = rand();

        matrixA->link = malloc(sizeof(Node));
        matrixA = matrixA->link;

        // NOTE: now node can remember its dimensions
        matrixA->matdim = matDim;

        matrixA->xinfo = malloc(sizeof(Info *) * matDim);

        for (matCount = 0; matCount < matDim; matCount++)
            matrixA->xinfo[matCount] = malloc(sizeof(Info) * matDim);
    }

    return 0;
}