0

私のプログラムはデッキからカードをランダムに引き出し、リンクされたリストの配列に保存します。スーツごとに 1 つのリストがあり、リストにはランクが保持されます。

struct node{
            node(int value = 0) {data=value; next = NULL; }
            int data;
            node *next;

        };

class list{
    public:

        list ();
        ~list();

        bool empty() const {return N == 0;}
        bool full() const {return false;}
        int size()  const {return N;}

        void resize(int);
        void clear();

        void insert(int);
        void remove(int);

        void pop_back() { remove(N-1);}
        const int & back();

        int & operator[](int);

        int findNodeRank(int);

        friend ostream& operator<<(ostream &out, list);

    private:
        int N;
        node *head;

        node *findnode(int);
};

list::list() {
    cout << "making list" << endl;
    head = new node;
    cout << "made list" <<endl;
    }

私の主な機能にはこれらの行があります

cout << "here 1" << endl;
list deck[4];
cout << "not here 1";

コードをコンパイルして実行すると、次の出力が得られます。

here 1
making list
made list
making list
made list
making list
made list
making list
made list
not here 1
before loopHere;
insert
after find node rank
before find node
after find node
[1]    11472 segmentation fault (core dumped)  ./Prog2b

ご覧のとおり、 not here が呼び出されることはないため、リスト配列の作成から抜け出すことはありません。何がうまくいかないのかわかりません。

OK ive は、この関数に絞り込みました。関連するすべてのコードを投稿しようとします

    if (i == 0){                        
        node *p = new node(rankIndex);
        cout << "before find node" << endl;
        node *pp = findnode(N);
        cout << "after find node" << endl;
        p->next = pp->next;
        pp->next = p;

        N++;
    }else {
        prev->next = match->next;       
        match->next = head->next;      .
        head->next = match;            

}
}

int list::findNodeRank(int rankIndex){ //Function similar to findnode that checks for rank match. Returns the index of the match.

    if (head->next == 0)
        return 0;

    node *p = head->next;
    int i = 1;
    cout << "find node rank function" << endl;
    while(p->data != 0){
        if (p->data == rankIndex)
            return i;

        p = p->next;
        i++;
    }

    return 0;                           //Returns 0 if there is no match
}

inline
node *list::findnode(int i) {
    if (i == -1)
        return head;

    node *p = head->next;
    while(i--)
        p = p->next;

    return p;
}

まだ作成されていないノードなどを参照している可能性があります。これらのリンクされたリストが苦手です。基本的に、私が言ったようなプログラムはランダムなカードを引き、作成したこれらのリストに結果を保存します。挿入関数は、カードが描画されていない場合、リストの最後にカードを追加することになっています。カードが引かれた場合、リストの先頭に移動するはずです。何か案は??

4

0 に答える 0