Jaybo_
2015-06-11 04:51
采纳率: 100%
浏览 3.9k
已结题

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

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

  • 收藏

6条回答 默认 最新

  • zhangweilst 2015-06-11 11:49
    已采纳

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

    已采纳该答案
    打赏 评论
  • Jaybo_ 2015-06-11 04: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;
    

    }

    打赏 评论
  • 六月心悸 2015-06-11 06:54

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

    打赏 评论
  • ES2020 2015-06-11 07:34

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

    打赏 评论
  • ForestDB 2015-06-12 05:21

    学会使用qsort。

    打赏 评论
  • csdnword 2015-07-30 10:28

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

    打赏 评论