关于链表指针指向,赋值问题

img


如图两段代码,为什么第一段代码构建的链表有问题,而第二段可以

该回答引用ChatGPT

这两段代码都想实现在链表尾部添加一个新节点。但是第一段代码有问题,会导致无限循环。原因是:
第一段代码:
cpp


void LinkList::add()
{
    record* cur = new record;
    record* ptr = new record  ;
    strcpy_s(cur->name, getname()); 
    cur->score = this->score;
    cur->next = nullptr;
    record* temp=this->head->next;
    while(temp->next! = nullptr)  // 问题在这一行
        temp = temp->next; 
    temp->next = cur;  
}

在这段代码中,temp最开始指向head的下一个节点。而在while循环内,只要temp->next不为空,就继续让temp指向下一个节点。
问题在于,如果链表为空或只有一个节点,temp->next就是null,导致while循环永不退出,产生无限循环。
第二段代码修正了这个问题:
cpp


void LinkList::add()
{
    record* cur = new record; 
    record* ptr = new record  ;
    strcpy_s(cur->name, getname());  
    cur->score = this->score;
    cur->next = nullptr;
    record* temp=this->head;  
    while(temp->next != nullptr)  
        temp = temp->next; 
    temp->next = cur;  
} 

在这段代码中,temp最开始就指向头节点head,而非head的下一个节点。那么无论链表是否为空,while循环都会正常退出。temp会指向链表的最后一个节点,并将新节点cur追加到该节点后。
所以第二段代码修正了第一个代码片段的问题,避免了无限循环的产生,实现了链表尾部添加节点的功能。