Сортированный список не распечатан как ожидалось (C) - PullRequest
0 голосов
/ 21 января 2019

Я попытался сделать более простой пример своей проблемы, надеюсь, код не выглядит слишком странно.Я пытаюсь составить отсортированный список.Если ввод для ex wrt, er, ff, fr, когда я пытаюсь напечатать список, он говорит fr fr fr fr, и я не могу понять, почему.

К сожалению, яне могу опубликовать исходный код, struct tit не имеет особого смысла в этом примере, но я не думаю, что это проблема.

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

typedef struct nodo *link;
typedef struct lista *TLIST;
typedef struct tit *TITOLO;

TLIST LISTinit();
link NEW(TITOLO val, link next);
void LISTinsert(TLIST l, TITOLO val);
void ListPrint(TLIST list);
TLIST caricaFile();

struct tit {
    char nome[20];
};

struct lista {
    link head;
    int n;
};

struct nodo {
    TITOLO val;
    link next;
};

int main() {
    TLIST lista;
    lista = caricaFile();
    ListPrint(lista);
    return 0;
}

TLIST LISTinit() {
    TLIST list = malloc(sizeof *list);
    list->head = NULL;
    list->n = 0;
    return list;
}

link NEW(TITOLO val, link next) {
    link x = malloc(sizeof *x);
    x->next = next;
    x->val = val;
    return x;
}

void LISTinsert(TLIST l, TITOLO val) {
    link x, p;
    l->n++;
    if (l->head == NULL || (strcmp(val->nome, l->head->val->nome) < 0)) {
        l->head = NEW(val, l->head);
        return;
    }
    for (x = l->head->next, p = l->head;
         x != NULL && (strcmp(val->nome, x->val->nome) > 0);
         p = x, x = x->next);
    p->next = NEW(val, x);
}

void ListPrint(TLIST list) {
    link x;
    for (x = list->head; x != NULL; x = x->next)
        printf("%s ", x->val->nome);
    printf("\n");
}

TLIST caricaFile() {
    TLIST list;
    list = LISTinit();
    TITOLO titolo = malloc(sizeof *titolo);
    int i;
    for (i = 0; i < 4; i++) {
        printf("Insert title: ");
        scanf("%s", titolo->nome);
        LISTinsert(list, titolo);
    }
    return list;
}

1 Ответ

0 голосов
/ 21 января 2019

in caricaFile вы сохраняете все прочитанные заголовки в одном и том же месте (titolo-> nome), поэтому окончательно запоминается только последнее, потому что вы все время сохраняете один и тот же указатель (titolo) в списке.

Вам нужно дублировать значение val при сохранении его в списке, а не просто вводить x->val = val; в NEW, например:

link NEW(TITOLO val, link next) {
  link x = malloc(sizeof *x);
  x->next = next;

  TITOLO copy = malloc(sizeof (struct tit));

  strcpy(copy->nome, val->nome);
  x->val = copy;
  return x;
}

Исполнение с новым определением NEW:

Insert title: aze
Insert title: qsd
Insert title: wxc
Insert title: iop
aze iop qsd wxc 

Это очень плохая идея, чтобы typedef был указателем типа TITOLO, потому что это вводило читателя в заблуждение, думая, что это значение, а не указатель

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