Связанный список без динамического выделения

#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;