c - 排序列表未按预期打印 (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;
}
解决方案
在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 这样的指针是一个非常糟糕的主意,因为这会让读者误以为它是一个值而不是一个指针
推荐阅读
- ruby-on-rails - 通过 AJAX 登录后设计重定向回上一个
- sas - 具有可变部分的 SAS 文件路径
- github-actions - 我应该使用个人访问令牌从 GitHub Actions 访问 ghcr 吗?
- node.js - Discord.js:ReferenceError:消息未定义
- java - Spring Boot中存在同步和异步处理器时如何获取同步过程的响应体
- python - 正则表达式在python中的字符串中查找两个相同的字符串
- javascript - 如何在 Discord.JS 中的两条消息之间获取消息
- node.js - Docusign 从模板发送信封不显示选项卡(节点)
- ios - iOS 中的 Flutter 发布失败,errSecInternalComponent 命令 PhaseScriptExecution 失败,退出代码为非零
- java - 将堆栈顶部放置在链接链的末尾而不是开头