是教材上的一个题目,要求用链表实现,写了好长时间了写不出来人的麻了。
成绩的排序都解决的,但是题目里要求如果成绩相同则并排输出且输出该成绩的人数
输出这一块真的写不出来。
//定义学生信息结构
#include
#include
struct student
{
int id;
int score;
struct student* next;
};
typedef struct student Info;
create(Info* head)
{
Info* p, * q;
int id, score;
int flag = 1, no = 1;
printf("Input Info\n");
printf("Enter ID = -1 -> end\n");
do
{
printf("Student %d\n", no);
no++;
printf("ID:\t");
scanf("%d", &id);
printf("SOCRE:\t");
scanf("%d", &score);
//如果id输入为-1,则停止创建结点
if (id == -1)
{
flag = 0;
}
else
{
p = (Info*)malloc(sizeof(Info));
p->id = id;
p->score = score;
q = head;
while (q->next != NULL)
{
if ((p->score) > (q->next->score))
{
break;
}
else
{
q = q->next;
}
}
p->next = q->next;
q->next = p;
}
} while (flag);
}
output(Info* head)
{
Info* p;
int i = 0, prv, k = 0, rank = 1;
p = head->next;
while (p -> next != NULL)
{
prv = p->score;
printf("NO.%d\t", rank);
printf("SCORE: %d\t", p->score);
if (p->score != p->next->score)
{
printf("PEOPLE: 1\t");
printf("%d\n", p->id);
}
else
{
printf("%d\t", p->id);
}
p = p->next;
}
}
void main()
{
Info* head;
head = (Info*)malloc(sizeof(Info));
head->next = NULL;
create(head);
output(head);
}
output(Info* head)
{
Info* p;
int i = 0, prv, k = 0, rank = 1;
p = head->next;
while (p -> next != NULL)
{
prv = p->score;
printf("NO.%d\t", rank);
printf("SCORE: %d\t", p->score);
if (p->score != p->next->score)
{
printf("PEOPLE: 1\t");
printf("%d\n", p->id);
}
else
{
printf("%d\t", p->id);
}
p = p->next;
}
}
void main()
{
Info* head;
head = (Info*)malloc(sizeof(Info));
head->next = NULL;
create(head);
output(head);
}
output那个函数我不知道怎么写
你缺一个函数
排序后,要从头到尾的遍历一遍,看有没有相同的,有相同的删除next,然后cur++
student里少一个属性,人数,默认1,output的时候如果这个是1就不输出,如果不是1要输出人数
修改完善如下,供参考:
#include <stdio.h>
#include <stdlib.h>
struct student
{
int id;
int score;
struct student* next;
};
typedef struct student Info;
void create(Info* head) //修改
{
Info* p, * q;
int id, score;
int flag = 1, no = 1;
printf("Input Info\n");
printf("Enter ID = -1 -> end\n");
do
{
printf("Student %d\n", no);
no++;
printf("ID:\t");
scanf("%d", &id);
//printf("SOCRE:\t"); 修改
//scanf("%d", &score);修改
//如果id输入为-1,则停止创建结点
if (id == -1){
flag = 0;
}
else{
printf("SOCRE:\t"); //修改
scanf("%d", &score);//修改
p = (Info*)malloc(sizeof(Info));
p->id = id;
p->score = score;
q = head;
while (q->next != NULL)
{
if ((p->score) > (q->next->score))
{
break;
}
else
{
q = q->next;
}
}
p->next = q->next;
q->next = p;
}
} while (flag);
}
void output(Info* head) //修改
{
Info* p, * prv;
int i = 0, k = 1, rank = 1, people = 0;
p = head->next;
prv = p;
while (p != NULL)
{
if (prv == p) {
printf("NO.%d\t", rank);
printf("SCORE: %d\t", p->score);
}
if (p->score != prv->score) {
rank++;
printf("PEOPLE: %d\n", people);
people = 1;
printf("NO.%d\t", rank);
printf("SCORE: %d\t", p->score);
printf("%d ", p->id);
}
else{
people++;
printf(people % 10 == 0 ? "%d\n\t\t\t" : "%d ", p->id);//同名次的学号一行最多10个
}
prv = p;
p = p->next;
}
printf("PEOPLE: %d\n", people);
}
void main()
{
Info* head;
head = (Info*)malloc(sizeof(Info));
head->next = NULL;
create(head);
output(head);
}
运行截图: