Упорядочение элемента массива с использованием Struct и указателей - PullRequest
0 голосов
/ 29 апреля 2020

Мне нужна твоя помощь по поводу моей домашней работы. Может ли кто-нибудь, пожалуйста, помогите мне завершить это. На самом деле реальный вопрос заключается в том, что

Создайте элемент структуры, который содержит одну строку с именем name длиной до 20 символов и указатель на другой элемент, который называется prev. Напишите основную функцию, которая создает массив списков, который может хранить до 10 элементов, и заполняет его в произвольном порядке, причем каждый добавленный элемент указывает на ранее добавленный элемент для пред. Затем распечатайте список в порядке ввода элементов

Например, если элементы были введены в порядке 9, 4, 2, 6, 3, 5, 0, 1, 7, 8, вывод должен быть

listitem[9].name
listitem[4].name
listitem[2].name
...

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

И мой код здесь, но он не работает.

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

typedef struct elem Elem;
struct elem
{
    char name[20];
    struct elem *prev;
    struct elem *next;
};

int main()
{
    int i,j;
    srand(time(0));
    int listelem[10];
    printf("The elements of the array:\n");
    for (i=0; i<10; i++)
    {
        listelem[i] = ( rand() % 10 )+1;
        printf("%d\n",listelem[i]);
    }
    Elem a = {listelem[0]};
    Elem b = {listelem[1],&a};
    Elem c = {listelem[2],&b,&d};
    Elem d = {listelem[3],&c,&e};
    Elem e = {listelem[4],&d,&f};
    Elem f = {listelem[5],&e,&g};
    Elem g = {listelem[6],&f,&h};
    Elem h = {listelem[7],&g,&x};
    Elem x = {listelem[8],&h,&y};
    Elem y = {listelem[9]};
    a.prev = NULL;
    b.prev = &a;
    c.prev = &b;
    d.prev = &c;
    e.prev = &d;
    f.prev = &e;
    g.prev = &f;
    h.prev = &g;
    x.prev = &h;
    y.prev = &x;
    Elem *q = &y;
    while(q->prev!=NULL) q=q->prev;
    do
    {
        printf("%s\n",q->name);
        q=q->next;
    }
    while(q!=NULL);
}

1 Ответ

0 голосов
/ 29 апреля 2020

Из вашего кода

    Elem a = {listelem[0]};
    Elem b = {listelem[1],&a};
    Elem c = {listelem[2],&b,&d};    /* (X) */
    Elem d = {listelem[3],&c,&e};    /* (Y) */

Обратите внимание, что d объявлено в строке (Y). Однако вы пытаетесь получить его адрес в строке (X), прежде чем он будет определен. Что является основной причиной ошибки.

Чтобы это исправить, просто не пытайтесь инициализировать при объявлении; объявите их все и используйте for l oop для присвоения им значений (или вручную).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...