排序列表未按预期打印(C)

时间:2019-01-20 21:48:23

标签: c

我试图为我的问题做一个简单的例子,我希望代码看起来不会太怪异。我正在尝试列出一个排序列表。如果输入是前wrterfffr的输入,当我尝试打印列表时会显示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 :(得分:2)

caricaFile 中,将所有已读标题保存在同一位置(titolo-> nome),因此仅记住最后一个,因为您始终将同一指针(titolo)保存在列表中。

例如,在将val保存到列表中时需要复制val,而不是仅在NEW中执行x->val = val;

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这样的指针是一个非常糟糕的主意,因为这会使读者误以为它是值而不是指针