c -链表协助



我正在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: %.2fn", 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;
    } 

打印问题

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

您将需要生成一个函数,该函数将在您正在制作的列表中定位'x'元素。你可以把它包含在你写的print函数中。只要把它改成你想要的元素的整型:

int print(NodeT head, int element) {}

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

你真正需要做的就是逐级逐级找到你想要的元素。

<<p> 插入问题/strong>

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

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

内存问题

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

Fred说得很好。

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

  1. 您缺少malloc()printf()的包含文件。
  2. main()中分配内存,但不使用它。
  3. 如果你想修改insert()中的列表头,你必须传递一个指向它的指针。
  4. 你检查insert()的内存分配是否成功,但不处理它不成功的情况-所以你也可以直接摆脱它。
  5. 当您忽略insert()print()的返回值时,您也可以将其返回类型更改为void
  6. 在搜索列表的最后一个元素时,覆盖指针(temp)到刚刚分配的内存。
  7. 当你认为你已经找到了最后一个元素时,你实际上使新元素的下一个点指向它,并设置第一个元素指向新元素,这将使它有效地成为第一个元素而不是最后一个元素(如果所有其他的东西都能工作…)
  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: %.2fn", 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;
} 

相关内容

  • 没有找到相关文章

最新更新