在c中单独列出插入函数

Singly list insert function in c

我正在尝试为简单链表编写一些函数。这个应该在列表之间的某处添加一个节点。用户在列表的头部放入应该在此时保存的数据 "c" 和一个作为保存索引的 int "x"。但它基本上什么都不做,我不确定为什么。也许有人能看出错误。

第一个 if 语句只是检查索引是否是列表的一部分。

DoubleNode *insert(DoubleNode *head, double c, int x)
{
    int i;
    DoubleNode *cursor, *tmp, *newl;
    cursor = head->next;
    newl = head;
    if (x > Index(newl) || x < 1)
    {
        printf("FAIL\n");
        return NULL;
    }
    else {
        while (cursor != NULL)
        {
            newl->next = cursor;
            cursor = cursor->next;
            if (i == x)
            {
                tmp = malloc(sizeof(DoubleNode));
                if (tmp == NULL)
                {
                    printf("Fail");
                    return NULL;
                }
                tmp->data = c;
                tmp->next = cursor;
                cursor = tmp;
            }
            i++;
        }
    }
    return newl;
}

声明

tmp->data=c;
tmp->next=cursor;
cursor=tmp;

实际上并没有将节点 tmp 添加到列表中。你需要做例如

tmp->data = c;
tmp->next = cursor->next
cursor->next = tmp;
break;  // No need to loop more, we've inserted the node

首先你必须找到索引为x的节点的前驱。分配一个新节点并将其插入到找到的前导节点的下一个节点。

DoubleNode* insert(DoubleNode*head, double c, int x)
{
    if ( x<1 )
    {
        printf("FAIL\n");
        return NULL;
    }

    // Find predecessor, start with head
    DoubleNode *pred= head;
    int i = 1;
    while ( i < x && pred->next != NULL )
    {
        pred = pred->next;
        i ++;
    }

    if ( i < x )
    {
        // list is to short
        printf("Fail");
        return NULL;
    }

    // allocate new node and insert it after predecessor
    DoubleNode *newl = malloc(sizeof(DoubleNode));
    newl->data = c;
    newl->next = pred->next; // successor of new node is successor of predecessor
    pred->next = newl; // successor of predecessor is now the new node

    return newl;
}

感谢大家的提示。它现在正在工作。我想 return 一个包含新节点的完整列表的新头。我没有提到这个抱歉。

DoubleNode*insert(DoubleNode*head, double c, int x)
{
    DoubleNode *pred, *tmp;
        pred=head;
        tmp=head;
        int i = 1;
        while ( i < x && pred->next != NULL )
        {
            pred = pred->next;
            tmp->next=pred;
            i ++;
        }

        if ( i < x )
        {
            printf("Fail");
            return NULL;
        }
        DoubleNode *newl = malloc(sizeof(DoubleNode));
        newl->data = c;
        newl->next = pred->next; 
        pred->next = newl; 

        return tmp;
}