2013-02-21 4 views
0

Вот мой код:Связанный список не перекручивание правильно

void setUpEachFlechette(int numFlechettes){ 

int i = 0; 
int totalNum = 0; 

Flechette* next; 
Flechette* head; 
Flechette* pEnd; 
Flechette* temp; 

    while(numFlechettes != i){ 

     double x = getRandomNumberX(); 
     double y = getRandomNumberX(); 
     double z = getRandomNumberZ(); 


     if(i != 0) 
      temp = next; 

     next = new Flechette; 

     next->setXYZ(x, y, z); 

     if(i == 0) 
      head = next; 
     else 
      next->link = temp; 

     i++; 

     next->display(); 

    } 


cout<<"\nThe total number of flechettes is "<<totalNum<<endl<<endl; 

char yes = NULL; 

cout<<"Ready? "; 
cin>>yes; 

i = 0; 

next->link = NULL; 
next = head; 
while(next != NULL){ 

    next->display(); 
    next = next->link; 

    i++; 

} 

}

По какой-то причине, когда я циклически связанный список, он только отображает первые 4 узлов в списке и он продолжает повторять первые четыре. Я также не могу довести его до нулевого значения, поэтому я могу запустить его через цикл while (next! = Null). Мне было интересно, почему моя кодировка не проходит через все Flechettes? Для справки, он должен зацикливаться на 20 разных флештях, а не только на 4 раза.

Я думаю, что функции довольно понятны. Если они не дадут мне знать, и я объясню их вам.

Спасибо за вашу помощь

P.S. Я только сейчас изучаю указатели и связанные списки, поэтому, пожалуйста, со мной.

+2

Отладчик - ваш друг. Используйте его, чтобы выполнить код за строкой, чтобы узнать, что произойдет. –

+0

Я только начал смотреть на отладчик. Должен влезть в него еще. –

ответ

1

Вы не изменяете переменную totalNum перед печатью. Также я думаю, что код должен быть таким

void setUpEachFlechette(int numFlechettes){ 

int i = 0; 
int totalNum = 0; 

Flechette* next; 
Flechette* head; 
Flechette* pEnd; 
Flechette* temp; 
srand (time(NULL)); 
    while(numFlechettes != i){ 

     int x = rand(); 
     int y = rand(); 
     int z = rand(); 


     if(i != 0) 
      temp = next; 

     next = new Flechette; 

     next->setXYZ(x, y, z); 

     if(i == 0) 
      head = next; 
     else 
      temp->link = next; 

     i++; 

     next->display(); 

    } 

totalNum = numFlechettes; 
cout<<"\nThe total number of flechettes is "<<totalNum<<endl<<endl; 

char yes; 

cout<<"Ready? "; 
cin>>yes; 

i = 0; 

next->link = NULL; 
next = head; 
while(next != NULL){ 

    next->display(); 
    next = next->link; 

    i++; 

} 
} 

В исходном коде head узел будет последним узлом и head->next будет NULL

Я ожидаю, что вы правильно инициализировать переменную-член link с NULL внутри конструктора от Flechette

+0

Если я изменю его на temp-> link = next; он выводит первый узел adn, а затем второй nodex19 –

+0

вы можете объяснить «тогда второй nodex19» ... Я ожидаю, что ваши функции конструктора и отображения верны. Вы написали конструктора для Flechette ?? – 999k

+0

все, что у меня было для конструктора: Flechette :: Flechette() {link = NULL;} –

0

Существует два способа обработки простых односвязных списков. Одна из них всегда добавляют во главе списка, и это самый простой способ:

struct Node 
{ 
    Node* next; 

    Node() 
     : next(nullptr) // Make sure the `next` pointer is not pointing anywhere 
     {} 
}; 

Node* head = nullptr; 

while (add_one_more_node()) 
{ 
    Node* newNode = new Node; 

    // Make the `next` point to the old head 
    newNode->next = head; 

    // Make the head point to the new node 
    head = newNode; 
} 

Второй способ следить последнего узла в списке, а также, и вставить в конце. Это немного сложнее:

// Assume `Node` structure as in above example 

Node* head = nullptr; 
Node* tail = nullptr; 

while (add_one_more_node()) 
{ 
    Node* newNode = new Node; 

    if (tail == nullptr) 
    { 
     // List is empty 
     head = tail = newNode; 
    } 
    else 
    { 
     // List is not empty 

     // Make the current tails next link point to the new node 
     tail->next = newNode; 

     // Make the new node the next tail 
     tail = newNode; 
    } 
} 

С обоими способами, вы можете использовать один и тот же цикл для итерации по списку:

// Loop over the list 
for (Node* node = head; node != nullptr; node = node->next) 
{ 
    // ... 
} 

Чтобы освободить список, вам нужно немного более сложный цикл, так вы не освобождаете узел до того, как получите следующий указатель:

for (Node* node = head, *next; node != nullptr; node = next) 
{ 
    // Next node to iterate to 
    next = node->next; 

    // Free the current node 
    delete node; 
} 
Смежные вопросы