Он возвращает только адрес, без каких-либо ошибок отладчика, хотя мой компилятор 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();
}
Несколько проблем с вашим текущим кодом (может быть больше, но вы должны сосредоточиться на их решении в первую очередь)
Выпуск 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
,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;
}
}
Других решений пока нет …