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 的结点移动到链首。函数运行前后链表的情况如下图所示。
预设代码
前置代码
- /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
- #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;
- }
- /* PRESET CODE END - NEVER TOUCH CODE ABOVE */
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 4 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 5 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 6 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 7 | 以文本方式显示
| 以文本方式显示
| 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;
}
}