Как удалить из узла любые целочисленные данные - PullRequest
0 голосов
/ 31 марта 2011

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

addnode(root,5);
addnode(root,2);
addnode(root,6);
display(root);
removenode(root,5);
display(root);
removenode(root,6);

вам, ребята, нужен код для моего кода добавления? но наш профф уже дал нам код для отображения отображения узлов;

void display(struct node *head)
{   
     struct node *traverser;
     traverser = head;

     while(traverser!=NULL)
     {
          printf("%d\n",traverser->x);
          traverser=traverser->next; 
     }

}

struct node { int data; struct node *next };

вопрос, однако, что означает traverser=traverser->next;

Ответы [ 4 ]

1 голос
/ 23 августа 2012

1) вы можете удалить узел из связанного списка следующим образом (учитывая, что head не фиктивный узел, т.е. head также содержит данные) ...

int flag=0;
 if(head->data==data_todel) head=head->next; //if head contains the data 
  ptr=head; 
   while(ptr->next!=NULL && flag==0)  
    {   
     if(ptr->next->data!=data_todel)  
      ptr=ptr->next;    
     else 
      {
       flag=1;
       break;
      }  
   } 
 if(flag) ptr->next=ptr->next->next;

вам нужно использовать два указателя, чтобы освободить удаленноеузел.

2)


+------+-------+        +------+-------+
| data1| next  |        | data2| next  |
+------+-------+        +------+-------+
    ^        |              ^
    |        |              |
    |        +--------------+
+---------+
|traverser|
+---------+

after traverser=traverser->next

+------+-------+        +------+-------+
| data1| next  |        | data2| next  |
+------+-------+        +------+-------+
           |              ^        ^
           |              |        |
           +--------------+        |
                                   |
                              +---------+
                              |traverser|
                              +---------+
that means it is assigning the address of of the next node currently pointed by traverser.
1 голос
/ 31 марта 2011

Я предполагаю, что вы имеете дело со связанным списком. Обычно они состоят из записей, которые содержат данные и ссылку на следующее имя (то есть имя):

  struct node {
        int data;
        struct node *next;
  }

Как видите, ссылка - это указатель на C. Который должен указывать на следующую запись. Чтобы начать обход списка, у вас обычно есть голова. Если вы хотите удалить запись, вам нужно пройти по списку, и как только вы найдете запись, которую хотите удалить, просто переставьте указатели:

  void removeEntry(int data, struct node *head) {
        struct node *prev = NULL, *current = head;
        while(current->data != data) {
              prev = current; // current will always point to the entry in front of current
              current = current->next;
              if(current == NULL) // end of list and no match
                    return;
        }
        // now current is pointing to the entry you want to remove
        // remove it just by rearrangeing pointers
        prev->next = current->next;      
        free(current); // I assume you malloc'ed the memory
  }

Примечание. Обратите внимание, что здесь я пропустил проверку ошибок. Кроме того, иногда заголовок является фиксированным элементом, в котором данные не сохраняются (в моем случае это будет работать), иногда заголовок может содержать сами данные (в этом случае вам необходимо проверить, является ли элемент, который вы хотите удалить, первым элементом, и повторно связать его). голова соответственно)

0 голосов
/ 31 марта 2011

Поле next является ключом в связанном списке.Каждый элемент имеет преемника, таким образом, список связан.Поэтому, когда вы просматриваете список, вы начинаете с первого элемента head и переходите от одного элемента к следующему до тех пор, пока следующего элемента не будет.

Чтобы удалить запись, необходимо циклически перемещаться по списку.пока вы не найдете эту запись.Затем установите переменную next предыдущей записи для следующей записи.Таким образом, элемент удаляется из списка.

0 голосов
/ 31 марта 2011

вопрос, однако, что делает traverser = traverser-> next;

Устанавливает указатель на следующий элемент в очереди. Итерация в цикле while, пока он не достигнет нулевого указателя (конец очереди).

(Вы не опубликовали объявление структуры узла, поэтому я просто догадываюсь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...