Begineer: первая программа для кругового односвязного списка,

Он возвращает только адрес, без каких-либо ошибок отладчика, хотя мой компилятор DEV C ++ и Code :: Blocks показывает ошибки windows send dont send, но они инициализируют только объект класса, я включил код, может кто-нибудь сказать мне, почему это происходит

#include <iostream>
#include <conio.h>
using namespace std;
struct Node
{
int data;
Node *nextptr;
};class CLLIST{

private:

Node*firstptr;
Node*lastptr;

public:
CLLIST(){

cout << "Constructor Called !";
firstptr=lastptr=NULL;
}

void insert_at_back(int val){

if(firstptr==NULL) //it means start of C.LIST
{
Node*temptr = new Node; //means firstptr = temptr
firstptr->data=val;
firstptr=temptr;
firstptr->nextptr=firstptr;
} else{

Node*temp1 = new Node;
Node*temp2 = new Node;

temp1 = firstptr;
while(temp1->nextptr!=firstptr) //traversing
{
temp2 = temp1->nextptr;
temp2->data = val; //inserted at back
temp2->nextptr=firstptr; //circle completed
}
}
}

void printit(){

// functiont o print all the circular link lists data
Node*temp3ptr= new Node;
temp3ptr = firstptr;

while(temp3ptr->nextptr!=firstptr)//traversing
{
cout << temp3ptr->data;
cout << endl;
}
}
};int main()
{
CLLIST obj1;

obj1.insert_at_back(10);
obj1.insert_at_back(20);
obj1.insert_at_back(30);

obj1.printit();

cout << "Done !";

getch();
}

0

Решение

Несколько проблем с вашим текущим кодом (может быть больше, но вы должны сосредоточиться на их решении в первую очередь)


Выпуск 1:

         if(firstptr==NULL) //it means start of C.LIST
{
Node*temptr = new Node; //means firstptr = temptr
firstptr->data=val;
firstptr=temptr;
firstptr->nextptr=firstptr;
} else{

^ С firstptr->data=val; вы разыменовываете firstptr хотя это все еще NULL, Поменяйте местами следующую строку:

         if(firstptr==NULL) //it means start of C.LIST
{
Node*temptr = new Node; //means firstptr = temptr
firstptr=temptr;
firstptr->data=val;
firstptr->nextptr=firstptr;
} else{

Или еще лучше: firstptr = new Node; прямо и пропустить temptr


Выпуск 2:

     Node*temp1 = new Node;
Node*temp2 = new Node;

temp1 = firstptr;
while(temp1->nextptr!=firstptr) //traversing
{
temp2 = temp1->nextptr;
temp2->data = val; //inserted at back
temp2->nextptr=firstptr; //circle completed
}

^ Это утечка памяти; new выделяет для них память в куче, чьи адреса теряются при назначении временных узлов для указания firstptr, Просто объявить temp1 а также temp2 вместо:

     Node*temp1;
Node*temp2;

Выпуск 3:

    while(temp1->nextptr!=firstptr)

^ этот цикл while никогда не запустится, потому что:

  • Вы начинаете с firstptr как ноль
  • Затем вы добавляете узел, и firstptr->next указывает на firstptr,
  • Затем, когда вы попытались добавить 2-й узел, он выполняет работу по назначению temp1 = firstptr;, но цикл while не запускается, потому что firstptr->next == firstptr

Выпуск 4:

Как отметил @aleguna:

       Node*temp3ptr= new Node;
temp3ptr = firstptr;

^ Это еще одна утечка памяти по той же причине, что и в выпуске 2. Просто объявите temp3ptr вместо:

       Node*temp3ptr;

Выпуск 5:

       while(temp3ptr->nextptr!=firstptr)//traversing
{
cout << temp3ptr->data;
cout << endl;
}

^ Здесь вам нужен способ на самом деле выполнять итерацию по всему циклически связанному списку, сейчас он просто многократно печатает 1-й узел (ну, технически другие части вашего кода пока не позволяют добавить 2-й узел в связанный список, либо )

Что-то вроде:

       while(temp3ptr->nextptr!=firstptr)//traversing
{
cout << temp3ptr->data;
cout << endl;
// Can technically do it without the if-check since this
// is circular, but better to code defensively.
if (temp3ptr->next != NULL) {
temp3ptr = temp3ptr->next;
}
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]