2011-11-26 74 views
1

似乎无法解决为什么我打印内容时从此链接列表结构中获取垃圾输出。链接列表创建 - 垃圾输出?

我的目标是添加任何东西到列表中,一些字符串,char字符,它应该反向打印出来。 Im为Head + Tail使用额外的Struct的原因是,我可以打印出订单行,并且也可以反向输入。

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;   
} 

回答

5

的问题是在这里:

while ((c = getchar() != '.')) 

它应该是:

while ((c = getchar()) != '.') 

因为!=具有higher precedence=

你在做什么在while ((c = getchar() != '.'))是:

  1. 您可以通过调用getchar读取一个字符。
  2. 比较读取的字符是否为句号。
  3. 将比较结果指定为c,因此您的c将为01。而当你打印的值为1的角色时,你会看到奇怪的角色。

另请注意,返回类型getcharint,所以您需要将c声明为int。

而且

while (InOrder.head->next != NULL) 

应该是:

while (InOrder.head != NULL) 

否则你提前终止循环,不处理的最后一个节点。

+3

+1。你不知道为什么编译器警告被忽略.... –

+0

干杯,虽然它似乎跳过了我输入的第一个字母例如:你好,打印olle,但没有H. – PnP

+0

仍然不能得到最后的字符打印出于某种原因,它只是完全跳过它。 – PnP