为什么打印012而不是123

问题描述 投票:0回答:1

对于家庭作业,我必须创建一个由多个士兵组成的节点并打印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; 

}

创建的海绵bob0创建了spongebob1创建了spongebob2将军0 1 2

这是输出如果我尝试重新排列圆圈功能,则会得到分段转储]

c for-loop pointers doubly-linked-list circular-list
1个回答
0
投票

现在,如果n是3而不是123,我得到012

我想这取决于create_soldier(i)i中的值的处理,但是请注意,循环使用从0到n-1,而不是1到n的i值。

也许您应该将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将始终为true(导致无限循环),除非使用空指针调用了rearrange_circle()(在这种情况下,先前的next = head->next;是空指针取消引用。

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

^^^这是函数的结尾,并且现在不使用head2,所以上面的语句似乎没有意义。

}

我不知道rearrange_circle()应该做什么,所以我没有建议如何解决它。

© www.soinside.com 2019 - 2024. All rights reserved.