1

クラス用に 3 ファイルの C++ プログラムを作成しています。このプログラムは順序付けられた連結リストです。プログラムはコンパイルされますが、挿入しようとするとクラッシュします (プログラムを実行し、選択肢を選択して Enter キーを押し、挿入する int を入力して Enter キーを押します)。どんな助けでも大歓迎です。

ドライバーファイル:

#include "SortedLinkedList.h"
#include <iostream>
using namespace std;


int displayMenu();
void proccessChoice(int, SortedLinkedList&);

int main()
{
    SortedLinkedList sSList;
    int choice = displayMenu();

    do
    {
        if (choice != 3)
        {
            proccessChoice(choice, sSList);
        }
    } while (choice != 3);


    return 0;
}

void proccessChoice(int input, SortedLinkedList& l)
{
    switch(input)
    {
        case 1:
            int num;
            cout << "Please enter a int: ";
            cin >> num;
            l.addItem(num);
        break;
        case 2:
            l.popFirst();
        break;
    }


}

int displayMenu()
{
    int choice;

    cout << "menu" << endl;
    cout << "===========" << endl;
    cout << "1. add an int" << endl;
    cout << "2. Show Sorted Linked List" << endl;
    cout << "3. Exit" << endl;
    cin >> choice;
    cin.ignore();

    return choice;
}

宣言ファイル:

struct sslNode
{
    sslNode* next;
    int item;
};

class SortedLinkedList
{
private:
    sslNode* head;
    bool isEmpty ();

public:
    SortedLinkedList();
    ~SortedLinkedList();
    void addItem(int);
    int popFirst();
};

実装ファイル:

#include <iostream>
using namespace std;
#include "SortedLinkedList.h"

SortedLinkedList::SortedLinkedList()
{
    head = NULL;
}

SortedLinkedList::~SortedLinkedList()
{
    sslNode *temp, *nextLink;
    nextLink = head;

    while(nextLink != NULL)
    {
        temp = nextLink->next;
        delete nextLink;
        nextLink = temp;
    }
}

bool SortedLinkedList::isEmpty()
{
    return (head == NULL);
}

void SortedLinkedList::addItem(int itemToInsert)
{
    sslNode* cur; 
    sslNode* prev;
    sslNode* newNode = new sslNode();
    newNode->item = itemToInsert;
    newNode->next = NULL;

    cur = head;
    prev = NULL;
    bool moreToSearch (cur != NULL);

    while (moreToSearch) //Find insertion point
    {
        if (cur->item > newNode->item) // while current location has a greater value then what needs to be inserted move pointers forward.
        {
            prev = cur;
            cur = cur->next;
            moreToSearch = (cur != NULL);
        } 
        else // if current loacation and what is to be inserted are equal or less then we have found the point of insertion 
        {
            moreToSearch = false;
        }
    }

    if (prev = NULL)
    {
        newNode->next = head->next;
        head = newNode;
    }
    else
    {
        prev->next = newNode;
        newNode->next = cur;
    }

    //Insert as only item in list
    //Insert in found location
}

int SortedLinkedList::popFirst()
{
    sslNode* first;
    first = head->next;
    head = head->next;
    int item = first->item;

    return item;
}
4

2 に答える 2

2

headに初期化されているため、クラッシュしNULLます。設計に応じて、おそらくダミーのヘッド ノードを作成するか、NULLで使用する前に確認する必要がありaddItem()ます。

これは物事がどのように起こるかです:

SortedLinkedLis

t::SortedLinkedList() // ctor is called
...
head = NULL

SortedLinkedList::addItem(int)
sslNode* cur;
...

cur = head;
...

bool moreToSearch (cur != NULL) // this is surely false
...

if (prev = NULL)
{
    newNode->next = head->next;
 ...//BUT head == NULL ! crash!
于 2012-09-13T19:12:51.247 に答える
2

あなたの問題は、=を忘れたことです

if (prev = NULL)
{
    newNode->next = head->next;
    head = newNode;
}
else
{
    prev->next = newNode;
    newNode->next = cur;
}

if(prev = NULL)

する必要があります

if(prev == NULL)

prev が false に評価される null になり、次に失敗するため、現在これは常に false です

prev->next = newNode;

nullポインターを逆参照しているためです。

何かを挿入しようとする前に、 head == NULL の場合も処理する必要があります。基本的に head == NULL の場合、head = newNode;

于 2012-09-13T19:19:37.280 に答える