链表处理* -链表

编写一个函数,给定的带有头结点的单向链表 head,给定某结点的数据域值 m,将该结点移到链首。

结构的定义:

typedef struct node
{
  int num;
  struct node *next;
} SNODE;

函数的原型:SNODE *movenode(SNODE *head, int m);

其中:参数 head 是单向链表的头指针;参数 m 是某结点的num成员的值。

例如输入结点数 n=7,则将结点数值域值 m=5 的结点移动到链首。函数运行前后链表的情况如下图所示。

预设代码

前置代码

view plainprint?

  1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4.   
  5. typedef struct sdata  
  6. {  int num;  
  7.    struct sdata *next;  
  8. } SNODE;  
  9.   
  10. void movenode( SNODE *, int );  
  11.   
  12. void setlink( SNODE * head, int n )  
  13. {     
  14.     SNODE *p;  
  15.   
  16.     while ( n > 0 )  
  17.     {   p = ( SNODE * ) malloc( sizeof( SNODE ) );  
  18.         p->num = n;  
  19.         p->next = head->next;  
  20.         head->next = p;  
  21.         n --;  
  22.     }  
  23. }  
  24.   
  25. void outlink( SNODE * head )  
  26. {  
  27.     while( head->next != NULL )  
  28.     {  
  29.         head = head->next;  
  30.         printf( "%d,", head->num );  
  31.     }  
  32.     return;  
  33. }  
  34.   
  35. int main( )  
  36. {   int n, m;  
  37.     SNODE * head = NULL;  
  38.   
  39.     scanf("%d%d", &n, &m );  
  40.     head = ( SNODE * ) malloc( sizeof( SNODE ) );  
  41.     head->num = -1;  
  42.     head->next = NULL;  
  43.     setlink( head, n );  
  44.   
  45.     movenode( head, m );   /* This is waiting for you. */  
  46.   
  47.     outlink( head );  
  48.     printf("\n");  
  49.     return 0;  
  50. }  
  51.   
  52. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */  
测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 7 5↵
以文本方式显示
  1. 5,1,2,3,4,6,7,↵
1秒64M0
测试用例 2以文本方式显示
  1. 1 1↵
以文本方式显示
  1. 1,↵
1秒64M0
测试用例 3以文本方式显示
  1. 3 3↵
以文本方式显示
  1. 3,1,2,↵
1秒64M0
测试用例 4以文本方式显示
  1. 10 0↵
以文本方式显示
  1. 1,2,3,4,5,6,7,8,9,10,↵
1秒64M0
测试用例 5以文本方式显示
  1. 10 20↵
以文本方式显示
  1. 1,2,3,4,5,6,7,8,9,10,↵
1秒64M0
测试用例 6以文本方式显示
  1. 8 7↵
以文本方式显示
  1. 7,1,2,3,4,5,6,8,↵
1秒64M0
测试用例 7以文本方式显示
  1. 8 2↵
以文本方式显示
  1. 2,1,3,4,5,6,7,8,↵
1秒64M0

代码实现:

 
#include <stdio.h>  
#include <stdlib.h>  
  
typedef struct sdata  
{  int num;  
   struct sdata *next;  
} SNODE;  
  
void movenode( SNODE *, int );  
  
void setlink( SNODE * head, int n )  
{     
    SNODE *p;  
  
    while ( n > 0 )  
    {   p = ( SNODE * ) malloc( sizeof( SNODE ) );  
        p->num = n;  
        p->next = head->next;  
        head->next = p;  
        n --;  
    }  
}  
  
void outlink( SNODE * head )  
{  
    while( head->next != NULL )  
    {  
        head = head->next;  
        printf( "%d,", head->num );  
    }  
    return;  
}  
  
int main( )  
{   int n, m;  
    SNODE * head = NULL;  
  
    scanf("%d%d", &n, &m );  
    head = ( SNODE * ) malloc( sizeof( SNODE ) );  
    head->num = -1;  
    head->next = NULL;  
    setlink( head, n );  
  
    movenode( head, m );   /* This is waiting for you. */  
  
    outlink( head );  
    printf("\n");  
    return 0;  
}  
  
void movenode(SNODE * head,int m) 
{
	SNODE * p, * q;
	p=head;
	q=head->next;
	while(q!=NULL)
	{
		if(q->num==m)
		{p->next=q->next;
			q->next=head->next;
			head->next=q;
			break;
		}
		else
		{
			p=q;
			q=q->next;
		}
	}
}

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值