Почему он печатает 012, а не 123 - PullRequest
1 голос
/ 18 октября 2019

Для домашней работы я должен создать узел из нескольких солдат и напечатать для n цифр, то есть 5, вывести от 1 до 5, затем от 5 до 1

прямо сейчас, если n равно 3 вместо 123, я получаю 012

Я пытался исправить указатели и цикл for ...

Spongebob* create_reverse_circle(int n)
{

   Spongebob *p= NULL;
   for (int i=0; i<n; i++)
   {
       //everytime a soldier is created, it goes in beg. of 
       push(&p,create_soldier(i));
   }
   printf("checkmate\n");
   return p;
}

void push(Spongebob **p, Spongebob* temp)
{
    if(*p==NULL)
    {
        temp->next = temp->prev = temp;
        *p = temp;
         return;
    }

    Spongebob *last = (*p)->prev;
    temp->next = *p;
    (*p)->prev = temp;
    temp->prev = last;
    last->next =temp;
}


Spongebob* rearrange_circle(Spongebob* head)
{
    Spongebob* temp = head;
    Spongebob* head2 = NULL;
    Spongebob* next = NULL;

    do
    {
        next = head->next;
        temp->next = head2->next;
        head2->next = temp;
        temp = head2->prev;
    }
    while(head!= NULL);

    if(temp != NULL ) 
        head2 = temp->prev; 

}

создал spongebob0
создал spongebob1
создал spongebob2
checkmate
0 1 2

это вывод, и я получаю дамп сегментации, если я пытаюсь переставить функцию окружности

1 Ответ

0 голосов
/ 18 октября 2019

прямо сейчас, если n равно 3 вместо 123, я получаю 012

Я думаю, это зависит от того, что create_soldier(i) делает со значением в i, но обратите внимание, что циклиспользует i значения от 0 до n-1, а не от 1 до n.

Возможно, вам следует изменить начальное и конечное значения цикла for на:

   for (int i=1; i<=n; i++)

я получаю дамп сегментации, если я пытаюсь использовать функцию перестановки окружности

Spongebob* rearrange_circle(Spongebob* head)
{
    Spongebob* temp = head;
    Spongebob* head2 = NULL;
    Spongebob* next = NULL;

    do
    {
        next = head->next;
        temp->next = head2->next;

^^^ Вы разыменовываете нулевой указатель head2.

        head2->next = temp;
        temp = head2->prev;
    }
    while(head!= NULL);

^^^ head!=NULL всегда будет истинным (в результате получается бесконечный цикл), если rearrange_circle() не был вызван с нулевым указателем (в этом случае предыдущий next = head->next; является разыменованием нулевого указателя.

    if(temp != NULL ) 
        head2 = temp->prev; 

^^^ Это в конце функции, и head2 сейчас не используется, поэтому вышеприведенное утверждение кажется немного бессмысленным.

}

Я не знаю, что rearrange_circle() должен делать, поэтому у меня нет предложений, как это исправить.

...