链表基础应用-51.链表处理



51. 链表处理*

成绩 5 开启时间 2015年01月6日 Tuesday 10:00
折扣 0.8 折扣时间 2015年01月12日 Monday 23:55
允许迟交 关闭时间 2015年01月12日 Monday 23:55

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

结构的定义:

typedef struct node
{
  int num;

  struct node *next;
} SNODE;

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

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

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

预设代码

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

void movenode(SNODE *head, int m)
      {
      	SNODE* t,* q;
      	t=head;
      	int len=0;
      	while(t->next!=NULL)
      	{
      		t=t->next;
      		len++;
      	}
      	t=head;//最开始用t找完长度后忘了initialize了 结果就是debug了很久 真的很久 盯着看了很久 = = 还上overstackflow发帖问被国外的大神指出了一大堆不足。
      	if(!(m>len||m==0||m==1))
      	{
      		while(t->next->num!=m)
      			t=t->next;
      	
      			q=t->next;
      			t->next=q->next;
         		free(q);
         		SNODE * T;
         		T = ( SNODE * ) malloc( sizeof( SNODE ) );
         		T->next=head->next;
         		head->next=T;
         		T->num=m;
      	}
      }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值