назначить адрес узлу * в списке ссылок?

0
   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, она выполняется, но, к сожалению, она не переходит в другое условие

Теги:
pointers
linked-list
structure

2 ответа

1

В вашем коде есть две разные вещи

Во-первых, вы должны выделить новые узлы в 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.

0

Эта функция:

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 в какой-то момент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню