Как удалить узел из связанного списка? - PullRequest
2 голосов
/ 05 июня 2011

Вот мой код:

struct stockRecord {
  int code;
  char name[MAXNAMELEN];
  struct stockRecord* next;
};

struct stockRecord* temp = NULL;
struct stockRecord* head = NULL;
struct stockRecord* prevptr = NULL;

struct stockRecord* resfun(struct stockRecord* list)
{
   temp = list;
   if (head == NULL) head = list;
   if (temp == NULL) {
      return head;
   } else {
      if (prevptr == NULL) {  //first node
         if (strstr(temp->name, "ABC-") != NULL) {
            temp = temp->next;  //remove the current node
         }
      }
      prevptr = list;

      if (temp->next == NULL) {
         return head;
      } else {
         return resfun(temp);
      }
   }
}

Я не знаю, как удалить узел и повторно связать соседние узлы.Тогда мне нужно вернуть головной узел в основную функцию.

Пожалуйста, кто-нибудь может помочь?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 июня 2011

Vega,

Чтобы удалить первый элемент из единственного связанного списка, все, что вам действительно нужно сделать, это «забыть» первый элемент (голову).

ОбщееПроцедура удаления первого узла:

  1. , если узлы динамически распределяются (которые они почти всегда находятся в связанном списке), то освобождают память, выделенную для этого узла.забудьте "голову, сдвинув ее" вниз.Я всегда думаю о связанном списке как о точечных точках, идущих вниз по странице.

Общая процедура удаления узла в среднем списка:

  1. свободная память
  2. свяжите запись выше этой с одной ниже этой.
    • Т.е. prev-> next = this-> next

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

  1. свободная память
  2. prev-> next = null;(где prev - второй последний узел)

Рекурсия не имеет к этому никакого отношения.


    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

    #define SIZE_OF_NAME 12
    #define SUCCESS 0

    typedef struct Stock* stock;

    struct Stock {
      int code;
      char name[SIZE_OF_NAME];
      stock next;
    };

    stock head = NULL;
    stock prev = NULL;

    stock StripABC(stock curr)
    {
      if (strstr(curr->name, "ABC-") != NULL) {
        // the first name contains "ABC-", so strip it.
        head = head->next;
        curr = head;
      }
      return head;
    }

    int main(int argc, char *argv[])
    {
      struct Stock a, b;
      a.code = 1; strcpy(a.name, "ABC-");
      b.code = 2; strcpy(b.name, "Widget");
      head = &a;
      head->next = &b;

      StripABC(head);

      printf("head->name: %s\n", head->name);

      return SUCCESS;
    }

Удачи с ним.Кстати, связанные списки являются ЕДИНСТВЕННЫМИ «акциями в торговле» для программистов.Я до сих пор работаю с ними слишком часто; -)

Приветствия.Кит.

1 голос
/ 05 июня 2011

Ваш код немного сложен для подражания.Но я постараюсь помочь

Эта строка:

temp = temp->next;  //remove the current node

на самом деле не удаляет узел из списка.Это должно выглядеть примерно так:

prev->next = temp->next; // link the previous node past the current node
free(temp); // now that nothing is pointing to temp, you can deallocate the memory
return head; // we found our node, return the head of the list

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

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