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

标签 c

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

最佳答案

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

将 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 

像 TITOLO 那样让 typedef 成为指针是一个非常糟糕的主意,因为这会让读者误以为它是一个值而不是一个指针

关于c - 排序列表未按预期打印 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281312/

相关文章:

c - 如何在字符数组中存储多组字符串

c - __attribute__ 是否适用于声明中的所有变量?

c - MPI 发送和接收不适用于超过 8182 双

c++ - 从缓冲区指针计算堆栈中的返回地址

c - C语言中的 ':-!!'是什么?

c - while (*p2++ = *p1++); 是做什么的?意思?

c - C语言中声明void**是什么意思?

c - 字符串数据存储在哪里?

c - 确定主线程 pthread_create 中的参数在 C 中是否为 NULL

c++ - 为什么 p &key3 + 2 和 p (int*)&key3 + 2 在 LLVM 中会打印不同的结果?