nyclsdbb 2023-04-17 21:24 采纳率: 50%
浏览 32
已结题

大一新手,请教,学生管理系统的程序

麻烦帮忙看看,万分感谢。
用c语言写的链表,主要是排名那个函数不知哪里出了问题,排不出正确结果。

下面是源代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct n{
    char number[15];
    char name[10];
    int a;
    int b;
    int c;
    struct n* next;
}bin;
int luru(bin *q){//q是头节点。 
    printf("您需要录入几个学生:");
    int a;
    scanf("%d",&a);
    while(a)
        {
        bin *s = (bin *)malloc(sizeof(bin));
        printf("请输入学号(小于15个字节):");
        scanf("%s",&s->number);
        printf("请输入学生姓名(小于10个字节):");
        scanf("%s",&s->name);
        printf("请输入第一门成绩:");
        scanf("%d",&s->a);
        printf("请输入第二门成绩:");
        scanf("%d",&s->b);
        printf("请输入第三门成绩:");
        scanf("%d",&s->c); 
        s->next = q->next;
        q->next = s;
        printf("录入成功。\n");
        a--;
        }
    return 1;
}
int panduan(bin *z,bin *a[],int n){//数组里出现过了的地址,就不再存放; 
    for(int i = 0;i <= n;i++)
        {
        if(z == a[i])
            return 0;
        }
    return 1;
}
int paiming(bin *q){//对链表按总成绩排名。 
    if(q->next == 0)
        {
        printf("没有学生的信息。\n");
        return 0;
        }     
    bin *p = q->next,*z;
    int i = 0,max = 0,n = -1;
    while(p != 0)
        {
        i++;
        p = p->next; 
        }
    bin *a[i];//用一个数组,总成绩从大到小的存放链表地址。 
    while(n < i)
        {
        p = q->next;
        while(p != 0)
            {
            if((p->a + p->b + p->c) >= max&&panduan(z,a,n))//如果重复地址就不进入。 
                {
                max = p->a + p->b + p->c;
                z = p;
                }
            p = p->next;
            }
        n++;
        a[n] = z;
        }
    for(n = 0;n < i;n++)
        {
         printf("学生学号:%s    学生姓名:%s\n",a[n]->number,a[n]->name);
        }
    return 1;
}
int main()
{
    bin *q = (bin *)malloc(sizeof(bin));
    q->next = 0;
    luru(q);
    paiming(q);
}

我的思路是:
我用循环,第一次找出链表中最大的总成绩,并将它的地址放进数组下表0的位置。从第二次开始,还是用循环找到最大值(panduan函数用来保证相同一个结点只算一次),一直循环,直到数组元素个数等于链表长度,就结束循环,最后用数组里的地址依次打印。
程序不能达到想要的效果,这个程序我主要是想用数组存放地址,因为我不想改变原先链表的顺序,我也很知道我到底错在哪里。希望有人指正。非常感谢,谢谢。

  • 写回答

2条回答 默认 最新

  • 乘风xs 2023-04-17 22:51
    关注

    在你的排名函数中,while(n < i)的循环体中,每次循环完需要把max = 0; z = null, 需要把它们复位,不然在一次循环完之后,找到了最大值max, 后面不会有比max更大的情况了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月18日
  • 创建了问题 4月17日

悬赏问题

  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式
  • ¥15 如果要做一个老年人平板有哪些需求
  • ¥15 k8s生产配置推荐配置及部署方案