c-如何将列表的第一个元素放在末尾



我的链表有问题。我只想把第一个元素结束,但我不知道该怎么做。感谢您的帮助

typedef struct Element Element_t;
struct Element
{
int nbr;
Element_t *next;
};

这是我把第一个元素放到最后的功能。但这只是第一个元素,我不知道最后该怎么说。

void my_ra(Element_t **l_a)
{
Element_t *temp;
if ((*l_a) && (*l_a)->next)
*l_a = (*l_a)->next;
}

第一个列表是当我什么都不做的时候,第二个列表是我试图把第一个元素放在最后的时候。

1 2 9 4 5 $
2 9 4 5 $

函数可以通过以下方式定义

void my_ra(Element_t **l_a)
{
if ( *l_a != NULL && ( *l_a )->next != NULL )
{
Element_t *tmp = *l_a;
*l_a = ( *l_a )->next;

tmp->next = NULL;
while ( *l_a != NULL ) l_a = &( *l_a )->next;
*l_a = tmp;
}
}

的这部分功能

while ( *l_a != NULL ) l_a = &( *l_a )->next;
*l_a = tmp;

可以替换此代码段。

Element_t *current = *l_a;
while ( current->next != NULL ) current = current->next;
current->next = tmp;

在这种情况下,功能将看起来像

void my_ra(Element_t **l_a)
{
if ( *l_a != NULL && ( *l_a )->next != NULL )
{
Element_t *tmp = *l_a;
*l_a = ( *l_a )->next;

tmp->next = NULL;
Element_t *current = *l_a;
while ( current->next != NULL ) current = current->next;
current->next = tmp;
}
}

这是一个示范节目。

#include <stdio.h>
#include <stdlib.h>
typedef struct Element Element_t;
struct Element
{
int nbr;
Element_t *next;
};
int push( Element_t **l_a, int nbr )
{
Element_t *new_element = ( Element_t * )malloc( sizeof( *new_element ) );
int success = new_element != NULL;
if (success)
{
new_element->nbr = nbr;
new_element->next = *l_a;
*l_a = new_element;
}
return success;
}
void display( const Element_t *l_a )
{
for (; l_a != NULL; l_a = l_a->next)
{
printf( "%d -> ", l_a->nbr );
}
puts( "null" );
}
void my_ra( Element_t **l_a )
{
if (*l_a != NULL && ( *l_a )->next != NULL)
{
Element_t *tmp = *l_a;
*l_a = ( *l_a )->next;
tmp->next = NULL;
while (*l_a != NULL) l_a = &( *l_a )->next;
*l_a = tmp;
}
}
int main( void )
{
Element_t *l_a = NULL;
enum { N = 10 };
for (int i = N; i != 0; i--)
{
push( &l_a, i );
}
display( l_a );
do
{
my_ra( &l_a );
display( l_a );
} while (l_a->nbr != 1);
}

程序输出为

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> null
2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 1 -> null
3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 1 -> 2 -> null
4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 1 -> 2 -> 3 -> null
5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 1 -> 2 -> 3 -> 4 -> null
6 -> 7 -> 8 -> 9 -> 10 -> 1 -> 2 -> 3 -> 4 -> 5 -> null
7 -> 8 -> 9 -> 10 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null
8 -> 9 -> 10 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> null
9 -> 10 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> null
10 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> null
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> null

谢谢,但如果我只想用这样的简单指针

Element_t *l_a

我试着这么做,但没用!

void my_ra(Element_t *list)
{
Element_t *temp1 = list;
Element_t *temp2 = NULL;
while (list->next->next != NULL)
list = list->next;
temp2 = list->next;
temp2->next = temp1->next;
temp1->next = NULL;
list->next = temp1;
}

让我和以前一样第一个列表:1 2 3 4编译后:1

谢谢你的帮助

相关内容

  • 没有找到相关文章

最新更新