任何人都可以告诉我为什么替换功能不起作用?说主要称为替换(1,2,列表)。它应该搜索节点,如果节点的值是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;
}
答案 0 :(得分:0)
您的replace()
功能存在一些问题。 (在你的上一个问题中我看起来很好)。
当您找到具有insert()
但没有对新节点执行任何操作的节点(i
返回时)时,请调用insert()
。基本上,您要插入的新节点是新的p
,因此您应该将p
设置为它。
您释放p
并立即尝试将next
的{{1}}字段设置为值。指向的p
位置无效,因此您不应该这样做。您应该使用临时变量来保存旧p
,以便稍后释放。只有在您实际更换它时才应该这样做,因此它应该是先前条件的一部分。
我认为应该涵盖它。基本上这些变化是:
p
答案 1 :(得分:0)
正如马克所指出的,你的free(p)
有未定义的行为。因此,下一个陈述
p->next = replace(i, j, p->next);
由于您尝试将p->next
分配给指针值,变为无效,但未定义p->next
内存位置本身。
但为什么你让这个替换函数递归?一个简单的while循环就足够了。
IntNodePtr replace(int i, int j, IntNodePtr p) {
if(p == NULL)
return NULL;
IntNodePtr prevPtr = NULL;
while(p){
if(p->myInt == i){
IntNodePtr temp = insert(j, p->next);
if(prevPtr)
prevPtr->next = temp;
free(p);
break;
}
prevPtr = p;
p = p->next;
}
}
您也错误地使用了插入功能,因为您没有将上一个节点连接到新创建的节点。