簡體   English   中英

我無法在鏈表 class 中分配結構節點的變量。 當我將它們分配給任何東西時,它都會產生未定義的行為

[英]I can't assign the struct node's variables in linked list class. when I assign them to anything it creates undefined behaviour

//method for printing list
void printList(const ReservationList& ls){ 

    for(int i = 0; i < ls.getLength(); i++){ std::cout<<"ls["<<i<<"]== "<<i+1<<ls.retrieve(i,i+1)<<std::endl; }
}

//main method
int main(){

    ReservationList r;

    std::cout<<"program starts!"<<std::endl;

    std::cout<<"before printing empty list"<<std::endl;
    printList(r);
    std::cout<<"after printing empty list"<<std::endl;

    std::cout<<"inserting starts!"<<std::endl;
    r.insert(0,1);
    std::cout<<"after inserting 1"<<std::endl;
    r.insert(0,2);
    std::cout<<"after inserting 2"<<std::endl;
    r.insert(0,3);
    std::cout<<"after inserting 3"<<std::endl;
    r.insert(0,4);
    std::cout<<"after inserting 4"<<std::endl;
    r.insert(0,5);
    std::cout<<"after inserting 5"<<std::endl;

    printList(r);
    
    return 0;
}

這是 ReservationList 類的頭(ReservationList.h)

#ifndef RESERVATION_H
#define RESERVATION_H

#include <iostream>

class ReservationList {

    public:
    ReservationList();/*
    ReservationList( const ReservationList& aList );
    ~ReservationList();*/

    bool isEmpty() const;
    int getLength() const ;
    bool retrieve(int index, int resCode) const;
    bool insert(int index, int resCode);
    bool remove(int index);

    private:

    struct ReservationNode {
        int Code;
        ReservationNode* next;
    };

    int size;
    
    ReservationNode *head;
    ReservationNode *find(int index) const;

}; 
#endif

這些是我迄今為止調用的構造函數和插入方法

//empty constructor
ReservationList::ReservationList() {

    head = NULL;
    size = 0;
}

//insert method
bool ReservationList::insert(int index, int resCode) {

    if(index < 0 || index > size) { return 0; }

    //making node to be added
    ReservationNode* tmp;
    std::cout<<"inside insert 1"<<std::endl;
    tmp->Code = resCode;/*mistake is hear */
    std::cout<<"inside insert 2"<<std::endl;
    tmp->next = NULL;
    std::cout<<"inside insert 3"<<std::endl;


    if ( (index == 0) && (size == 0) ) { 
        std::cout<<"inside insert 4"<<std::endl;

        head = tmp;
        size++; 
        return 1; 
    }
    else if ( (index == 0) && (size == 1) ){

        tmp->next = head;
        head = tmp;
        size++;
        return 1;

    }

    ReservationNode  *curr , *prev; 
    curr = find( index );
    prev = find( index - 1 );

    tmp->next = curr;
    prev->next = tmp;
    size++;
    return 1; 
}

這是 output

program starts!
before printing empty list
after printing empty list
inserting starts!
inside insert 1

[Done] exited with code=3221225477 in 0.622 seconds

使用“std::cout”,我跟蹤了它在tmp->Code = resCode;處的錯誤。 部分插入方法問題出在std::cout<<"inside insert 1"<<std::endl; 但是,當我評論tmp->Code = resCode; 它在后面的那一行給出錯誤。 據我了解,訪問結構內的變量或分配它們存在問題。

此代碼段

ReservationNode* tmp;
std::cout<<"inside insert 1"<<std::endl;
tmp->Code = resCode;/*mistake is hear */
std::cout<<"inside insert 2"<<std::endl;
tmp->next = NULL;

調用未定義的行為,因為指針tmp未初始化並且未指向ReservationNode類型的有效 object 。

您似乎忘記調用 operator new來創建ReservationNode類型的 object 。

又調用了 function find了兩次

ReservationNode  *curr , *prev; 
curr = find( index );
prev = find( index - 1 );

效率低下。

function 可以更簡單地定義,無需重復代碼。

bool ReservationList::insert( int index, int resCode )
{
    bool success = not ( index < 0 || index > size );

    if ( success )
    {
        ReservationNode **current = &head;

        while ( index-- )
        {
            current = &( *current )->next;
        }

        ReservationNode *new_node = new ReservationNode { resCode, *current };
        *current = new_node;
        ++size;
    }

    return success;
}

請注意,如果數據成員size具有無符號 integer 類型size_t而不是有符號 integer 類型int會更好。 function 參數index也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM