标题:关于链表排序~
只看楼主
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
已结贴  问题点数:50 回复次数:13 
关于链表排序~
/*
学号 C语言 VB程序设计 JAVA语言 个人平均成绩
78 85 83 0
88 81 89 0
86 88 75 0
60 60 50 0
学科平均成绩 0 0 0 0
****************学生成绩统计*****************
1、输入成绩
2、查找
3、排序平均数
4、输出成绩
5、退出

查找时可以用输入学号和输入姓名两种方式查询,用姓名查询时用字符数组。

*/


九九打算用链表完成,基本要求九九自己能够实现,但就是不知道那个平均成绩排序用那种排序方法比较好~感觉链表排序还不能融会贯通,要验收的~希望有人指点一下~
感觉这次工程量较大,可以不提供完整的程序代码,重点看看排序那个问题就行了~

[此贴子已经被作者于2017-2-10 22:28编辑过]

搜索更多相关主题的帖子: 程序设计 工程量 平均数 C语言 JAVA 
2017-02-10 22:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
下面代码是我曾经帮一位同学完成课程作业的,不是完全符合题意~不过要说的是那代码没有实现排序功能,可以在此代码上添加~代码仅供参考~
PS:没有看下面那个程序用结构体数组处理而不是用链表,那个还是忽略吧,我汗~~~~~~
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<math.h>
#define N 101
struct Student
{
    char xh[3];
    char name[20];
    char sex[2];
    int score[3];
    int sum;
    float ave;
}stu[N]={0};//初始化数据

int count=-1;

void menu();//菜单函数

void csh();
void tj();
void add(int flag,int n);
void find(int flag);//根据学号查询
void edit(int n);//修改学生信息
void del(int n);//删除学生信息

int judge_input1();
void judge_input2(void *s,void *p);
int judge_input3(void *p);
int judge_sex(void *p);
void print(int i);
int judge_empty();//判断学生信息是否为空
void ex();//退出系统函数

int main()
{
        char ch=0;

    while (1)
    {
        system("cls");
        menu();

        switch(ch=getch())
        {
            printf("\n");
            case '1':csh();break;
            case '2':add(0,0);break;
            case '3':find(0);break;
            case '4':find(1);break;
            case '5':find(2);break;
            case '6':tj();break;
            case '7':ex();break;
            default:break;
        }
    }

}

void menu()
{
    printf("**************<<学生管理系统>>****************\n");
    printf("\t1-----初始化信息\n");
    printf("\t2-----追加学生信息\n");
    printf("\t3-----按学号查询学生信息\n");
    printf("\t4-----按学号修改学生信息\n");
    printf("\t5-----按学号删除学生信息\n");
    printf("\t6-----统计并浏览学生信息\n");
    printf("\t7-----退出系统\n");
    printf("**********************************************\n");
    printf("请输入:\n");
}

void csh()
{
    char *p1[][3]=
    {
        {"01","aa",""},
        {"02","bb",""},
        {"03","cc",""},
        {"04","dd",""},
        {"05","ee",""},
    };

    int p2[][3]=
    {
        {80,76,67},
        {70,80,90},
        {75,85,95},
        {87,67,78},
        {78,89,79},
    };

    int i=0;
    int j=0;
    count=-1;
    for (i=0;i<sizeof(p2)/sizeof(*p2);i++)
    {
        stu[i].sum=0;
        strcpy(stu[i].xh,p1[i][0]);
        strcpy(stu[i].name,p1[i][1]);
        strcpy(stu[i].sex,p1[i][2]);
        for (j=0;j<3;j++)
            stu[i].sum+=stu[i].score[j]=p2[i][j];

        stu[i].ave=(float)stu[i].sum/3;
        count++;
    }

    printf("已初始化信息\n");
    system("pause");
}
void tj()
{
    int i=0;
    int j=0;

    if (judge_empty())
        return;

    system("cls");

    printf("学生人数有%d人\n",count+1);

    printf("%-10s%-10s%-4s    ","学号","姓名","性别");

    for (i=0;i<3;i++)
        printf("科目%d",i+1);
    printf("%5s%10s","总分","平均分");
    printf("\n");

    for (i=0;i<count+1;i++)
    {
        printf("%-10s",stu[i].xh);
        printf("%-10s",stu[i].name);
        printf("%-5s",stu[i].sex);

        for (j=0;j<3;j++)
            printf("%5d",stu[i].score[j]);

        printf("%8d",stu[i].sum);
        printf("%10.2f",stu[i].ave);
        printf("\n");
    }

    system("pause");
}

void add(int flag,int n)
{
    if (flag==0)
        printf("现在进行追加数据\n");
    else 
    {
        printf("现在进行修改数据");
        stu[n]=stu[N-1];//先把修改学生的数据清空,避免学号重复影响
    }
    system("pause");
    while (1)
    {
        int i=0;

        count++;

        printf("\n请输入学生的学号:");

        do
        {
            judge_input2("%s",stu[count].xh);
        }while (judge_input3(stu[count].xh));

        printf("\n请输入学生姓名:");
        judge_input2("%s",stu[count].name);

        printf("\n请输入学生性别(男\\女):");
        do
        {
            judge_input2("%s",stu[count].sex);
        }while(judge_sex(stu[count].sex));

        stu[count].sum=0;

        for (i=0;i<3;)
        {
            static flag=0;

            if (flag==0)
                printf("\n请输入科目%d的成绩:",i+1);

            judge_input2("%d%*c",&stu[count].score[i]);

            if (stu[count].score[i]<0||stu[count].score[i]>100)
            {
                printf("学生输入成绩数据范围有误,请重新输入\n");
                flag=1;
            }
            else
            {
                stu[count].sum+=stu[count].score[i];

                flag=0;
                i++;
            }

            stu[count].ave=(float)stu[count].sum/3;
        }

        system("cls");

        if (flag)
            break;

        printf("添加成功!\n");
        printf("要继续添加数据吗?(Y\\N)");
        if (judge_input1())
            break;
    }
}
int judge_input1()
{
    char ch=0;
    ch=getch();

    if (ch=='Y'||ch=='y')
        return 0;
    else if (ch=='N'||ch=='n')
        return 1;
    else 
    {
        printf("\n输入有误,请重新输入:");
        return judge_input1();
    }
}

void judge_input2(void *s,void *p)
{
    while (scanf(s,p)!=1)
    {
        printf("输入数据有误,请重新输入\n");
        fflush(stdin);
    }

    fflush(stdin);
}
int judge_input3(void *p)
{
    int i=0;
    char s[10]="\0";
    char *p2=s;

    for (i=0;i<count;i++)
        if (strcmp(p,stu[i].xh)==0)
        {    
            printf("该学生学号已经存在,请重新输入\n");
            print(i);
            return 1;
        }

        strcpy(s,p);


    if (strcmp(p,"0")==0)
    {
        printf("学号输入不能为0");
        return 1;
    }

    return 0;
}
int judge_sex(void *p)
{
    if (strcmp(p,"")!=0&&strcmp(p,"")!=0)
    {
        printf("性别输入有误,请重新输入\n");
        return 1;
    }

    return 0;
}
void print(int i)
{
    int j=0;

    printf("%-10s%-10s%-4s","学号","姓名","性别");

    for (j=0;j<3;j++)
        printf("  科目%d",i+1);

    printf("%5s%10s","总分","平均分");
    printf("\n");

    printf("%-10s",stu[i].xh);
    printf("%-10s",stu[i].name);
    printf("%-5s",stu[i].sex);

    for (j=0;j<3;j++)
        printf("%5d",stu[i].score[j]);

        printf("%8d",stu[i].sum);
        printf("%10.2f",stu[i].ave);
        printf("\n");
}
void find(int flag)
{
    char num[3];
    system("cls");

    if (judge_empty())
        return;

    if (flag==0)
        printf("\n请输入需要查询的学号:");
    else if (flag==1)
        printf("\n请输入需要修改的学号:");
    else if (flag==2)
        printf("\n请输入需要删除学生的学号");

    judge_input2("%s",num);

    while (1)
    {
        int i=0;
        system("cls");

        while (i<count+1)
        {
            system("cls");
            if (strcmp(num,stu[i].xh)==0&&flag==0)
            {
                printf("您需要查询的学号对应的学生信息为:\n");
                print(i);
                break;
            }
            else if (strcmp(num,stu[i].xh)==0&&flag==1)
            {
                printf("您需要修改的学号对应的学生信息为:\n");
                print(i);
                add(1,i);
                edit(i);
                break;
            }
            else if (strcmp(num,stu[i].xh)==0)
            {
                printf("您需要删除的学号对应的学生信息为:\n");
                print(i);
                del(i);
                break;
            }
            i++;
        }
         if (i==count+1)
            printf("没有查询到该学生\n");

        if (flag==0)
            printf("要继续查询吗?(Y\\N)");
        else if (flag==1)
            printf("要继续修改吗?(Y//N)");    
        else if (flag==2&&count!=-1)
            printf("要继续删除吗?(Y//N)");
        else if (flag==2&&count==-1)
        {
            printf("现在学生记录为空,请初始化信息\n");
            system("pause");
            break;
        }

        if (judge_input1())
            break;

        if (flag!=2)
            printf("\n请输入需要查询的学号:");
        else 
            printf("\n请输入需要删除学生的学号:");

        judge_input2("%s",num);
    }
}
void edit(int n)
{
    stu[n]=stu[count];

    count--;//修改完毕学生人数减少1

    printf("修改成功!\n");
    printf("修改后的学生信息为:\n");
    print(n);
}
void del(int n)
{
    int i=n;

    printf("要确认删除吗(Y//N)\n");

        if (judge_input1())
            return;

    for (;i<count+1;i++)
        stu[i]=stu[i+1];

    count--;
}

int judge_empty()
{
    if (count==-1)
    {
        printf("现在学生记录为空,请初始化信息\n");
        system("pause");
        return 1;
    }

    return 0;
}
void ex()
{
    printf("\t\t欢迎您的使用,再见\n");
    exit(0);
}


[此贴子已经被作者于2017-2-10 22:53编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-10 22:47
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 2楼 九转星河
感觉发错了原来那是用结构体数组完成排序当然简单
不过代码贴出来了,就当是参考一下吧~我汗~~~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-10 22:50
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:13 
#include <stdio.h>
struct Node
{
    int data;
    struct Node*next;
};
struct Node* GetMax(struct Node*first)//求first起始的链表的最大节点
{
    int max=first->data;struct Node*pmax=first;
    struct Node*p=first;
    while(p->next!=NULL)
        if(max<(p=p->next)->data)
        {
            max=p->data;
            pmax=p;
        }
    return pmax;
}
struct Node* GetPrecessor(struct Node*h,struct Node*present)//当present节点的直接前驱
{
    struct Node*p=h;
    while(p->next!=NULL)
    {
        if(p->next==present) return p;
        p=p->next;
    }
    return NULL;
}
int main()
{
    struct Node*p,*pl,*head,*p_max;
    int i;
    for(i=0;i<10;i++)
    {
        p=(struct Node*)malloc(sizeof(struct Node));
        p->data=(int)rand()%20;
        if(!i)
        {
            head=p;pl=p;
        }
        else
        {
            pl->next=p;pl=pl->next;pl->next=NULL;
        }
    }
    p=head;
    printf("排序前输出\n");
    while(p!=NULL)
    {
        printf("%d\t",p->data);p=p->next;
    }
    printf("\n");
    /*用以下while循环排序,思路是找出最大结点拿走插到表头,剩下的继续找最大的插到表头*/
    p=head;
    while(p!=NULL)
    {
        p_max=GetMax(p);
        if(p_max==p) p=p->next;
        if(p_max!=head)//如果找出的最大值的节点正好是头节点,不用做任何操作
        {
            GetPrecessor(head,p_max)->next=p_max->next;//将p从链表中拿走
            p_max->next=head;
            head=p_max;//将p放到表首成为新的head;
        }
    }
    p=head;
    printf("排序后输出\n");
    while(p!=NULL)
    {
        printf("%d\t",p->data);p=p->next;
    }
    return 0;
}
2017-02-10 23:09
yumujiu
Rank: 2
等 级:论坛游民
帖 子:7
专家分:51
注 册:2016-11-27
得分:13 

struct studentMan
{
    student data;
    student *next;
};

你的例子采用数组存储,链表采用指针指向下个学生的数据,串联所有数据
2017-02-10 23:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 4楼 yangfrancis
感谢 yangfrancis你的代码对我启发很大~
要交差,连夜赶工,没办法~这样就可以了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-11 00:31
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:13 
九同学还在这方面纠结啊!
突然睡不着懒觉,看到九同学的这个帖子,想想自己从未正式写过链表代码,决定试试。
想到论坛里众多链表代码几乎基因完全相同,真是天下代码一片抄啊!我写代码前喜欢对功能分类,让函数功能明确、单一,如:如我认为创建链表和插入链表节点是同一类的,而链表节点数据输入不应该放进链表创建里,因此,我能想到的链表代码如下:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct student
{
    int num;
    float c;
    float vb;
    float java;
    float ave;
    struct student *next;
};
struct student *insert(struct student *head,struct student num,int pos)
{//在指定位置插入一个数据为num的节点,pos=0头插,-1尾插
    int i=0;
    struct student *p,*pre,*ph;
    p=(struct student*)malloc(sizeof(struct student));
    if (p==NULL)return p;
    *p=num;
    pre=NULL;
    ph=head;
    while(pos!=i++&&ph!=NULL)
    {
        pre=ph;
        ph=ph->next ;
    }
    if(pre==NULL)
    {
        p->next=head;
        head=p;
    }
    else
    {
        pre->next=p;
        p->next=ph;
    }
    return head;
}

void listsco(struct student *head)
{//显示链表成绩
    printf("学号    C语言   VB语言  JAVA    平均分\n");
    while(head!=NULL)
    {
        printf("%-8d%-8.2f%-8.2f%-8.2f%-8.2f\n",head->num ,head->c ,head->vb ,head->java ,head->ave );
        head=head->next ;
    }
}

void main()
{
    struct student *head=NULL,*p,num;
    int i;
    srand(time(0));
    for(i=0;i<10;i++)
    {
        num.num=i+1;
        num.c =(rand()%800)/10.0+20;
        num.vb =(rand()%800)/10.0+20;
        num.java  =(rand()%800)/10.0+20;
        num.ave =(num.c+num.vb+num.java)/3;
        num.next =NULL;
        head=insert(head,num,-1);
    }
    listsco(head);
    while(head)
    {//释放申请的空间要成为习惯
        p=head;
        head=head->next;
        free(p);
    }
}


暂时完成链表建立、输入和输出功能,我将准备构思一个通用的链表排序函数(即对数据结构里任何元素排序,既可以是学号,也可以是单科成绩,还可以是平均成绩)。
要到驾校去学车了,待更!
2017-02-11 10:07
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
下面这个是九九自己写的~
排序代码参考了yangfrancis,输出格式参考了xzlxzlxzl~感谢~~~~

程序代码:
/*
学号 C语言 VB程序设计 JAVA语言 个人平均成绩
78 85 83 0
88 81 89 0
86 88 75 0
60 60 50 0
学科平均成绩 0 0 0 0
****************学生成绩统计*****************
1、输入成绩
2、查找
3、排序平均数
4、输出成绩
5、退出

查找时可以用输入学号和输入姓名两种方式查询,用姓名查询时用字符数组。

*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define LEN sizeof (Node)
#define S(a) sizeof(a)/sizeof(*a)
typedef struct Node
{
    char name[20];
    int num;
    int score[3];
    float aver;
    struct Node *next;
}Node;
Node* head=NULL;
void menu();//主菜单
void creat();//构建(加长)链表
void find();
void my_sort();
void print();
void print_one(Node* p);

Node* GET_MAX(Node* p);//求最大值
Node* Get_Precessor(struct Node* h,struct Node* present);

float aver(Node* p);//求平均成绩

void judge_scanf(void* s,void* p);
int judge_continue(void* p);
int n=0;//节点个数

int main()
{
    typedef void (*COM)();
    COM com[]={creat,find,my_sort,print};
    char c=0;

    while (c!=4)
    {
        system("cls");
        menu();
        c=getch()-'0'-1;
        fflush(stdin);

        if (c>-1&&c<S(com))
        {
            system("cls");

            com[c]();

            fflush(stdin);
            printf("\n即将返回菜单\n");
            system("pause");
        }
    }

    return 0;

}
void menu()
{
    printf("**********学生成绩统计**********\n\n");
    printf("1、输入成绩\n");
    printf("2、查找\n");
    printf("3、排序平均数\n");
    printf("4、输出成绩\n");
    printf("5、退出\n");
}
void creat()
{
    Node* p=head;
    void *pp[]={"C语言","VB程序","JAVA语言"};
    if (head==NULL)
    {
        p=head=(Node* )malloc(LEN);
        head->next=NULL;
    }
    else
        while (p->next)
            p=p->next;

    do
    {
        int i=0;
        system("cls");

        if (n)
        {
            p=p->next=(Node* )malloc(LEN);
            p->next=NULL;
        }

        printf("正在创建第%d个学生成绩\n",n+1);

        printf("请输入学生学号:");
        judge_scanf("%d",&p->num);

        printf("请输入学生的姓名:");
        judge_scanf("%20[^\n]%*c",p->name);


        for (i=0;i<S(p->score);++i)
        {
            printf("请输入%s的成绩:",pp[i]);
            judge_scanf("%d",&p->score[i]);
        }

        p->aver=aver(p);
        ++n;

    }while (judge_continue("还要继续创建吗?(Y||N)"));


}
void judge_scanf(void* s,void* p)
{
    while (scanf(s,p)!=1)
    {
        printf("输入数据有误,请重新输入\n");
        fflush(stdin);

    }

    fflush(stdin);
}

int judge_continue(void* p)
{
    int s=0;
    char c=0;

    printf(p);

    do
    {
        c=getch();

        s=(c=='Y'||c=='y'||c=='N'||c=='n');

        if (s==0)
            printf("\n判断在Y与N之间选择,请重新输入:");

    }while (s==0);

    return (c=='Y'||c=='y');
}

float aver(Node* p)
{
    int i=0;
    float aver=0;
    
    for (i=0;i<S(p->score);++i)
        aver+=p->score[i];

    return (aver/(float)3);
}

void find()
{
    Node* p=head;

    char c=0;
    char find_name[20]={0};
    int find_num=0;

    char *pp[]={"学号","姓名"};

    if (n==0)
    {
        printf("这是空表,请初始化数据\n");
        return ;
    }

    system("cls");
    printf("请选择查找方式:\n1、按学号查找\n2、按姓名查找\n");

    do
    {
        c=getch();
    }while (c!='1'&&c!='2');

    printf("请输入学生的%s:",pp[c-'0'-1]);

    if (c=='1')
        judge_scanf("%d",&find_num);
    else
        judge_scanf("%20[^\n]%*c",find_name);

    while (p)
    {
        if (c=='1'&&p->num==find_num)
            break;

        if (c=='2'&&strcmp(p->name,find_name)==0)
            break;

        p=p->next;

    }

    if (p)
        print_one(p);
    else
        printf("没有查询到该学生情况\n");
}
void my_sort()
{
    Node* p=head;
    Node* p_max=p;

    if (n==0)
    {
        printf("这是空表,请初始化数据\n");
        return ;
    }

    while (p)
    {
        p_max=GET_MAX(p);

        if (p_max==p)
            p=p->next;

        if (p_max!=head)
        {
            Get_Precessor(head,p_max)->next=p_max->next;//将p从链表中拿走
            p_max->next=head;
            head=p_max;    //将p放到表首成为新的head
        }
    }

    printf("排序完毕\n");
}

Node* GET_MAX(Node* p)
{
    Node* p_max=p;

    while (p)
    {
        if (p->aver<p_max->aver)
            p_max=p;
        
        p=p->next;
    }

    return p_max;
}

Node* Get_Precessor(struct Node* h,struct Node* present)//当present节点的直接前驱
{
    Node* p=h;

    while (p->next)
    {
        if (p->next==present)
            return p;

        p=p->next;
    }

    return NULL;
}

void print()
{
    Node* p=head;

    if (n==0)
    {
        printf("这是空表,请初始化数据\n");
        return ;
    }

    printf("学号    C语言   VB语言  JAVA    平均分\n");
    while(p)
    {
        printf("%-8d%-8d%-8d%-8d%-8.2f\n",p->num ,p->score[0],p->score[1],p->score[2],p->aver);
        p=p->next;
    }
}
void print_one(Node* p)
{
    printf("该学生的情况为:\n");
    printf("学号:%d\n",p->num);
    printf("姓名:%s\n",p->name);
    printf("%-20s%d\n","C语言成绩:",p->score[0]);
    printf("%-20s%d\n","VB程序设计成绩:",p->score[1]);
    printf("%-20s%d\n","JAVA语言成绩:",p->score[2]);
    printf("%-20s%.2f","平均成绩",p->aver);
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-11 13:59
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
下面这个是提供的参考答案~

程序代码:
#include "stdlib.h"
#include "stdio.h"

typedef struct Node
{
int index;
int c;
int vb;
int java;
float pj;
struct Node* next;
}Node;

Node *p,head,*h = &head;

crNode(Node* h, Node *date);
srNode(Node* h, int count);
Node* szNode(Node* h, int index);
pxNode(Node* h);

main()
{
int count;
h->next = NULL;
printf("Enter:count\n");
scanf("%d",&count);
srNode(h, count);
while(h->next!=NULL)
{
h = h->next;
printf("%d\t%d\t%d\t%d\t%f\n",h->index,h->c,h->vb,h->java,h->pj);
}
h = &head;
p = szNode(h, 1);
if(p!=NULL)
printf("\n%d\t%d\t%d\t%d\t%f\n\n",p->index,p->c,p->vb,p->java,p->pj);
else
printf("not found.\n\n");
h = &head;
pxNode(h);
while(h->next!=NULL)
{
h = h->next;
printf("%d\t%d\t%d\t%d\t%f\n",h->index,h->c,h->vb,h->java,h->pj);
}
system("pause");
}

srNode(Node* h, int count)
{
Node *p;
int c,vb,java,index;
while(count!=0)
{
count--;
printf("Enter:index c vb jave\n");
scanf("%d %d %d %d",&index,&c,&vb,&java);
p = (Node*)malloc(sizeof(Node));
p->index = index;
p->c = c;
p->vb = vb;
p->java = java;
p->pj = ((float)(c+vb+java))/3;
crNode(h,p);
}
}

crNode(Node* h, Node *date)
{
while(h->next!=NULL)
{
h = h->next;
}
h->next = date;
date->next = NULL;
}

Node* szNode(Node* h, int index)
{
while(h->next!=NULL)
{
h = h->next;
if(h->index == index)
{
return h;
}
}
return NULL;
}
pxNode(Node* h)
{
Node *p,tem;
while(h->next->next!=NULL)
{
p = h->next;
while(p->next!=NULL)
{
if(h->next->pj < p->next->pj)
{
tem.index = p->next->index;
tem.c = p->next->c;
tem.vb = p->next->vb;
tem.java = p->next->java;
tem.pj = p->next->pj;

p->next->index = h->next->index;
p->next->c = h->next->c;
p->next->vb = h->next->vb;
p->next->java = h->next->java;
p->next->pj = h->next->pj;

h->next->index = tem.index;
h->next->c = tem.c;
h->next->vb = tem.vb;
h->next->java = tem.java;
h->next->pj = tem.pj;
}
p = p->next;
}
h = h->next;
}
}



[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-11 14:02
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
得分:13 
这个排序是根据学号从小到大排序的

程序代码:
#include <stdio.h>
#include <string.h>

#define NAME_LEN 25

struct part {
    int number;
    char name[NAME_LEN];
    float C_p;
    float VB;
    float JAVA;
    float average;
    struct part *next;
};

struct part *students = NULL;

struct part *find_student(int number);
struct part *find_student1(char *s);
void insert(void);
void search(void);
void print(void);

int main(void)
{
    char code;

    for (;;)
    {
        printf("Enter operation code i,s,p: ");
        scanf(" %c", &code);
        while (getchar() != '\n')
            ;
        switch (code)
        {
        case 'i':insert(); break;
        case 's':search(); break;
        case 'p':print(); break;
        case 'q':return 0;
        default:printf("Illegal code\n");
        }
        printf("\n");
    }
}

struct part *find_student(int number)
{
    struct part *p;

    for (p = students; p != NULL && number > p->number; p = p->next)
        ;
    if (p != NULL&&number == p->number)
        return p;
    return NULL;
}

struct part *find_student1(char *s)
{
    struct part *p;

    for (p = students; p != NULL && (strcmp(s, p->name)!=0); p = p->next)
        ;
    if (p != NULL&& (strcmp(s, p->name) == 0))
        return p;
    return NULL;
}

void insert(void)
{
    struct part *cur, *prev, *new_node;

    new_node = malloc(sizeof(struct part));
    if (new_node == NULL)
    {
        printf("Database is full;can't add more students.\n");
        return;
    }

    printf("Enter student number: ");
    scanf("%d", &new_node->number);

    for (cur = students, prev = NULL; cur != NULL&&new_node->number > cur->number; prev = cur, cur = cur->next)
        ;
    if (cur != NULL&&new_node->number == cur->number)
    {
        printf("student already exists.\n");
        free(new_node);
        return;
    }

    printf("Enter stduent name: ");
    scanf(" %s", &new_node->name);
    printf("Enter C programming: ");
    scanf("%f", &new_node->C_p);
    printf("Enter VB programming: ");
    scanf("%f", &new_node->VB);
    printf("Enter java programming: ");
    scanf("%f", &new_node->JAVA);
    new_node->average = (new_node->C_p + new_node->VB + new_node->JAVA) / 3.0;
    printf("The average of %s is %.1f.\n", new_node->name, new_node->average);

    new_node->next = cur;
    if (prev == NULL)
        students = new_node;
    else
        prev->next = new_node;
}

void search(void)
{
    int number;
    char str[NAME_LEN];
    struct part *p;
    char code;

    printf("number or name for search? Enter n/s : ");
    scanf(" %c", &code);
    while (getchar() != '\n')
        ;
    switch (code)
    {
    case 'n':printf("Enter number: "); scanf("%d", &number); p = find_student(number); break;
    case 's':printf("Enter name: "); gets(str); p = find_student1(str); break;
    case 'q':return 0;
    default:printf("Illegal code\n");
    }
    
    if (p != NULL)
    {
        printf("student name: %s\n", p->name);
        printf("student number: %d\n", p->number);
        printf("student C programming: %.1f\n",p->C_p);
        printf("student VB programming: %.1f\n",p->VB);
        printf("student java programming: %.1f\n",p->JAVA);
        printf("student average: %.1f\n", p->average);
    }
    else
        printf("student not found.\n");
}

void print(void)
{
    struct part *p;

    printf("学号\t名字\tC语言\tVB程序设计\tJAVA语言\t个人平均成绩\n");
    for (p = students; p != NULL; p = p->next)
        printf("%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n", p->number, p->name, p->C_p, p->VB, p->JAVA, p->average);
}


[此贴子已经被作者于2017-2-11 16:01编辑过]

2017-02-11 15:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-474128-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.463179 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved