似乎不明白为什么在打印内容时要从这个链表结构中获取垃圾输出。
我的目标是在列表中添加任何内容,一些字符串,一个一个字符,一个它应该反向打印出来我使用Head+Tail的额外结构的原因是这样我就可以打印出订单行是以相反的方式输入的。
typedef struct List {
char c;
struct List *next;
}List;
typedef struct {
List *head;
List *tail;
}FullList;
List* InsertList(int hd, List* t1) {
List *t = (List*)calloc(1,sizeof(List));
t->c = hd;
t->next = t1;
return t;
}
FullList addToStart(FullList c, char element) {
if (c.head == NULL) {
c.head = c.tail = InsertList(element, NULL);
}else {
c.head = InsertList(element, c.head);
}
return c;
}
int main(void) {
FullList InOrder;
FullList Reverse;
InOrder.head = NULL;
Reverse.head = NULL;
char c;
while ((c = getchar() != '.')) {
InOrder = addToStart(InOrder, c);
}
while (InOrder.head->next != NULL) {
printf("%c", (InOrder.head->c));
InOrder.head = InOrder.head->next;
}
return 0;
}
最佳答案
问题在于:
while ((c = getchar() != '.'))
应该是:
while ((c = getchar()) != '.')
因为
!=
比=
有higher precedence。您在
while ((c = getchar() != '.'))
中所做的是:您可以通过调用
getchar
来读取字符。比较读取的字符是否为句点。
将比较结果赋给
c
,这样您的c
将是0
或1
。当你打印值为1
的字符时,你会看到这个奇怪的字符。还要注意getchar的返回类型是
int
,因此需要将c声明为int。阿尔索
while (InOrder.head->next != NULL)
应该是:
while (InOrder.head != NULL)
否则,在不处理最后一个节点的情况下过早终止循环。
关于c - 链接列表创建-垃圾输出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8278278/