问题描述
- C语言:对学生学号,姓名,身份证号排序问题。
-
定义一个数组(学生结构体数组),里面包含学号,姓名,身份证三门学生成绩,要求写一个函数,根据学生任何一个字段(如学号、姓名,身份证),用指针或链表实现排序。求助CSDN里大神帮我,不甚感激啊
解决方案
这是网上找到的相关程序代码:(只实现了学号排序,关于姓名和身份证号如何排序呢 ,求助,其中姓名假设都是英文的,按字母大小排序)
#include
#include
#include
typedef struct data {
int number; //学号
char name[20]; //姓名
char id[20]; //身份证号
double score[3]; //三门课成绩
}Student;
typedef struct list {
Student pauline;
struct list *next;
}*LinkList,*pNode,Node;
LinkList getEmptyList() {
LinkList head = (pNode)malloc(sizeof(Node));
memset(head,0,sizeof(Node));
return head;
}
int addNode(LinkList head,pNode pnode) {
pNode q;
for(q = head; q->next; q = q->next)
if(q->next->pauline.id == pnode->pauline.id)
return 0;
q->next = pnode;
pnode->next = NULL;
return 1;
}
void show(LinkList head) {
pNode p;
for(p = head->next; p; p = p->next ) {
printf("%dt%st%st%.2lft%.2lft%.2lfn",
p->pauline.number,p->pauline.name,p->pauline.id,
p->pauline.score[0],p->pauline.score[1],p->pauline.score[2]);
}
}
// 按学号升排序
void sortNumber(LinkList head) {
pNode p,q,pt,qt;
p = head;
while(p->next) {
qt = p;
q = p->next;
while(q->next) {
if(qt->next->pauline.number > q->next->pauline.number)
qt = q;
q = q->next;
}
if(qt != p) {
pt = p->next;
p->next = qt->next;
qt->next = qt->next->next;
p->next->next = pt;
}
p = p->next;
}
show(head);
}
//按姓名排序
void sortName(){ //求助如何写
};
//按身份证号升排序
void sortId() { //求助如何写
}
pNode readData() {
pNode pnode = (pNode)malloc(sizeof(Node));
int i;
printf("学 号:");
scanf("%d",&pnode->pauline.number);
printf("姓 名:");
scanf("%s",pnode->pauline.name,20);
printf("身份证:");
scanf("%s",pnode->pauline.id,20);
for(i = 0; i < 3; ++i) {
printf("第%d门成绩:",i + 1);
scanf("%lf",&pnode->pauline.score[i]);
}
return pnode;
}
void menu() {
printf(" n");
printf("****** 学生成绩管理系统 ******n");
printf("********************************n");
printf("* 1、添加学生信息 n");
printf(" 2、显示学生信息 n");
printf(" 3、按学号排序 n");
printf(" 4、按姓名排序 n");
printf(" 5、按身份证号排序 n");
printf(" 0、退出 n");
printf("*******************************n");
}
int main() {
char op[20];
// int select;
LinkList head = getEmptyList();
do {
menu();
printf("请选择:");
fflush(stdin);
fgets(op,20,stdin);
fflush(stdin);
switch(op[0] - '0') {
case 1 : addNode(head,readData());
break;
case 2 : show(head);
break;
case 3 : sortNumber(head);
break;
case 5 : sortId(head);
break;
// case 4 : printf("按第几门功课排序;");
// scanf("%d",&select);
// sortScore(head,select);
// break;
}
}while(op[0] - '0');
printf("ENDn");
return 0;
}
解决方案二:
你是江西的?身份证和姓名排序 就是 进行字符串排序,字符串排序总会吧
解决方案三:
用字符串大小比较的库函数,再用链表的操作手段,应用一种排序算法排序,就可以了,试一下吧
解决方案四:
这样的程序还是自己写好。
定义单链表会吧,再加几个操作,初始化,加结点,等。
排序简单的可以用冒泡,选择排序,追求效率用快速排序。
身份证号如果考虑最后一位X的话,可能会比较麻烦。但是,最后一位是识别码,可以不考虑。
解决方案五:
学会使用qsort。
解决方案六:
这个代码思路不难 静下心来 应该可以搞出来 自己先写 有问题 贴出来 再帮你解决。