#arrays #c #function #linked-list #static
Вопрос:
У меня есть некоторые проблемы с добавлением и удалением узла в связанном списке без malloc. Я удаляю узел, затем снова добавляю узел и печатаю список, но ничего не происходит. Я пытаюсь проверить функцию add_node, и она работает нормально, но я не могу проверить с помощью del_node. Вот мой код:
#include lt;stdio.hgt; #include lt;stdint.hgt; #define MAX_NODES 20 typedef struct node { uint8_t value; struct node *next; } node; static node node_arr[MAX_NODES] = {[0 ... 19] = 0}; static uint8_t next_node = 0; void Add_Node(node **head, uint8_t val, uint8_t index) { node *new_node = amp;(node_arr[index]); next_node ; new_node-gt;value = val; new_node-gt;next = *head; /* New node will point the current head*/ *head = new_node; /* Make new node become head of the list */ } void Del_Node(node **head, uint8_t index) { uint8_t run = 0; /* Use run for reaching position */ node *temp = *head; while((temp-gt;next!= NULL) amp;amp; (run != index)){ temp = temp-gt;next; run ; } temp = temp-gt;next; /* Let current node become next node */ next_node --; } int main(){ node *head = NULL; Add_Node(amp;head, 2, 1); Add_Node(amp;head, 3, 2); Add_Node(amp;head, 4, 3); Add_Node(amp;head, 5, 4); Del_Node(amp;head, 3); // position 3 mean value 3 of list for (node *temp = head; temp != NULL; temp = temp-gt;next) { printf(" %d ", temp-gt;value); } }
Спасибо всем.
Комментарии:
1.
temp = temp-gt;next; /* Let current node become next node */
. Это ничего не делает, так как просто устанавливает локальную переменную. Вам нужно изменить следующий указатель предыдущего узла, чтобы указать наtemp-gt;next
него .2.
next_node
его ни для чего не используют. Это просто увеличивается и уменьшается. Чтобы правильно использовать массив, вам нужно сохранить свободный список . Изначально свободный список содержит все узлыnode_arr
.Add_Node
Функция должна удалить первый узел из списка свободных и добавить его в рабочий список.Del_Node
Функция должна удалить узел из рабочего списка и добавить его в список свободных.3. @user3386109 next_node здесь я использую для другой цели. Спасибо за вашу помощь
4. @kaylum Я уверен, что ошибаюсь (с моей программой), но мне интересно, что я использовал двойной указатель (передаю по ссылке), и это не работает
Ответ №1:
что касается вашей функции удаления: эта строка кода не делает то, что, я думаю, вы хотите, чтобы она делала:
темп = темп-gt;следующий;
вы пытаетесь изменить локальную переменную, которая все равно теряется, когда вы выходите за пределы области действия функции
попробуйте это исправить: после инициализации temp добавьте эту строку
node *prev = temp
в вашем цикле while первая строка должна быть:
prev = temp;
а затем вместо этого выйти за пределы цикла:
темп = темп-gt;следующий;
поставьте эту строку:
prev-gt;next = temp-gt;next;