我试图为我的问题做一个简单的例子,我希望代码看起来不会太怪异。我正在尝试列出一个排序列表。如果输入是前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;
}
答案 0 :(得分:2)
例如,在将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这样的指针是一个非常糟糕的主意,因为这会使读者误以为它是值而不是指针