如何从链表中删除节点?

时间:2011-06-05 12:28:29

标签: c recursion linked-list

到目前为止,这是我的代码:

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 个答案:

答案 0 :(得分:3)

维加,

要从单链接列表中删除第一个元素,您真正需要做的就是“忘记”第一个元素(头部)。

删除第一个节点的一般过程是:

  1. 如果节点是动态分配的 (他们几乎总是在一个 linked-list)然后释放内存 分配给此节点。
  2. 通过“向下”移动头来“忘记”头部。我总是想到一个链接列表,因为点到了DOWN页面。
  3. 删除列表中间中的节点的一般过程是:

    1. 免费记忆
    2. 将此一项以上的条目链接到此一项下方。
      • 即。 prev-> next = this-> next
    3. 删除最后一个节点的一般步骤是(我打赌你可以猜到):

      1. 免费记忆
      2. prev-> next = null; (其中prev是最后一个节点)
      3. 递归与它无关。

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

        祝你好运。顺便说一句,链接列表仍然是ansi-c程序员的“交易库存”。我仍然经常和他们一起工作; - )

        干杯。基思。

答案 1 :(得分:1)

您的代码有点难以理解。但我会尽力帮助

这一行:

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。