c - 替换链表功能

时间:2011-02-07 02:56:33

标签: c

任何人都可以告诉我为什么替换功能不起作用?说主要称为替换(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;
}

2 个答案:

答案 0 :(得分:0)

您的replace()功能存在一些问题。 (在你的上一个问题中我看起来很好)。

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

  2. 您释放p并立即尝试将next的{​​{1}}字段设置为值。指向的p位置无效,因此您不应该这样做。您应该使用临时变量来保存旧p,以便稍后释放。只有在您实际更换它时才应该这样做,因此它应该是先前条件的一部分。

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

    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;
    }
}

您也错误地使用了插入功能,因为您没有将上一个节点连接到新创建的节点。