gpt4 book ai didi

c-替换链表函数

转载 作者:行者123 更新时间:2023-11-30 18:07:09 26 4
gpt4 key购买 nike

谁能告诉我为什么替换功能不起作用?说主要称为replace(1,2,list)。它应该搜索节点,如果节点的值为 1,则应该创建一个值为 2 的新节点来替换它,然后释放分配给第一个节点的内存。我想不通=(

typedef struct iNode
{
int myInt;
struct iNode* next;
} IntNode, *IntNodePtr;

IntNodePtr insert(int i, IntNodePtr p)
{
IntNodePtr newp = malloc(sizeof(struct iNode));
newp->myInt = i;
newp->next = p;
return newp;
}

IntNodePtr delete(int i, IntNodePtr p)
{
/* End of list check */
if(p == NULL)
return NULL;

/* Check if current node is the one to delete */
if(p->myInt == i)
{
IntNodePtr temp;
temp = p->next;

free(p);
return temp;
}

p->next = delete(i, p->next);
return p;
}

IntNodePtr replace(int i, int j, IntNodePtr p)
{
if(p == NULL)
return NULL;

if(p->myInt == i)
insert(j, p->next);

free(p);

p->next = replace(i, j, p->next);
return p;
}

最佳答案

您的 replace() 函数存在一些问题。 (在我看来,你的最后一个问题很好)。

  1. 当您找到具有 i 的节点时,您会调用 insert(),但您对新节点不执行任何操作(insert() 返回)。基本上,您要插入的新节点是新的 p,因此您应该将 p 设置为它。

  2. 您释放了 p 并立即尝试将 pnext 字段设置为一个值。 p 指向的位置无效,因此您不应该这样做。您应该使用临时变量来保存旧的p,以便稍后可以释放它。仅当您实际要替换它时才应执行此操作,因此它应该是先前条件的一部分。

我认为这应该涵盖它。基本上变化是:

/* if the current node contains the int I'm looking for... */
if(p->myInt == i)
{ /* ... the current node needs to be replaced */
/* save the current node to delete later (2) */
IntNodePtr oldNode = p;

/* insert a new node making it the new current node (1) */
p = insert(j, oldNode->next);

/* free the old node (2) */
free(oldNode);
}
/* and so on */

关于c-替换链表函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4917753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com