将char数组添加到链接列表

时间:2018-06-06 18:16:20

标签: c

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    char word[20];
    struct node * next;
}node;

int main(){
    FILE *ifp;
    char newword[20];
    node * head;

    ifp = fopen("para.txt","r");
    head = (node * )malloc(sizeof(node));

    while(fscanf(ifp,"%s",newword) != EOF){
         head -> next = NULL;
         head -> word = newword;
     }

    return 0;
}

我想将文本文件读取的单词添加到链接列表中。我尝试使用此代码,但我无法做到。我该如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

您只分配一个节点(head),然后在循环的每次迭代中更改其内容。要创建链接列表,您需要为每个单词分配一个新的node(循环的每次迭代)。这样的事情应该这样做:

int main(){
    FILE *ifp;
    char newword[20];
    node * head = NULL;
    node  *last = NULL;
    node  *current;

    ifp = fopen("para.txt","r");
    if (ifp == NULL) {
        fprintf(stderr, "Unable to open file para.txt\n");
        return EXIT_FAILURE;
    }
    while(fscanf(ifp,"%19s",newword) != EOF){
         current = malloc(sizeof(node));
         strcpy(current -> word,newword);
         if(last) {
             last->next = current;
         }
         else {
             head = current;
         }
         last = current;
    }

    return EXIT_SUCCESS;
}

答案 1 :(得分:0)

跟踪头部和尾部,或者只是推动头部。以下追加有效地结束。

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    struct node * next;
    char word[1];
    //or, char word[20];//fixed length word
}node;

node*
nodeNew(char* word) {
    if(!word) return NULL;
    //either dynamically allocate for strlen(word)
    node* pnode = malloc( sizeof(node)+strlen(word) );
    //or fixed len word 
    if( pnode ) {
        pnode->next = NULL;
        strcpy(pnode->word, word);
        //or, strncpy(pnode->word, word, 20-1); //fixed length
    }
    return pnode;
}

int main()
{
    FILE *ifp;
    char newword[200]; //since using fscanf, need to avoid buffer overflow, should use fgets and strtok instead
    node * head;

    if( !(ifp = fopen("para.txt","r") ) { printf("error\n"); exit(0); }
    head = NULL;

    while(fscanf(ifp,"%s",newword) != EOF){
        if( !head ) { tail = head = nodeNew(newword); }
        else { tail->next = nodeNew(newword);
    }
    //head points to first element, head->next points to next element
    //tail points to last element

    return 0;
}