3

在我的作业中,我必须编写一个函数,该函数将一个指向“LNode”结构的指针和一个整数参数作为参数。然后,我不仅要将该整数添加到链表中,还要将其放置以便列表按正确的升序排列。我已经尝试了几种不同的尝试,这是我发布时的代码。

LNode*  AddItem(LNode  *headPtr, int  newItem)
{
    auto    LNode   *ptr = headPtr;

    ptr = malloc(sizeof(LNode));

    if (headPtr == NULL)
    {
        ptr->value = newItem;
        ptr->next = headPtr;
        return ptr;
    }
    else
    {

        while (headPtr->value > newItem || ptr->next != NULL)
        {
            printf("While\n"); // This is simply to let me know how many times the loop runs
            headPtr = headPtr->next;
        }
        ptr->value = newItem;
        ptr->next = headPtr;
        return ptr;
    }

}  // end of "AddItem"

当我运行它并尝试插入一个 5 和一个 3 时,5 被插入,但随后 while 循环运行一次,我得到一个分段错误。

此外,我无法更改参数,因为它是该项目的骨架代码的一部分。感谢任何能提供帮助的人。

如果它有帮助,这就是结构的样子

typedef struct  LNode
{
    int                 value;
    struct  LNode      *next;

} LNode;
4

4 回答 4

3

在你的循环中

while (headPtr->value > newItem || ptr->next != NULL)
    {
    printf("While\n"); // This is simply to let me know how many times the loop runs
    headPtr = headPtr->next;

您检查未初始化的是否ptr->next为 (not) NULL。这是不明智的,并且如果该部分中的位模式可能ptr不是NULL指针的位模式,则可能会造成严重破坏,因为您有一个||in 条件,那么循环条件始终为真并且您跑出了列表的末尾。

||无论如何都是错误的,你需要一个,&&两个条件都必须成立,有些不是NULL,并且值之间的关系必须成立。

而且,由于您希望列表按升序排列,因此您必须在列表中的值小于要插入的值时遍历列表。

但是您必须在指向的值变得与新值一样大或大于新值之前停止,因为您必须修改next插入新值之后的节点的指针。

if (headPtr->value >= newItem) {
    ptr->value = newItem;
    ptr->next = headPtr;
    return ptr;
}
while(headPtr->next != NULL && headPtr->next->value < newItem) {
    headPtr = headPtr->next;
}
// Now headPtr is the node behind which the new item is to be inserted
ptr->value = newItem;
ptr->next = headPtr->next;
headPtr->next = ptr;
return ??

但是你会返回什么指针?如果新项是列表中的第一个,则返回指向第一个节点的指针。如果您还想在以后插入新项目时这样做,则需要保留(副本)原件headPtr并将其退回。

于 2012-04-06T23:45:36.687 回答
2

您的 while 循环条件是错误的。您从未设置ptr->next,但您使用它来检查循环中ptr->next!=NULL哪个方法headPtr=headPtr->next变得疯狂。所以你应该设置:ptr->next=NULL一旦你设置了它的值。

您也可以将这些行取出并将其放在顶部:

   ptr->value = newItem;
   ptr->next = headPtr;

尝试这个:

LNode*  AddItem(LNode  *headPtr, int  newItem)
{
    auto    LNode   *ptr, *temp, *orghead;
    orghead = headPtr;
    int fl=0;
    ptr = malloc(sizeof(LNode));
    ptr->value = newItem;
    ptr->next = NULL;
    temp = ptr;

    if (headPtr == NULL)
        return ptr;
    else
        {

        while(headPtr != NULL && headPtr->value < newItem)
            {
            printf("While\n");
            fl =1;
            temp = headPtr;
            headPtr = headPtr->next;
            }
        temp->next = ptr;
        ptr->next = headPtr;
        if(fl) return orghead;
        else return temp;
        }

}  // end of "AddItem"
于 2012-04-06T23:35:44.940 回答
0

您的 while 循环一直持续到链表的末尾,并且您的最后一个元素为空。因此,在您的 while 条件下,您正在取消引用一个空节点(headPtr),这样就会出现分段错误。我认为您需要像这样检查您的节点是否为空:

while (headPtr != NULL && (headPtr->value > newItem || ptr->next != NULL))
于 2012-04-06T23:44:41.103 回答
0

从以上所有来看都是如此

while (headPtr->value > newItem || ptr->next != NULL)
        {
            printf("While\n"); // This is simply to let me know how many times the loop runs
            headPtr = headPtr->next;
        }

您没有在 While 内检查 headPtr 的空条件

在此刻

headPtr = headPtr->next;

headPtr->next 可以为 null,这会使您的程序崩溃

多一点

LNode*  AddItem(LNode  *headPtr, int  newItem)
{

auto    LNode   *ptr = headPtr; ?

    ptr = malloc(sizeof(LNode));

    if (headPtr == NULL)
    {
        ptr->value = newItem;
        ptr->next = headPtr;
        return ptr;
    }

考虑 headPtr 不是 NULL,ptr 现在指向一些 malloc 堆 ptr->next 在这种情况下可能是也可能不是 NULL

while (headPtr->value > newItem || ptr->next != NULL)

将是不可预测的

可能你需要多看看你的逻辑

如果您愿意,请参阅下面的伪逻辑

LNode* add_time(LNode *headptr , data){

    LNode   *ptr =  headptr, *temp;        

    temp = malloc(sizeof(LNode));

    if(!temp) 
      return ptr;

    temp->next = NULL;
    temp->value= data;

    if(ptr == NULL){ 
        /** There is no list**/
        ptr = temp;
        return ptr;
     }

    /* go to last node*/
    while(ptr->next)
        ptr = ptr->next;

    ptr->next = temp;

    return ptr;

}
于 2013-05-13T11:25:26.183 回答