链接列表查询

时间:2011-11-26 13:35:52

标签: c linked-list

基本上问题是,我想要这样的输入:

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

2 个答案:

答案 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;

请注意,不使用尾指针,也不会将其设置为正确的值。