C语言:谁能告诉我为什么输出成绩为零(是struct Student *create()里的问题),部分代码未编写完(后续操作和删除一个学生成绩代码没有编写)顺便带我把删除一个学生成绩的代码编了有奖


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

struct Student{
    char name[10];
    float grade;
    struct Student *next;
} ;

struct Student *create()
{
   struct Student *head, *current, *next;
   char str[10];
   float a;
   char flag;
    printf("请输入学生姓名:\n");
    scanf("%s", str);
    getchar();
     printf("请输入学生成绩:\n");
     scanf("%f", &a);
    getchar();
    head = (struct Student *)malloc( sizeof(struct Student) );
    strcpy( head->name, str );
    head->grade=a;
   current = head;
    printf("是否继续输入:(y/n)");
    scanf("%c", &flag);

    while( flag != 'n' )
    {
        printf("请输入学生姓名\n");
        scanf("%s", str);
        getchar();
        printf("请输入学生成绩:\n");
        scanf("%f",&a);
            getchar();
        next = (struct Student *)malloc( sizeof(struct Student) );
        strcpy( next->name, str );
        next->grade=a;
        current->next = next;
        current = next;
        printf("是否继续输入:(y/n)");
        scanf("%c", &flag);
    }
     current->next = NULL;
     return head;
}


void list(struct Student *p)
{       printf("姓名    成绩\n");
    while(1)
    {
        printf("%s          %d \n", p->name,p->grade);

        if( p->next != NULL )
        {
            p = p->next;
        }else
        {
            break;
        }
    }
}


void insert(struct Student *p)
{
    struct Student *insert, *current;
    char str[10];
    float a;
    int position;
    current = p;
    printf("\n请输入要补充的学生姓名\n");
    scanf("%s", str);
    getchar();
       printf("\n请输入要补充的学生成绩\n");
        scanf("%f", &a);
    insert = (struct Student *)malloc( sizeof(struct Student) );
    strcpy( insert->name, str );
    insert->grade=a;
    printf("需要插入的位置为:\n");
    scanf("%d", &position);

    if( position > 0 )
    {
       while(position > 1)
        {
            current = current->next;
            position--;
        }
        insert->next = current->next;
        current->next = insert;        

    }else if ( position == 0 )
    {
    
        p = insert;
        insert->next = current;
    }
    
    printf("插入元素后最新的成员列表为:\n");
    list(p);
}



void cancel(struct Student *p)

{


    printf("请输入你要删除的学生姓名和成绩的位置:");
    
}




void main()
{   printf("                                             欢迎来到学生成绩管理系统!\n");
    printf("首先你需要依次录入学生姓名和成绩\n");
    
    struct Student *p;
    p = create();

    printf("\n你输入的学生姓名和成绩表格如下为:\n");
    list(p);
    printf("你是否需要补充或删除学生姓名和成绩?\n");
    int n;
    while (1)
    {   Xunhuan:
        printf("1.如果你需要补充学生姓名成绩的话请按1\n");
        printf("2.如果你需要删除学生姓名成绩的话请按2\n");
        printf("3.如果你不需要进行任何操作请按3\n");
        scanf("%d", &n);
        switch (n)
        {
        case 1:insert(p); break;
        case 2:cancel(p); break;
        case 3:break ;
        default:printf("您输入错误,请按格式重新输入!"); 
                goto Xunhuan;
                break;
        }
        printf("\n");
    char m;
    while(1)
    {
        printf("请你确认是否有误(正确请按y进行其他操作,错误请按n返回修改)\n");
        scanf("%c", &m);
        if(m==n)
        {goto Xunhuan;
        }
        else {  printf("如果");
        
        
        
        
        }
    
    }
  }
}

修改完善如下,供参考:

#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct Student{
    char name[10];
    float grade;
    struct Student *next;
} ;
struct Student *create()
{
   struct Student *head, *current, *next;
   char str[10];
   float a;
   char flag;
   printf("请输入学生姓名:\n");
   scanf("%s", str);
   getchar();
   printf("请输入学生成绩:\n");
   scanf("%f", &a);
   getchar();
   head = (struct Student *)malloc( sizeof(struct Student) );
   strcpy( head->name, str );
   head->grade=a;
   current = head;
   printf("是否继续输入:(y/n)");
   scanf("%c", &flag);
   while( flag != 'n' )
   {
        printf("请输入学生姓名\n");
        scanf("%s", str);
        getchar();
        printf("请输入学生成绩:\n");
        scanf("%f",&a);
        getchar();
        next = (struct Student *)malloc( sizeof(struct Student) );
        strcpy( next->name, str );
        next->grade=a;
        current->next = next;
        current = next;
        printf("是否继续输入:(y/n)");
        scanf("%c", &flag);
   }
   current->next = NULL;
   return head;
}
 
void list(struct Student *p)
{
    if(p == NULL) return;
    printf("姓名             成绩\n");
    while(1)
    {
        printf("%s            %f \n", p->name,p->grade);//printf("%s  %d \n", p->name,p->grade);
        if( p->next != NULL )                           //修改
        {
            p = p->next;
        }else
        {
            break;
        }
    }
}
 
struct Student * insert(struct Student *p)
{
    struct Student *insert, *current,*pre=NULL;
    char str[10];
    float a;
    int position,i=0;
    if(p == NULL)
    {
        printf("表为空,无法插入!\n");
        return NULL;
    }
    printf("需要插入的位置为:\n");
    scanf("%d", &position);
    if(position < 1 )
    {
        printf("插入位置非法!\n");
        return p;
    }
    current = p;
    while(current && i < position-1)
    {
        pre = current;
        current = current->next;
        i++;
    }
    if (!current)
    {
        printf("插入位置非法!\n");
        return p;
    }
    insert = (struct Student *)malloc( sizeof(struct Student));
    printf("\n请输入要补充的学生姓名\n");
    scanf("%s",insert->name);
    getchar();
    printf("\n请输入要补充的学生成绩\n");
    scanf("%f", &insert->grade);
    if(current ==p)
    {
        p = insert;
        insert->next = current;
    }
    else{
        insert->next =  pre->next;
        pre->next = insert;
    }
    return p;
}

struct Student * cancel(struct Student *L)
{
    char str[10];
    struct Student *s=NULL,*q=NULL,*p=L;
    if(L == NULL)
    {
        printf("表为空,无记录!\n");
        return NULL;
    }
    printf("请输入你要删除的学生姓名:");
    scanf("%s",str);
    while(p!=NULL)
    {
        if(strcmp(p->name,str)==0)
        {
            q=p;//q即为被删除的节点;
            if(p == L){
               if(L->next != NULL){
                  L = L->next;
                  p = L;
               }
               else{
                  L = NULL;
                  p = NULL;
                  free(q);
                  return L;
               }
            }
            else{
               s->next = p->next;
               p = s;
            }
            free(q);//释放被删除节点的空间;
        }
        s = p;
        p=p->next;
    }
    if(p == NULL) printf("未找到要删除的学生记录!\n");
    return L;
}


int  main()
{
    printf("                                             欢迎来到学生成绩管理系统!\n");
    printf("首先你需要依次录入学生姓名和成绩\n");
    struct Student *p;
    p = create();
    printf("\n你输入的学生姓名和成绩表格如下为:\n");
    list(p);
    printf("\n你是否需要补充或删除学生姓名和成绩?\n");
    int n;
    while (1)
    {
        printf("1.如果你需要补充学生姓名成绩的话请按1\n");
        printf("2.如果你需要删除学生姓名成绩的话请按2\n");
        printf("3.如果你不需要进行任何操作请按3\n");
        scanf("%d", &n);
        switch (n)
        {
            case 1:p=insert(p);list(p);break;
            case 2:p=cancel(p);list(p);break;
            case 3:break ;
           default:printf("您输入错误,请按格式重新输入!");
                   break;
        }
        printf("\n");
        char m;
        printf("请你确认是否还需其他操作('是 '请按y进行其他操作,'否'请按n退出系统)\n");
        getchar();
        scanf("%c", &m);
        if(m == 'n') break;
    }
    return 0;
}

你为啥老是struct Student连用呢,struct定义一个结构体,后面直接用结构体名就行了。

能先说说问题解决的话的“有奖”的具体内容么?别光口花花