2

検索用と置換用の 2 つの「文字列」を含むリンク リストがあります。また、開いて1行ずつ読むことになっているテキストファイルもあり、「辞書」(リンクされたリスト)に単語が存在するかどうかを確認します。存在する場合は、単語の定義に置き換える必要があります。次に、変更されたテキストを新しいテキスト ファイルに書き込むので、読み取り時にバッファーを使用する必要があると考えました。

問題は、リンクされたリストを反復処理する方法がわからないことです。これまでのところ、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, " ");
    }
}

headis NULL、それが最初の単語のみを検索する理由だと思います。行とリンクリストの両方をどのように反復処理すればよいか本当にわかりません。

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 に答える