首页 > 解决方案 > 排序列表未按预期打印 (C)

问题描述

我试图为我的问题做一个更简单的例子,我希望代码看起来不会太奇怪。我正在尝试制作一个排序列表。如果输入是 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;
}

标签: c

解决方案


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


推荐阅读