麻烦帮忙看看,万分感谢。
用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函数用来保证相同一个结点只算一次),一直循环,直到数组元素个数等于链表长度,就结束循环,最后用数组里的地址依次打印。
程序不能达到想要的效果,这个程序我主要是想用数组存放地址,因为我不想改变原先链表的顺序,我也很知道我到底错在哪里。希望有人指正。非常感谢,谢谢。