链表,结构体,文件输出

现有结构体定义如下:
struct stuInfo
{
char id[12]; //数据成员
char name[15];
float score;

struct stuInfo *next;   //指针成员

};
任务及要求:
(1)首先完成线性链表的定义和创建,确保链表的第一个节点为哨兵节点,不存放有效的数据;
(2)利用文件的相关操作,动态开辟节点存储空间,将存放在磁盘某个路径中的文件“stuinfo.txt”信息逐条读入,并依次存入到线性链表的每个节点中,信息如下;
00001 张三 100
00002 李四 99
00003 王五 100
00004 王六 89
00005 江涛 98
00006 陈琪 88
00007 祁廷 91
(3)接下来,将学号为‘00004’的节点删除;
(4)再接下来,利用冒泡排序,对链表继续升序排序;
(5)将完整的线性链表信息从头到尾依次存储到磁盘某个路径下的“score.txt”文件中,存储格式和“stuinfo.txt”文件相同。
(6)最终将“score.txt”的内容复制粘贴到实验报告的实验结果中。

struct stuInfo
{
char id[12]; //数据成员
char name[15];
float score;
struct stuInfo *next;   //指针成员
};
struct stuInfo *head = NULL;

struct stuInfo * create()
{
  FILE *fp = fopen("student.txt","r");
  if(fp == NULL)
    return NULL;
  struct stuInfo *p;
  p = head = (struct stuInfo *)malloc(sizeof(struct stuInfo));
  char buf[100];
  while(fgets(buf,100,fp))
  {
    struct stuInfo * q = (struct stuInfo *)malloc(sizeof(struct stuInfo));
    sscanf(buf,"%s %s %f",q->id,q->name,&q->score);
    q->next = NULL;
    p->next = q;
    p = q;
  }
  fclose(fp);
  return head;
}
void del()
{
  printf("请输入需要删除的学号:");
  char id[12];
  scanf("%s",id);
  struct stuInfo * p = head->next;
  struct stuInfo * prev =  p;
  while(p != NULL)
  {
    if(strcmp(p->id,id) == 0)
    {
      prev->next = p->next;
      free(p);
      return;
    }
    prev = p;
    p = p->next;
  }
}