编写一个函数,将给定的带有头结点的单向链表的前m个节点移到链尾。
结构的定义:
struct node
{ int num;
struct node *next;
}
函数的原型:struct node *monenode( struct node *head,int m ), 其中:参数head 是单向链表的头指针;参数m 是要移动的节点数。函数的返回值是单向链表的头指针。
例如当m=4时:
其实要写的就是一个函数,我直接贴出完整的程序(预设代码+要求提交的程序)
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
#include
#include
typedef struct numLink
{
int no;
struct numLink *next;
}NODE;
NODE *monenode( NODE *head, int m );
void SetLink( NODE *h, int n )
{
NODE *p=NULL, *q=NULL;
int i;
for( i=0; i
{
p = (NODE *)malloc(sizeof(NODE));
p->no = i+1;
p->next = NULL;
if( h->next == NULL )
{
h->next = p;
q = p;
}
else
{
q->next = p;
q = q->next;
}
}
return;
}
int main( )
{
int n,m;
NODE *head=NULL, *q=NULL;
scanf("%d%d",&n,&m);
head = (NODE *)malloc(sizeof(NODE));
head->no = -1;
head->next = NULL;
SetLink( head, n );
q = monenode( head, m );
do
{
printf("%d ",q->next->no);
q = q->next;
}while( q->next != NULL );
printf("\n");
return 0;
}
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
NODE *monenode( NODE *head, int m )
{
NODE * p1,*p2,*p3;
int i=0;
p1 =p2=p3=head;
while(p1->next!=NULL && i
{
p1=p1->next;
i++;
}
if(p1->next != NULL)
{
//while结束后p1指向元素m
p2 = p1->next;
p1->next=NULL;
//把后面的元素放在前面
p1 = p2;
while(p1 != NULL)
{
p2 = p1->next; //暂存
p1->next = p3->next;
p3->next = p1;
p3=p3->next;
p1 = p2;
}
}
return head;
}