C语言 单链表遇到一些问题,指针指向NULL

问题:temp指针为空,想问一下该如何修改,我现在创建新的结点,temp的指针仍然为NULL 没有返回值
#define _CRT_SECURE_NO_WARNINGS 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//定义一个结构体,结构体内包含学生的学号、姓名、专业、成绩、总成绩
typedef struct{
    char num[16];
    char name[16];
    char major[16];
    float score[5];
    float sum;
    struct link* next;
    struct link* pre;
}link;

//查找
link* find(link* temp) {
    char name[16];
    printf("请输入需要查找的学生姓名:");
    scanf("%s", name);
    if (temp == NULL)
    {
        printf("\n\n\n当前通讯录为空!查找失败!\n\n\n\n");
        return;
    }
        while (temp->next != NULL && strcmp(name, temp->name) == 0) {
        temp = temp->next;
    }
    return temp;        //返回目标地址
}

//添加
void add(link *temp1,link *temp2) {                // temp1 开始时为 head
    if (temp1 == NULL) {
        temp1 = temp2;
        return;
    }
    if (temp1->next != NULL) {
        link* temp;
        temp = temp1->next;
        while (temp->next != NULL) {
            temp = temp->next;}
        temp->next = temp2;
    }
    else temp1->next = temp2;
    temp2->pre = temp1;
}

//删除
void delete(link* head,link* temp) {        //传入需要删除的参数

    if (head == temp) {            //当删除目标为第一个时
        head = temp->next;
        free(temp);
        head->pre = NULL;
        return;
    }

    if (temp->next == NULL) {
        link* temp1 = temp->pre;
        free(temp);
        temp1->next = NULL;
        return;
    }

    link* temp1 = temp->pre;    //保存前面的链表结点
    link* temp2 = temp->next;    //保存后面的链表结点

    temp1->next = temp2;        //前链后
    temp2->pre = temp1;            //后链前

    free(temp);
}

//
link* creat1() {
    link* temp;
    temp = (link*)malloc(sizeof(link));
    temp->next = NULL;
    temp->pre = NULL;
    printf("\n正在添加学生信息!\n");
    printf("请输入学生学号:");
    scanf("%s", &temp->num);
    printf("请输入学生姓名:");
    scanf("%s", &temp->name);
    printf("请输入学生专业:");
    scanf("%s", &temp->major);
    temp->sum = 0;
    for (int i = 1; i <= 5; i++) {
        printf("请输入第%d门课程成绩:",i);
        scanf("%f", &temp->score[i - 1]);
        temp->sum += temp->score[i - 1];
    }
    printf("\n\n\n已成功添加%s学生的信息\n\n\n", temp->name);
    return temp;
}
/*
link* creat2() {
    int length;
    link* initial;
    printf("Input you need length of this linklist :");
    scanf("%d", &length);
    initial = creat1();
    for (int i = 1; i < length; i++) {
        add(initial,creat1());
        printf("第%d次add成功", i);
    }
    return initial;
}*/
//显示当前系统内的学生
void show(link* temp1) {
    link* temp = temp1;
    if (temp1 == NULL)
    {
        printf("\n\n\n当前系统没有学生信息,请手动添加!\n\n\n\n");
        return;
    }
        while (temp->next != NULL) {
            temp = temp->next;
            printf("学号=%s    名字=%s    专业=%s", temp->num, temp->name, temp->major);
            for (int i = 0; i < 5; i++)
                printf("第%d门成绩为%7.1f", (i + 1), temp->score[i]);
            printf("总分:%3.1f", temp->sum);
            printf("\n");
        }

}

void menu(){
    link *head = (link*)malloc(sizeof(link));
    head = NULL;
    link* temp = head;
    int i; while (1) {
        printf("1.查看全部学生成绩\n");
        printf("2.添加学生信息\n");
        printf("3.删除学生信息\n");
        printf("4.修改学生信息\n");
        printf("5.清屏\n");
        printf("6.退出程序\n");
        printf("请输入你的选择:");

        scanf("%d", &i);
        switch (i) {
        case 1:
            show(head);                
            break;

        case 2:    
            add(head,creat1());            
            break;

        case 3:    
            delete(head,find(head));    
            break;

        case 4:
            temp = find(head);            
            break;

        case 5:    
            system("cls");                
            break;

        case 6:
            exit(0);                    
            break;

        default:
            printf("\n\n\n输入错误,请重新输入!\n\n\n\n");
        }
    }
}

void main(){
    menu();
}