通过将某人排序到链表中来添加某人时出现分段错误的原因

The reasons for segmentation fault while adding someone by sorting them into the linked list

本文关键字:某人 分段 错误 排序 链表 添加      更新时间:2023-10-16

列表项

void MovieDatabase::  addActor(const string movieTitle, const string actorFirstName, const string actorLastName, const string actorRole ){
    bool found = false;
    Movie* temp;
    for(Movie* m= headMovie; m != NULL;  m = m-> next){
            if(m-> title == movieTitle){
                found = true;
                temp = m;
                break;
            }
    }
    if(found){
            if(headCast == NULL)
                    headCast =  new Cast(actorFirstName, actorLastName, actorRole, movieTitle);
            else{
                    Cast *c =  new Cast(actorFirstName, actorLastName, actorRole, movieTitle);
                    Cast *temp = headCast;
                    for(Cast* cur = headCast; cur -> next != NULL;  cur = cur -> next){
                             if(cur ->next -> lastName <  actorLastName){
                                    temp = temp -> next;
                            }
                            else{
                                    c -> next = cur -> next;
                                    temp  -> next= c;
                                    break;
                            }
                    }
            }
    }
    else
    cout << "The movie with a " << movieTitle << "  does not exist in the database,you can not add the actor. " << endl;
    size++;
}

大家好,我编辑了代码,现在我不承担任何责任。但是,它不显示任何输出。这意味着它不添加任何东西。在任何情况下,我都要发送用于显示的代码。

void MovieDatabase:: showActors(){
    for(Cast * cur= headCast;  cur != NULL; cur = cur -> next){
         cout  << cur  -> lastName << endl;
    }
}

在这段代码中:

for(Cast* cur = headCast; cur != NULL;  cur = cur -> next){
    if(cur ->next -> lastName <  actorLastName){

您只检查cur != NULL,然后解除对cur->next的引用。cur->next可能为NULL

tempcur似乎都指向同一个节点。也许您打算将其中一个放在另一个的前面,以便您有指向前一个节点的指针进行插入?

这是一个(未经测试的)实现:

    Cast *c =  new Cast(actorFirstName, actorLastName, actorRole, movieTitle);
    Cast *prev = NULL; // maintain a pointer to the previous node. No previous node initially.
    Cast *cur;
    for(cur = headCast; cur != NULL;  cur = cur -> next)
    {
        if(cur -> lastName > actorLastName) break; // stop if we find a place to insert.
        prev = cur;                                // update previous pointer before looping.
    }
    if(prev != NULL)
    {
        prev -> next = c; // if there is a previous node, use 'c' as its next node.
    } else {
        headCast = c;     // otherwise 'c' is the new head node.
    }
    c -> next = cur;      // the 'current' node always goes after 'c'.