xuehualaoshu 2021-10-07 00:39 采纳率: 100%
浏览 73
已结题

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("如果");
        
        
        
        
        }
    
    }
  }
}
  • 写回答

3条回答 默认 最新

  • qzjhjxj 2021-10-07 14:18
    关注

    修改完善如下,供参考:

    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 已采纳回答 10月7日
  • 创建了问题 10月7日

悬赏问题

  • ¥15 outlook无法配置成功
  • ¥15 Pwm双极模式H桥驱动控制电机
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换