2

我有一个包含两个“字符串”的链接列表,一个用于搜索,一个用于替换。我还有一个文本文件,我应该逐行打开和阅读,然后查看“字典”(链接列表)中是否存在这些单词,如果存在,我必须用单词的定义替换它。然后将修改后的文本写入一个新的文本文件,所以我想我应该在阅读的时候使用一个缓冲区。

问题是,我不知道如何遍历链表。到目前为止,我有两个词,但它只搜索循环中的第一个词:

char *textLine = NULL;
size_t textlen = 0;
ssize_t readText;
struct node *n = malloc(sizeof(*n));
n = head;
char buffer[MAX_L];

while ((readText = getline(&textLine, &textlen, t)) != -1) {

    char *t = strtok(textLine, " ");

    while (t != NULL) {
        if (strcmp(t,n->word) == 0) {
            // do something
        } else {
            // do something
        }
        n = head;
        t = strtok(NULL, " ");
    }
}

headNULL,我想这就是为什么它只搜索第一个单词我真的不知道我应该如何遍历行和链表。

4

2 回答 2

4

具体而言,如何遍历链表在某种程度上取决于其接口。

没有您正在使用的特定实现的接口,这个问题很难回答;但通常;一个链表看起来像这样:

typedef struct list_node ListNode;

struct list_node {
  void *payload;
  ListNode *next;
}

迭代通常(总是?)通过跟随next指针来完成,只要它不是NULL;像这样:

void iterate (ListNode *head) {
  while (head) {
    if (interested_in_payload(head->payload)) {
      // do stuff
    }

    head = head->next;
  }
}
于 2013-10-21T09:23:02.180 回答
1

这个:

struct node *n = malloc(sizeof(*n));
n = head;

看起来很吓人。首先分配一些内存,然后立即覆盖指针几乎是不正确的。

也许你的意思是

head = n;

?

于 2013-10-21T09:25:35.107 回答