我想显示只出现一次的矩阵元素

I want to show elements of a matrix that appear only once

我明白了,但我似乎无法让它发挥作用,尝试了我能想到的一切。

#include <stdio.h>
#include <stdlib.h>

void alocare_vector(int *v, int nr, int elem)
{
    int *v1;
    if ((v1 = realloc(v, nr * sizeof(int))) == NULL)
    {
        printf("Memorie insuficienta");
        free(v);
        exit(EXIT_FAILURE);
    }
    v = v1;
    v[nr - 1] = elem;
}
int main()
{
    int a[100][100];
    int n, *v = NULL, i, j, k, l, ok = 0, nr = 0;
    printf("Number de elements n:");
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            scanf("%d", &a[i][j]);
    for (k = 0; k < n; k++)
    {
        for (l = 0; l < n; l++)
        {
            for (i = 0; i < n; i++)
                for (j = 0; j < n; j++)
                    if (a[k][l] == a[i][j] && (k != i && l != j))
                        ok = 1;
            if (ok == 0)
            {
                nr++;
                alocare_vector(v, nr, a[k][l]);
            }
            ok = 0;
        }
    }
    if (nr > 0)
    {
        printf("Elements:");
        for (i = 0; i < nr; i++)
        {
            printf("%d ", v[i]);
        }
    }
    free(v);

}

基本上,我需要创建一个矩阵,然后使用具有动态内存分配的数组打印只出现一次的元素。

调用您的函数时,您会传递指针的副本。因此,对指针的这个本地副本的任何修改都不会影响 main 中的副本。因此,您需要一个指向 main 中指针的引用或指针。

void alocare_vector(int **v, int nr, int elem)
{
    ...
    *v = v1;
}

这里有如何生成二维数组的不同元素数组的强力示例:

typedef struct
{
    size_t length;
    int data[];
}data_t;


data_t *add_element(data_t *arr, int element)
{
    size_t newsize = arr ? arr -> length : 0;
    arr = realloc(arr, newsize * sizeof(arr -> data[0]) + sizeof(*arr));
    
    if(arr)
    {
        arr -> length = newsize;
        arr -> data[newsize - 1] = element;
    }
    return arr;
}

int isPresent(size_t rows, size_t cols, size_t vrow, size_t vcol, int (*array)[cols])
{
    int val = array[vrow][vcol];
    for(size_t row = 0; row < rows; row++)
        for(size_t col = 0; col < cols; col++)
        {
            if(vcol == col && vrow == row) continue;
            if(array[row][col] == val)
            {
                return 1;               
            }
        }
    return 0;
}

data_t *distinctElements(size_t rows, size_t cols, int (*array)[cols])
{
    data_t *dist = NULL;
    for(size_t row = 0; row < rows; row++)
    {
        for(size_t col = 0; col < cols; col++)
        {
            if(!isPresent(rows, cols, row, col, array))
            {
                data_t *tmp = add_element(dist, array[row][col]);
                if(tmp) dist = tmp;
                else { /* error handling */}
            }
        }
    }
    return dist;
}

一个简单的修复方法是将“int * v”声明为全局变量并将函数修改为

alocare_vector(int nr, int elem)

现在使用散列 table 你可以将数字存储在数组中,下面是你的实现只是稍微修改一下。

#include <stdio.h>
#include <stdlib.h>

int hash[1000]={0};
int * v=NULL;

void alocare_vector(int nr, int elem)
{
    int *v1;
    if ((v1 = (int*)realloc(v, nr * sizeof(int))) == NULL)
    {
        printf("Memorie insuficienta");
        free(v);
        exit(EXIT_FAILURE);
    }
    v = v1;
    v[nr - 1] = elem;
}
int main()
{
int a[100][100];
int n, i, j, nr = 0;
printf("Number de elements n:");
scanf("%d", &n);
for (i = 0; i < n; i++)
    {
    for (j = 0; j < n; j++)
        {
            scanf("%d", &a[i][j]);
            ++hash[a[i][j]];
        }
    }   

for (i = 0; i < n; i++)
    {
    for (j = 0; j < n; j++)           
        {
                if(hash[a[i][j]]==1) 
                {
                    nr++;
                    alocare_vector(nr, a[i][j]);
                }
        }
    }
    if (nr > 0)
    {
        printf("Elements:");
        for (i = 0; i < nr; i++)
        {
            printf("%d ", v[i]);
        }
    }
    free(v);
}