链表处理* -链表

编写一个函数,给定的带有头结点的单向链表 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 */  
  53. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
     /*编写一个函数,给定的带有头结点的单向链表 head,
     给定某结点的数据域值 m,将该结点移到链首。
    结构的定义:
    typedef struct node
    {
      int num;
      struct node *next;
    } SNODE;
    函数的原型:SNODE *movenode(SNODE *head, int m);
    其中:参数 head 是单向链表的头指针;参数 m 是某结点的num成员的值。*/
    #include <stdio.h>  
    #include <stdlib.h>  
    typedef struct sdata  
    {  int num;  
       struct sdata *next;  
    } SNODE;  
      
    void movenode( SNODE * head, int m)
    {
    	SNODE *p, *templ;
    	p = head->next;
    	templ = head;
    	
    	for(int i = 1;i < m;i ++)
    	{
    		if(p->next == NULL)
    			goto exit;
    		p = p->next;
    		templ = templ->next;
    	}
    	templ->next = p->next;
    	p->next = head->next;
    	head->next = p;
    	exit:
    	;
    	
    }  
      
    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;  
    }  
      
    /* PRESET CODE END - NEVER TOUCH CODE ABOVE */ 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值