Динамический массив связанных списков в C

В основном мне нужно хранить слова в связанном списке, где каждый символ имеет свой собственный узел. Меня очень путают вложенные структуры. Как мне перейти к следующему узлу? Я знаю, что делаю это совершенно неправильно, поэтому и спрашиваю.

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

typedef struct node
{
    char letter;
}NODE;


typedef struct handle
{
    NODE **arr;
}HANDLE;

HANDLE * create();


void insert(handle **, char, int);

int main(int argc, char **argv)
{
    FILE *myFile;
    HANDLE *table = (HANDLE *)malloc(sizeof(HANDLE));
    NODE *linked = (NODE *)malloc(sizeof(NODE));
    int counter = 0;

    linked = NULL;
    table->arr[0] = linked;

    char c;


    myFile = fopen(argv[argc], "r");

    while((c = fgetc(myFile)) != EOF)
    { 
        if(c != '\n')
            insert(&table, c, counter);

        else
        {
            counter++;
            continue;
        }
    }
}


void insert(HANDLE **table, char c, int x)
{
    (*table)->arr[x]->letter = c; //confused on what to do after this or if this
                                  //is even correct...
} 

person ShadyBears    schedule 30.04.2013    source источник


Ответы (2)


У вас есть связанный список слов, где каждое слово представляет собой связанный список символов. Я прав? Если это так, лучше использовать имена для того, что они есть:

typedef struct char_list
{
    char                    letter;
    struct char_list      * next;
} word_t;

typedef struct word_list
{
    word_t                * word;
    struct word_list_t    * next;
} word_list_t;

Теперь вы можете заполнять списки по мере необходимости.

person unxnut    schedule 30.04.2013

Для связанного списка у вас обычно есть ссылка на следующий узел в самой структуре узла.

typedef struct node
{
    char letter;
    struct node *next;
}NODE;

Затем из любого заданного узла NODE *n следующий узел будет n->next (если не NULL).

insert должен сканировать список, пока не найдет n->next, который имеет значение NULL, и выделить новый узел в конце (убедитесь, что для его next установлено значение NULL).

Вы можете захотеть иметь функцию для инициализации нового списка с учетом индекса таблицы и отдельную функцию для инициализации нового узла.

person luser droog    schedule 30.04.2013