基本上问题是,我想要这样的输入:
Hello
World
.
以反向字顺序输出:
World
Hello
然而我的代码似乎输出
orldello
错过\n
和每个单词的第一个字母,我知道该做什么就在砖墙上!
这是我到目前为止所尝试的:
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 c1, char element) {
if (c1.head == NULL) {
c1.head = c1.tail = InsertList(element, NULL);
} else {
c1.head = InsertList(element, c1.head);
}
return c1;
}
int main(void) {
FullList InOrder;
FullList Reverse;
InOrder.head = NULL;
Reverse.head = NULL;
char c;
while ((c = getchar()) != '.') {
while((c = getchar()) != '\n') {
InOrder = addToStart(InOrder,c);
}
while ((InOrder.head) != NULL ) {
Reverse = addToStart(Reverse, InOrder.head->c);
InOrder.head = InOrder.head->next;
}
}
while(Reverse.head != NULL) {
printf("%c", Reverse.head->c);
Reverse.head = Reverse.head->next;
}
return 0;
}
答案 0 :(得分:0)
您不会因此而存储换行符:
while((c = getchar()) != '\n')
只要读取的字符不是换行符,就会重复循环体。当它是换行符时,循环中的代码不执行。
每行的第一个字符都会被删除,因为你这样做了:
while((c = getchar()) != '.') {
while((c = getchar()) != '\n') {
你读了一个角色,什么都不做,再次读取一个角色,然后将它追加到列表中。只是摆脱内循环,它应该工作正常。
编辑:
我误解了这个问题。如果要反转行的顺序,请不要将每个字符作为元素添加到列表中。将列表元素的类型从char
更改为char*
,并将每一行存储为元素:
char buff[500];
fgets(buff, 500, stdin);
char *new_element = strdup(buff);
/* Add new_element to the list */
答案 1 :(得分:0)
我相信这是你想要完成的。您总是追加到列表的“中间”,如果找到换行符,则将列表的中间位置设置为头指针。
FullList l;
Lust* ins = l.head = insertList(NULL,0); // sentinel
while ((c = getchar()) != '.') {
ins = ins->next = insertList(ins->next,c);
if (c == '\n') {
ins = l.head;
}
}
ins = l.head;
free(l.head);
l.head = ins;
请注意,不使用尾指针,也不会将其设置为正确的值。