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;
}
Вопрос:
- Как будет корректно написать код, что-бы table[temp]->next == NULL;
- Как избежать ошибки сегментации?
Ответы (1 шт):
Вместо сложного :
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;