C语言链表输出有关问题,为什么会无故多出很多不相干的数据呢?还有小弟我这个程序为什么不可以按姓名查找呢?按专业也不可以,但是按学号可以,不知道

C语言链表输出问题,为什么会无故多出很多不相干的数据呢?还有我这个程序为什么不可以按姓名查找呢?按专业也不可以,但是按学号可以,不知道
#include "stdio.h "
#include "stdlib.h "
#include "string.h "
struct   student
{
        int   no;                             /*学号*/
        char   name[10];               /*姓名*/
        char   acdamic[20];           /*院系*/
        char   major[20];                 /*专业*/
        char   province[20];           /*籍贯*/
        char   address[40];               /*家庭地址*/
        long   phone;                             /*联系电话*/
        struct   student   *next;
};
struct   student   *input();
      void   print(struct   student   *h);
      struct   student   *insert(struct   student   *h);
      struct   student   *del(struct   student   *h);
      void   find4(struct   student   *h);
      void   find3(struct   student   *h);
      void   find2(struct   student   *h);
      void   find1(struct   student   *h);
      struct   student   *head=NULL;
      char   ch,*menu[]={ "------------------通讯录菜单------------ ",
                                  "1.----------建立学生通讯录--------------- ",
                                  "2.----------输出全部学生通讯录--------------- ",
                                  "3.----------增加的学生的个数--------------- ",
                                  "4.----------删除指定学号的学生-------------- ",
                                  "5.----------按系别查找学生信息------------- ",
                                  "6.----------按专业查找学生信息------------- ",
                                  "7.----------按姓名查找学生信息------------- ",
                                  "8.----------按学号查找学生信息-------------- ",
                                  "9.----------退出通讯录----------------------- "};
struct   student   *input()       /*输入函数*/
{
        int   n,i;
  struct   student   *h=NULL,*p,*q;
        printf( "请输入你要建立的学生通讯录的学生个数:\n ");