Member 13277493 Ответов: 2

Как цикл while, который находится внутри функции сравнения списков, идет бесконечно


проблема в том, что пока цикл не завершается, я не знаю почему

#include <iostream>
using namespace std;


class linkedList
{
private:

    struct node
    {
        int data;
        node *next;
    };
    node *headA;
    node *headB;
public:
    linkedList();
    ~linkedList();
    int CompareLists();
    void pushA(int m_data);
    void pushB(int m_data);
};

linkedList::linkedList()
{
    headA=NULL;
    headB=NULL;
}
linkedList::~linkedList()
{
    delete(headA);
    delete(headB);
}

void linkedList::pushA(int m_data)
{
    node *newNode=new node;
    if(headA==NULL)
    {
        headA=newNode;
    }
    newNode->data=m_data;
    newNode->next=headA;
    headA=newNode;
}

void linkedList::pushB(int m_data)
{
    node *newNode=new node;
    if(headB==NULL)
    {
        headB=newNode;
    }
    newNode->data=m_data;
    newNode->next=headB;
    headB=newNode;
}

int linkedList::CompareLists()
{
    if(headA==NULL || headB==NULL)
    {
        return 0;
    }


    while(headA!=NULL && headB!=NULL)
    {
        if(headA->data!=headB->data)
        {
            return 0;
        }
        headA=headA->next;
        headB=headB->next;


    }
    if(headA==NULL && headB!=NULL)
    {
        return 0;
    }
    if(headA!=NULL && headB==NULL)
    {
        return 0;
    }
    return 1;

    // This is a "method-only" submission.
    // You only need to complete this method
}



int main()
{

    linkedList l;
    l.pushA(7);
    l.pushA(9);
    l.pushA(11);
    l.pushA(5);
    l.pushA(3);
    l.pushA(1);

    l.pushB(7);
    l.pushB(9);
    l.pushB(11);
    l.pushB(5);
    l.pushB(3);
    l.pushB(1);


    cout<<l.CompareLists();
}


Что я уже пробовал:

Я попытался решить эту проблему с помощью отладчика, но это не помогло

PIEBALDconsult

Я не уверен, но думаю, что у вас есть круговые списки.

Member 13277493

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

PIEBALDconsult

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

Member 13277493

о, Спасибо, я забыл написать еще кое-что перед выписками

PIEBALDconsult

Рад быть полезным.

Member 13277493

:)

2 Ответов

Рейтинг:
16

CPallini

В вашем коде есть несколько ошибок. То push функции ошибочны и создают (как Пегий отмечено) круговые связи. Деструктор тоже ошибается.
Попробуй:

#include <iostream>
using namespace std;

class LinkedList
{
private:
  struct Node
  {
    int data;
    Node * next;
  };

  Node * headA;
  Node * headB;

  void _push( Node * & head, int data); // workhorse for pushA and pushB
  void _cleanup( Node * head); // workhorse for headA and headB cleanup, used by destructor

public:
  LinkedList():headA(nullptr), headB(nullptr){}
  ~LinkedList(){ _cleanup(headA); _cleanup(headB);}
  bool compare();
  void pushA(int data){ _push(headA, data); }
  void pushB(int data){ _push(headB, data); }
};


void LinkedList::_push( Node * & head, int data)
{
  Node * newNode = new Node();
  newNode->data = data;
  newNode->next = head;
  head = newNode;
}

void LinkedList::_cleanup(Node * head)
{
  while (head)
  {
    Node * tmp = head;
    head = head->next;
    delete tmp;
  }
}

bool LinkedList::compare()
{
  Node * na = headA;
  Node * nb = headB;

  if ( !na  || !nb ) return false;

  while ( na && nb )
  {
    if ( na->data != nb->data) return false;
    na = na->next;
    nb = nb->next;
  }
  return ( (!na) && (!nb));
}

int main()
{
  LinkedList l;
  l.pushA(7);
  l.pushA(9);
  l.pushA(11);
  l.pushA(5);
  l.pushA(3);
  l.pushA(1);

  l.pushB(7);
  l.pushB(9);
  l.pushB(11);
  l.pushB(5);
  l.pushB(3);
  l.pushB(1);

  cout << l.compare() << endl;;
}


Member 13277493

спасибо, это действительно помогло

CPallini

Добро пожаловать.

Рейтинг:
0

Patrice T

Цитата:
проблема в том, что пока цикл не завершается, я не знаю почему

Причина в том, что конечное условие никогда не выполняется.
while(headA!=NULL && headB!=NULL)

Подумайте о логике. Когда предполагается, что переменные равны нулю ?
Используйте отладчик, чтобы увидеть, есть ли у последнего элемента связанного списка указатель на next это ноль или нет.
Дальнейшая отладка:
попробуйте заменить:
cout<<l.CompareLists();

около:
cout<<l.CompareLists();
cout<<l.CompareLists();

возможно, вас ждет сюрприз.