C语言中链表的迭代

C语言中链表的迭代,c,loops,linked-list,C,Loops,Linked List,我有一个包含两个“字符串”的链表,一个用于搜索,一个用于替换。我还有一个文本文件,我应该打开并逐行阅读,然后查看单词是否存在于“字典”(链接列表)中。如果存在,我必须用单词的定义替换它。然后将更改后的文本写入新的文本文件,因此我认为在读取时应该使用缓冲区 问题是,我不知道如何迭代链表。到目前为止,我有两个词,但它只搜索循环中的第一个词: char*textLine=NULL; 大小\u t textlen=0; 阅读文本; 结构节点*n=malloc(sizeof(*n)); n=头部; 字符缓

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

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

char*textLine=NULL;
大小\u t textlen=0;
阅读文本;
结构节点*n=malloc(sizeof(*n));
n=头部;
字符缓冲区[MAX_L];
while((readText=getline(&textLine,&textlen,t))!=-1){
char*t=strtok(文本行“”);
while(t!=NULL){
if(strcmp(t,n->word)==0){
//做点什么
}否则{
//做点什么
}
n=头部;
t=strtok(空,“”);
}
}

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

具体来说,如何迭代链表在某种程度上取决于它的接口

由于没有与您正在使用的特定实现的接口,这个问题很难回答;但通常情况下;链接列表类似于以下内容:

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

具体来说,如何迭代链表在某种程度上取决于它的接口

由于没有与您正在使用的特定实现的接口,这个问题很难回答;但通常情况下;链接列表类似于以下内容:

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

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

也许你的意思是

head = n;

这是:

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

也许你的意思是

head = n;

是否应该有某种
n=n->nextwhile
循环中的code>赋值等。而不是仅仅做
n=head。是否应该有某种
n=n->下一步while
循环中的code>赋值等。而不是仅仅做
n=head。从不是一个危险的词。就我个人而言,对于这种情况,我可能会选择“不”,对于更一般的概念,我可能会选择“很少”。(嵌入式编程中会发生奇怪的事情。)@WillihamTotland Hm。。。是的,好吧,为什么不呢,我做到了“几乎从来没有”从不是一个危险的词。就我个人而言,对于这种情况,我可能会选择“不”,对于更一般的概念,我可能会选择“很少”。(嵌入式编程中会发生奇怪的事情。)@WillihamTotland Hm。。。是的,好吧,为什么不呢,我做到了“几乎从来没有”