链表插入,为什么插入不了?


void insert(Node* list,int index,int data){

if(list->next=NULL){
    Node* node=(Node*)malloc(sizeof(Node));
    node->next=NULL;
    node->data=data;
    list->next=node;

    return;
}
int length=1;
Node* p=list->next;

Node* node=(Node*)malloc(sizeof(Node));

node->data=data;

while(p){

         if(length==index-1){
        node->next=p->next;
        p->next=node;

    }

    p=p->next;

    length++;



}

}

插入一个结点到链表,这样写,供参考:

void InsList(Node* head, int i, int x)
{
    Node* p = head, * s = NULL;
    if (i < 1 || !head)  
        return;
    while (p->next && i--)  p = p->next;
    if (i > 1) return;
    s = (Node*)malloc(sizeof(Node));
    if (!s)  return;
    s->next = NULL;
    s->data = x;
    s->next = p->next;
    p->next = s;
}

你这个if的条件就错了

【以下回答由 GPT 生成】

这段代码是用来实现链表插入的逻辑,它的大致逻辑如下:

  1. 如果链表为空,创建一个新的节点,并将数据插入到该节点中,然后将该节点设置为链表的头节点的下一个节点。
  2. 如果链表不为空,则通过遍历找到插入位置的前一个节点。
  3. 在找到的前一个节点后插入一个新的节点,将新节点的next指针指向原来的后一个节点。

这段代码可能出现问题的地方在于:

  1. 如果要插入的位置超出了链表的长度或者小于等于0,代码没有进行处理。
  2. 当index为1时,代码不会执行插入操作,因为在第一次循环时,length就已经等于index-1了。
  3. 在找到插入位置的前一个节点后,没有处理插入位置正好是链表的最后一个节点的情况。

为了解决这些问题,可以按照以下步骤进行修正:

  1. 在函数一开始加入对index的判断,如果index小于等于0或者超过链表的长度,直接返回。
  2. 修改while循环的条件为 p && length < index - 1 ,这样保证了在找到插入位置的前一个节点之后,再执行插入操作。
  3. 在循环结束后,如果length等于index-1,说明需要插入的位置是链表的最后一个节点,可以将节点插入到p节点的后面。

修正后的代码如下:

void insert(Node* list, int index, int data){

    if(index <= 0){
        return;
    }

    if(list->next == NULL){
        Node* node = (Node*)malloc(sizeof(Node));
        node->next = NULL;
        node->data = data;
        list->next = node;

        return;
    }

    int length = 1;
    Node* p = list->next;

    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;

    while(p && length < index-1){
        p = p->next;
        length++;
    }

    if(length == index-1){
        node->next = p->next;
        p->next = node;
    }
}

这样修正之后,应该能够正常插入数据了。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^