【问题标题】:Linked List Assistance [closed]链接列表协助[关闭]
【发布时间】:2014-05-29 19:02:16
【问题描述】:

我正在用 C 语言编写一个带有插入和打印功能的链表。但是,我从插入中得到了一个分段错误,当我尝试解决这个问题时,我最终得到了一个来自打印功能的错误。任何帮助将不胜感激。

    typedef struct node
    {
        struct node *next;
        double value;
    } NodeT, *NodeTP;

    int listSize = 0;

    int insert(NodeT *firstEle, int value)
    {
        NodeTP temp;

        if((temp = (NodeTP)malloc(sizeof(NodeT))) == NULL)
        {
            return 0;
        }

        // first node in the list.
        if(listSize == 0)
        {
            firstEle->value = value;
            firstEle->next = NULL;
        }
        // finds the end node and adds the new node to the list.
        else
        {
            while(temp != NULL)
            {
                temp = temp->next;
            }

            temp->value = value;
            temp->next = firstEle;
            firstEle = temp;
        }

        listSize++;
        return 1;
    }

    int print(NodeT List)
    {
        printf("Element: %.2f\n", List.value);
        return 1;
    }

    int main(int argc, char* argv[])
    {
        // creates the list.
        NodeTP list;

        if((list = (NodeTP)malloc(sizeof(NodeT))) == NULL)
        {
            return 0;
        }

        list = NULL;

        insert(list, 5);

        print(list[0]);

        insert(list, 15);

        print(list[1]);

        return EXIT_SUCCESS;
    } 

【问题讨论】:

  • 为什么在 malloc 之后立即将 list 设置为 NULL?
  • 这个问题似乎离题了,因为它是关于另一个在调试时没有尝试过的链接列表。
  • 我同意@Martin。出于这个原因,我给出了修复的建议,而不是确切的代码修复。

标签: c list pointers linked-list computer-science


【解决方案1】:

打印问题

当涉及到打印语句时,您使用的语法无效。您创建了一个指针并为该指针及其指向的内容分配了足够的内存。您没有创建 NodeT 元素的数组。因此,list[x] 将不起作用。

您需要生成一个函数来定位您正在创建的列表中的“x”元素。您可以将其包含在您编写的 print 函数中。只需将其更改为您想要的元素的 int 即可:

int print(NodeT head, int element) {}

不要忘记检查边界,以防请求的元素超出当前范围。

那么,您真正需要做的就是逐步遍历元素找到所需的元素。

插入问题

在您的 if/else 语句中,您为什么要尝试遍历“temp”? 'temp' 是在此函数中创建的,不应附加任何其他元素。您应该遍历“firstEle”。您也不想设置firstEle = temp;,因为这会覆盖之前的内容,而您现在指向的是其他内容。

简化此代码的一种方法是使用头部和尾部。头部永远不会改变,但尾部会随着元素的添加而移动。你可以让'insert'返回尾部,当你插入一个新元素时,只需提供尾部,新元素就会被添加到那里,不需要迭代。

内存问题

虽然这对于这个程序来说不是主要的,但我会调整我的新节点的 malloc 位置,直到我确保它不是第一个元素之后。否则,您分配了一个从未使用过的块。或者,如果这是要添加的第一个元素,则释放该块。

弗雷德提出了一个很好的观点。这会导致问题。

【讨论】:

    【解决方案2】:

    多个问题(列表远未完成):

    1. 您缺少 malloc()printf() 的包含文件。
    2. 您在main() 中分配内存,但不要使用它。
    3. 如果你想修改insert()中的列表头,你必须传递一个指向它的指针。
    4. 您检查insert() 中的内存分配是否成功,但不处理不成功的情况 - 所以您也可以直接摆脱它。
    5. 当您忽略insert()print() 的返回值时,您也可以将它们的返回类型更改为void
    6. 在搜索列表的最后一个元素时,将指针 (temp) 覆盖到刚刚分配的内存。
    7. 当您认为找到了最后一个元素时,实际上是让新元素的 next 指向它,并将第一个元素设置为指向新元素,这将使其有效地成为第一个而不是最后一个元素(如果所有其他的东西都可以工作...)。
    8. 您正在尝试使用带有 [] 的数组样式访问列表。你必须使用指针。

    在这个版本中,我至少修复了最基本的错误,以使其能够编译并至少可以工作。它仍然远非完美(甚至可以接受),但我尝试尽可能少地进行更改,以便您更容易发现差异并了解您做错了什么并从那里进一步改进。

    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct node
    {
        struct node *next;
        double value;
    } NodeT, *NodeTP;
    
    int listSize = 0;
    
    int insert(NodeT **firstEle, int value)
    {
        NodeTP temp, lastEle;
    
        temp = (NodeTP)malloc(sizeof(NodeT));
    
        // first node in the list.
        if(listSize == 0)
        {
            temp->value = value;
            temp->next = NULL;
            *firstEle = temp;
        }
        // finds the end node and adds the new node to the list.
        else
        {
            for (lastEle = *firstEle;lastEle->next != NULL;lastEle = lastEle->next);
    
            temp->value = value;
            temp->next = NULL;
            lastEle->next = temp;
        }
    
        listSize++;
        return 1;
    }
    
    int print(NodeT List)
    {
        printf("Element: %.2f\n", List.value);
        return 1;
    }
    
    int main(int argc, char* argv[])
    {
        // creates the list.
        NodeTP list;
    
        list = NULL;
    
        insert(&list, 5);
    
        print(*list);
    
        insert(&list, 15);
    
        print(*list->next);
    
        return EXIT_SUCCESS;
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2010-12-07
      • 1970-01-01
      • 2018-02-09
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多