C语言-链表指针有关问题

C语言-链表指针问题
有道练习题是:编写一个函数,把给定链表中的最小数据项移到该表中的第一个节点。

//list.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "list.h"


link initList(int N)
{
struct node head;
int i;
link t,a = &head;

srand(time(NULL));
for(i = 0,t = a;i < N;i++)
{
t->next = malloc(sizeof *t);
t = t->next;
t->next = NULL;
t->item = rand()%100;
}
return a;
}

void printList(link t)
{
t = t->next;
while(t != NULL)
{
printf("%d ",t->item);
t = t->next;
}
printf("\n");
}


void findMin(link t)
{
link u,pre,min;
u = t->next;
pre = t;
min = u;

while(u->next != NULL)
{
if(u->next->item < min->item)
{
min = u->next;
}
u = u->next;
}

if(min != t->next)
{
pre->next = min->next;
min->next = t->next;
t->next = min;
}

}



//list.h
typedef struct node* link;
struct node{
int item;
link next;
};

link initList(int);
void printList(link);
void findMin(link);



#include <stdio.h>
#include "list.h"

main(int argc,char *argv[])
{
int i,N = atoi(argv[1]);
link t,x,head;
head = initList(N);
printList(head);
findMin(head);
printList(head);
}


编译上面的代码,运行./list 3
结果输出为 
1.
99 41 70
41 70
2.
54 83 26
26

之后我调试程序,发现运行findMin函数的时候,运行

while(u->next != NULL)
{
if(u->next->item < min->item)
{
min = u->next;
}
u = u->next;
}

这段代码的时候,链表的头指针的t->next会发生变化,但好像我没有更改到t->next。
求解!!
C 链表 指针

------解决方案--------------------
首先这个用法就错了
        struct node head;
        int i;
        link t,a = &head;  
a指的空间在栈去,函数返回就没了。