2 u012195214 u012195214 于 2015.06.11 12:51 提问

C语言:对学生学号,姓名,身份证号排序问题。

定义一个数组(学生结构体数组),里面包含学号,姓名,身份证三门学生成绩,要求写一个函数,根据学生任何一个字段(如学号、姓名,身份证),用指针或链表实现排序。
求大神帮忙,不甚感激啊

6个回答

u012195214
u012195214   2015.06.11 12:54

这是网上找到的相关程序代码:(只实现了学号排序,关于姓名和身份证号如何排序呢 ,求助,其中姓名假设都是英文的,按字母大小排序)

#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("%d\t%s\t%s\t%.2lf\t%.2lf\t%.2lf\n",
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("END\n");
return 0;

}

u013147600
u013147600   2015.06.11 14:54

你是江西的?身份证和姓名排序 就是 进行字符串排序,字符串排序总会吧

u013147600
u013147600 回复Jaybo93: 我应该还知道你是哪个学校的哦,嘿嘿嘿
2 年多之前 回复
u012195214
u012195214 恩 你怎么知道我是哪的?嘿嘿
2 年多之前 回复
u012195214
u012195214 恩 你怎么知道我是哪的?嘿嘿
2 年多之前 回复
EnderSnow
EnderSnow   2015.06.11 15:34

用字符串大小比较的库函数,再用链表的操作手段,应用一种排序算法排序,就可以了,试一下吧

zhangweilst
zhangweilst   2015.06.11 19:49

这样的程序还是自己写好。
定义单链表会吧,再加几个操作,初始化,加结点,等。
排序简单的可以用冒泡,选择排序,追求效率用快速排序。
身份证号如果考虑最后一位X的话,可能会比较麻烦。但是,最后一位是识别码,可以不考虑。

ForestDB
ForestDB   Rxr 2015.06.12 13:21

学会使用qsort。

CSDNword
CSDNword   2015.07.30 18:28

这个代码思路不难 静下心来 应该可以搞出来 自己先写 有问题 贴出来 再帮你解决。

Csdn user default icon
上传中...
上传图片
插入图片