【问题标题】:Linked List Delete Node链表删除节点
【发布时间】:2013-10-18 02:34:50
【问题描述】:

所以我正在尝试实现一个从链表中删除节点的函数。

这是我的主要内容:

int main(void)
{
    NODE* first = generateNodes(5);
    NODE* jank = getNode(first, 2);
    deleteNode(first,2);
    printf("Length of Node List: %d\n",getNodeListLength(first));
    printf("First Node: %d\n",first -> pos); 
    printf("Jank Node: %d\n",jank -> pos); 
    return 0;
}

这是我的输出:

Length of Node List: 2
First Node: 0
Jank Node: 2

输出应该是(因为在main() 中我删除了jank,并将链表的大小减一):

Length of Node List: 4
First Node: 0
Jank Node: NULL

这是我的完整源代码:

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

/* NODE STRUCTURE */

typedef struct node{

    char* thing;

    int pos; /* Index of node */
    struct node* next; /* Pointer to next node */

} NODE;

/* Generates a single node */ 
NODE* generateNode();

/* Generates linked nodes and returns the first node */
NODE* generateNodes(int num);

/* Gets a node at a certain index */
NODE* getNode(NODE* start, int index);

/* Returns the length of a list of nodes */
size_t getNodeListLength(NODE* start);

/* Removes a node at a certain index */
NODE* deleteNode(NODE* start, int index);

int main(void)
{
    NODE* first = generateNodes(5);
    NODE* jank = getNode(first, 2);
    deleteNode(first,2);
    printf("Length of Node List: %d\n",getNodeListLength(first));
    printf("First Node: %d\n",first -> pos); 
    printf("Other Node: %d\n",jank -> pos); 
    return 0;
}

NODE* generateNode()
{
    return (NODE*) malloc(sizeof(NODE));
}

NODE* generateNodes(int num)
{
    NODE* one = generateNode();
    NODE* cpy = one;

    int i;

    for(i = 0; i < num - 1; i++)
    {

        NODE* next = generateNode();
        cpy -> next = next;
        cpy -> pos = i;
        cpy = next;

    }

    cpy -> pos = i;
    cpy -> next = NULL;

    return one;
}

NODE* getNode(NODE* start, int index)
{
    int i;
    for(i = 0; i < index; i++)
    {
        start = start -> next;
    }
    return start;
}

size_t getNodeListLength(NODE* start)
{
    size_t i;
    while(start -> next != NULL)
    {
        start = start -> next;
        i++;
    }
    return i - 1;
}

NODE* deleteNode(NODE* start, int index)
{
    if(index > 0)
    {
        NODE* f = getNode(start,index - 1);
        NODE* l = getNode(start,index + 1);
        NODE* d = getNode(start,index);
        f -> next = l;
        free(d);
        return start;
    }
    if(index == 0)
    {
        NODE* up = start -> next;
        free(start);
        return up;
    }
    if(index + 1 == getNodeListLength(start))
    {
        NODE* r = getNode(start,index);
        NODE* c = getNode(start,index - 1);
        c -> next = NULL;
        free(r);
        return start;
    }
}

我哪里做错了?

【问题讨论】:

  • 有时,指定您最不熟悉的代码部分执行其应有的操作可能会有所帮助,并仔细查看。

标签: c linked-list


【解决方案1】:

我注意到 getNodeListLength 中的 size_t i 未初始化为任何值 - 这可能是意外大小报告的来源。

此外,您从列表中删除了jank,但您的jank 指针仍指向该节点(即使它已经是free'd)——这意味着在访问内存之后使用jank那不再是你的了!

【讨论】:

    【解决方案2】:

    试试

    //modify this method
    size_t getNodeListLength(NODE* start)
    {
        size_t i = 0;
        while(start != NULL)
        {
            start = start -> next;
            i++;
        }
        return i;
    }
    

    【讨论】:

      【解决方案3】:

      原来我的错误是在这个函数中:

      size_t getNodeListLength(NODE* start)
      {
          size_t i;
          while(start -> next != NULL)
          {
              start = start -> next;
              i++;
          }
          return i - 1;
      }
      

      应该是:

      size_t getNodeListLength(NODE* start)
      {
          size_t i = 1;
          while(start -> next != NULL)
          {
              start = start -> next;
              i++;
          }
          return i;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-15
        • 2019-05-10
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-11
        • 2021-02-08
        相关资源
        最近更新 更多