C 在链接列表的末尾插入节点

C 在链接列表的末尾插入节点,c,struct,linked-list,C,Struct,Linked List,下面的代码给出了一个错误,我不知道为什么。 下面的功能是在链表的末尾插入节点 struct Node { int data; struct Node *next; }; Node* Insert(struct Node *head,int data) { struct Node *p; p=head; struct Node *prev; struct Node *temp=(struct Node*)malloc(sizeof(struct

下面的代码给出了一个错误,我不知道为什么。 下面的功能是在链表的末尾插入节点

struct Node {
    int data;
    struct Node *next;
};

Node* Insert(struct Node *head,int data)
{ 
    struct Node *p;
    p=head;
    struct Node *prev;
    struct Node *temp=(struct Node*)malloc(sizeof(struct Node));
    temp->data=data;
    temp->next=NULL;

    if(head==NULL){
        head=temp;
        return head;
        //return temp;  
    }                                           ``
    while(p!=NULL){
        prev=p;
        p=p->next;
    }
    p=temp;//If we change this line to prev->next=temp .It is giving the correct result 
    return head;
}
在上述代码中 如果我们替换线p=温度;使用prev->next=temp它可以工作。 请帮助我理解这背后的逻辑。 提前谢谢。
问题来自。

您将新创建的节点分配给p。该部分没有问题。但是,前面的节点不知道这个新创建的最后一个元素的地址,因为prev->next被分配给NULL。因此,您必须将上一个下一个指针指定给temp,以便节点temp链接到您的列表。就在while循环结束之前,p有一些值,但下一个指针被指定为NULL。所以下一次prev有一些数据,而下一个指针为空。您不会将下一个指针更改为指向下一个临时节点。仅将温度分配给p。因此,最后一个临时值不会链接到列表

循环结束后,请尝试:

 p=temp;
 prev->next=p;
或者只是

prev->next=temp;

试着想想:赋值后p会发生什么?如果两个指针指向同一个内存位置,改变一个不会改变另一个。两个指针完全分开。如果要更改另一个指针,也可以使用指向指针的指针。但是这会使它变得更复杂。Node*Insertstruct Node*head,int data这是C中的语法错误。结构定义不是类型定义你是什么意思?我们不能在到达空指针后分配节点吗?是的,您可以,但您没有这样做。生成的倒数第二个元素的next指针被分配给NULL,而不是temp节点。我正在将p处的值从NULL更改为temp的地址,其中temp->next=NULL。我的代码正确吗?