Segmentation fault при работе с элементами массива связных списков

Имеется массив из связных списков, который состоит из элементов типа node *. Вот определение:

typedef struct node
{
    char word[LENGTH + 1];
    struct node *next;
}
node;

Обьявление массива списков:
const unsigned int N = (26*26);
node *table[N];//пробовал инициализировать ={0}; но table[N] -> next всеравно не равно NULL.

И дальше мне нужно создать новый елемент типа node*, сохранить в него строчную переменную, получить хеш-значение переменной с помощью хеш-функции, что бы узнать в какое место масива её вставить, а потом вставить этот новый элемент типа node* в нужное место.

FILE *inptr = fopen(dictionary, "r");
    if (inptr == NULL)
    {
        return false;
    }
    int temp;
    char tempword[LENGTH];
    //
    int di = 0;
    while (fscanf(inptr, "%s", tempword) != EOF)
    {
            node *element = malloc(sizeof(node));
            if (element == NULL)
            {
                fclose(inptr);
                return false;
            }
            element -> next = NULL;
            strcpy(element -> word, tempword);
            temp = hash(tempword);

И всё идет относительно не плохо, до этого момента. Во первых, в массив ещё ничего не было сохранено, но if (table[temp] -> next) возвращает истину, а мне нужно, что бы последний элемент каждого массива возвращал NULL. Но если я пытаюсь выполнить в начале этот код:

    for (int s = 0; s < N; s++)
    {
        (table[s]->next) = NULL;
    }

то segmentation fault выдаёт сразу после него. Во вторых, при выполнении строки *table[temp] -> next = &(element); выдаёт Segmentation fault.

            if ((table[temp] -> next))
            {
                element -> next = &(*table[temp]);
                table[temp] -> next = &(*element);
            }
            else
            {   
                (table[temp] -> next) = &(*element);
            }
            di++;

    }
            fclose(inptr);
            return true;
}

Вопрос:

  1. Как будет корректно написать код, что-бы table[temp]->next == NULL;
  2. Как избежать ошибки сегментации?

Ответы (1 шт):

Автор решения: AlexGlebe

Вместо сложного :

if ((table[temp] -> next))
        {
            element -> next = &(*table[temp]);
            table[temp] -> next = &(*element);
        }
        else
        {   
            (table[temp] -> next) = &(*element);
        }

Заменяете голову списка на element с хвостом прошлой головы, неважно была голова нулевая или нет.

     element -> next = table[temp];
     table[temp] = element;
→ Ссылка