Представить матрицу в табличной форме C Программирование - PullRequest
0 голосов
/ 20 мая 2018

В настоящее время я пытаюсь использовать связанный узел для представления матрицы.Мои коды работают нормально, хотя я не уверен, что можно представить мою матрицу в виде таблицы вместо (x, y) = значение Я хочу представить ее как (состоит из нулевого элемента и ненулевогоelements.)

1   2   3
0   5   0
7   8   9

Ниже приведены мои коды со связанным узлом в матрице, моя программа будет считывать строки, столбцы и значения от пользователя и распечатывать их.

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

typedef struct node
{
    int column;
    int value;
    int row;
    struct node *next;
} element;

void Init(element *x[])
{
    int i;
    for (i = 0; i < 3; i++) x[i] = NULL;
}

void Insert(element *x[], int row, int column, int value)
{
    int r = row;
    element *p;

    element *new = malloc(sizeof(element));
    new->row = row;
    new->column = column;
    new->value = value;

    if (x[r] == NULL)
    {
        x[r] = new;
        new->next = NULL;
    }
    else
    {
        p = x[r];
        if (new->column < p->column)
        {
            new->next = p;
            x[r] = new;
        }
        else if (new->column > p->column)
        {
            while (p->next != NULL && p->next->column < new->column)
            {
                p = p->next;
            }
            new->next = p->next;
            p->next = new;
        }
        else printf("An element already exists there!!\n");
    }
}

void Printout(element *x[])
{
    int i, test = 0;
    element *temp;

    for (i = 0; i < 3; i++)
    {
        temp = x[i];
        while (temp != NULL)
        {
            printf("Element position (%d,%d) = %d\n", i, temp->column, temp->value);
            test = 1;
            temp = temp->next;
        }
    }
    if (test == 0) printf("This matrix is empty!!\n");
}

int main(int argc, const char * argv[])
{
    int choice, column, row, value, number;
    element *a[3], *b[3], *sum[3];
    Init(a);    Init(b);    Init(sum);
    do
    {
        printf("\n***\tADDING SPARSE MATRICES\t***\n");
        printf("\n 1.) Insert in A");
        printf("\n 2.) Insert in B");
        printf("\n 3.) Printout both");
        printf("\n 0.) EXIT");
        printf("\nChoose ---------> ");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:     /*Insert in A */
            do
            {
                printf("Enter row -> ");
                scanf("%d", &row);
            } while (row < 0 || row > 3);

            do
            {
                printf("Enter column -> ");
                scanf("%d", &column);
            } while (column < 0);

            printf("Enter value -> ");
            scanf("%d", &value);

            Insert(a, row, column, value);

            break;
        case 2:     /*Insert in B */
            do
            {
                printf("Enter row -> ");
                scanf("%d", &row);
            } while (row < 0 || row > 2);

            do
            {
                printf("Enter column -> ");
                scanf("%d", &column);
            } while (column < 0);

            printf("Enter value -> ");
            scanf("%d", &value);

            Insert(b, row, column, value);

            break;
        case 3:     /* Printout A & B */
            printf("\n::::::: MATRIX A :> \n\n");
            Printout(a);
            printf("\n::::::: MATRIX B :> \n\n");
            Printout(b);
            break;

        default:
            printf("\nWRONG CHOICE");
        }
    } while (choice != 0);

    return 0;
}

Мне нужен кто-то, чтобы просветить меня.

1 Ответ

0 голосов
/ 20 мая 2018

Во-первых, код должен вычислить width матрицы.Это можно сделать путем сканирования всех элементов, чтобы найти элемент с наибольшим значением column.Матрица width является наибольшей column плюс единица.

Затем, чтобы напечатать каждую строку в матрице, печатайте нули до тех пор, пока не будет достигнут правильный column.Затем напечатайте значение в элементе и перейдите к следующему элементу.Когда все элементы будут напечатаны, выведите дополнительные нули, пока не будет достигнут width.

void Printout(element *x[])
{
    // find the width of the matrix
    int width = -1;
    for (int row = 0; row < 3; row++)
    {
        for (element *node = x[row]; node != NULL; node = node->next)
            if (node->column > width)
                width = node->column;
    }
    width++;  // width is max column plus one

    // print each row of the matrix
    for (int row = 0; row < 3; row++)
    {
        int col = 0;
        for (element *node = x[row]; node != NULL; node = node->next)
        {
            for (; col < node->column; col++) // print zeros until the column is reached
                printf("0  ");
            printf("%d  ", node->value);      // print the value for the current element
            col = node->column + 1;
        }
        for (; col < width; col++)            // print zeros until the width is reached
            printf("0  ");
        printf("\n");
    }
}
...