2013-10-21 59 views
0

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

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

“头”是空的,我想这就是为什么它只是搜索的第一个字我真的不知道如何遍历行和链表。

+1

不应该在内部'while'循环内有某种'n = n-> next;'赋值或类似的操作。而不是仅仅做'n = head'。 –

回答

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

此:

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

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

也许你的意思是

head = n; 

+0

从不是一个危险的词。就个人而言,我可能会在这个案例中使用“not”,对于更一般的概念,“很少”。 (奇怪的事情发生在嵌入式编程中。) –

+1

@WillihamTotland嗯......是的,好吧,为什么不呢,我做到了“几乎从不”。 :) – unwind