迭代C中的链表

时间:2013-10-21 09:15:19

标签: c loops linked-list

我有一个包含两个“字符串”的链表,一个用于搜索,另一个用于替换。我还有一个文本文件,我应该打开并逐行阅读,然后查看单词是否存在于“词典”(链表)中,如果有的话,我必须用单词的定义替换它。然后将更改的文本写入新的文本文件,所以我认为我应该在阅读时使用缓冲区。 问题是,我不知道如何迭代链表。到目前为止,我有两个单词,但它只搜索循环中的第一个单词:

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, " ");
}
}

“head”是NULL,我猜这就是为什么它只搜索第一个单词我只是不知道我应该如何迭代行和链表。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

此:

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

看起来非常可怕。首先分配一些内存几乎永远不正确,然后立即覆盖指针。

也许你的意思是

head = n;