Моя структура определяется следующим образом:
typedef struct node {
char * word;
int wordLength;
int level;
struct node * parent;
struct node * next;
}Node;
Я пытаюсь создать связанный список структуры выше, где «слово» — это строка, которая читается из файла. Ниже приведена функция, которую я использую для создания списка. Кажется, он работает нормально и печатает слова, но затем, когда я пытаюсь распечатать его в main()
, он ничего не печатает.
void GetWords(char * dictionary, Node * Word, Node * Start)
{
FILE *fp;
char * currentWord = (char *)malloc(sizeof(char));
fp = fopen(dictionary, "r");
ErrorCheckFile(fp);
if(fscanf(fp, "%s", currentWord) == 1){
Start = Word = AllocateWords(currentWord);
}
while((fscanf(fp, "%s", currentWord)) != EOF){
Word->next = AllocateWords(currentWord);
Word = Word->next;
printf("%s: %d\n", Word->word, Word->wordLength);
}
fclose(fp);
}
Нужно ли возвращаться к началу списка? Если да, то как бы я это сделал? В этой функции у меня "Старт" указывает на первое слово в файле, нужно ли мне это? Я пытаюсь распечатать их, просто чтобы убедиться, что файл правильно хранится в списке.
Моя функция main():
int main(int argc, char ** argv)
{
Node * Word = (Node *)malloc(sizeof(Node));
Node * Start = (Node *)malloc(sizeof(Node));
GetWords(argv[1], Word, &Start);
printf("Start: %s\n", Start->word);
printf("Word: %s\n", Word->word);
while(Word->next != NULL){
printf("%s\n", Word->word);
}
return 0;
}
Операторы печати находятся там только для того, чтобы проверить, печатается ли список. В нынешнем виде Start->word печатает последнее слово в файле, а Word->word печатает (null), а цикл while вообще не выполняется.
Моя функция AllocateWords() выглядит следующим образом:
Node * AllocateWords(char * string)
{
Node * p;
p = (Node *)malloc(sizeof(Node));
if(p == NULL){
fprintf(stderr, "ERROR: Cannot allocate space...\n\n");
exit(1);
}
p->word = string;
p->wordLength = strlen(p->word);
p->parent = NULL;
p->next = NULL;
return p;
}
sizeof(char)
равен 1, а это очень мало места для хранения строки. - person M Oehm   schedule 20.11.2015Word
иStart
являются локальными переменными. Изменения, которые вы в них вносите, не будут отражены в функции, из которой вызываетсяGetWords
. - person M Oehm   schedule 20.11.2015