Связанный список будет производить дамп ядра при рекурсивном поиске элемента, которого нет в списке - PullRequest
2 голосов
/ 26 марта 2020
#include <iostream>

using namespace std;

class Node{
public:

int data;
Node* next;

};

//Node* head1 = new Node;

void search(int num , Node* head1)
{

if( (head1 != NULL) & (head1->data == num) )
{
    cout << "Yes";
    return ;
}
else if(head1 == NULL)
{
    cout << "No";
    return ;
}
search(num , head1->next);

//return FALSE;
 }

int main() {
int max , n;
cin >> n;
Node* head = NULL;
Node* ptr;
for(int i = 0; i < n ; i++)
{
    int num;
    cin >>num;
    Node* temp = new Node;
    temp->data = num;
    temp -> next = NULL;
    if(head == NULL)
    {
        head = new Node;
        head = temp;
        ptr = new Node;
        ptr = head;
    }
    else
    {
        ptr->next = temp;
        ptr = ptr->next;
    }
    // linked list is made;
    // traversing through the linked list;

    // search for an element;
    //cout << head->data <<"\n";


}
search(6 , head);
// I have assumed 6 won't be there in the list

 }

Связанный список работает нормально. Я был в состоянии построить список без каких-либо ошибок во время выполнения. Единственная проблема, с которой я столкнулся, связана с методом поиска.

Он будет печатать "YES" идеально, когда элемент для поиска присутствует, но будет возникать ошибка времени выполнения, когда элемента нет, вместо того, чтобы печатать "NO" ;

Я использовал рекурсию (предназначенную) для решения этой проблемы, поскольку мне это не очень удобно.

Чтобы сэкономить время, вы можете игнорировать основную функцию, так как она работает нормально. Я только что предоставил это для справки или любых других ценных предложений.

Также я проверил другие ответы на SO и понял, что большинство ошибок времени выполнения в связанном списке связано с неправильным распределением памяти. Я проверил свой код и обнаружил, что выделение памяти было сделано правильно, или я так думаю.

1 Ответ

1 голос
/ 26 марта 2020

Ваша ошибка здесь

if( (head1 != NULL) & (head1->data == num) )

она должна быть

if( (head1 != NULL) && (head1->data == num) )

&& делает логическим и , плюс, если левая часть ложна правая часть не оценивается. & выполняет поразрядно и , но всегда оценивает обе стороны.

Итак, в вашем коде, когда head1 == NULL, тогда head1->data все еще оценивается, что приводит к разыменованию нулевой указатель и кратер sh.

Просто измените & на &&.

Однако с вашей рекурсией все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...