this is the structure of my node
typedef struct Node{
int x;
Node* Next;
};
// in main() i can make the head pointer,and assign it to NULL i-e
Node* start_pointer=NULL; //this line is in my main() function
// and i consider it head pointer
void add_node(Node* start_pointer){
Node first;
cout<<"Enter the value of X\n ";
cin>>first.x;
if (start_pointer==NULL){
start_pointer=&first; //try to assign an address of object of its pointer
first.Next=NULL;
}
else {
Node* temp=start_pointer;
while (temp->Next != NULL){ //program is break at this stage
temp=temp->Next;}
temp->Next=first.Next;
first.Next=NULL;
}
Я назначаю адрес узлу * и пытаюсь поймать его с помощью оператора "->", это нормально? каждый раз, когда я запускаю функцию add_node, она выполняется, но, к сожалению, она не переходит в другое условие
В вашем коде есть две разные вещи
Во-первых, вы должны выделить новые узлы в add_node, а не принимать адрес локальной переменной.
Вместо этого
start_pointer=&first;
first.Next=NULL;
вы должны иметь это
start_pointer=new Node;
start_pointer->Next=NULL;
Принимать адрес first
не так, потому что first
уничтожается при выходе из функции. Таким образом, start_pointer будет указывать на объект, который был уничтожен, и ваша программа выйдет из строя. Но объекты, выделенные new
жить до тех пор, пока вы их не delete
.
Вторая ошибка заключается в том, что ваша функция меняет start_pointer
в функции add_node
. Он не меняет start_pointer
в main
функции. Эти две переменные могут иметь одно и то же имя, но они являются совершенно разными переменными. Вот почему ваш код никогда не входит в другую часть add_node
. Чтобы изменить start_pointer в главном, вам нужно изменить функцию add_node
чтобы использовать ссылку, добавив &
после типа.
void add_node(Node*& start_pointer){ // use a reference
Теперь start_pointer в add_node является ссылкой на start_pointer в main, поэтому изменения в start_pointer в add_node будут влиять на start_pointer в main.
Эта функция:
void add_node (Node* start_pointer) {
Node first;
...
start_pointer = &first;
first.Next=NULL;
}
хранит адрес локальной переменной (объект с автоматической продолжительностью хранения), который существует только во время выполнения этой функции. Когда выполнение выходит из области видимости, first
уничтожается, и ваш указатель становится недействительным ~> если вы попытаетесь получить доступ к этому указателю, это приведет к неопределенному поведению.
Возможным решением может быть назначение Node
динамически:
start_pointer = new Node();
start_pointer->Next = NULL;
просто не забудьте освободить эту память, вызвав delete
в какой-то момент.