| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3717 人关注过本帖, 1 人收藏
标题:关于链表排序~
取消只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(1)
已结贴  问题点数:50 回复次数:6 
关于链表排序~
/*
学号 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
九转星河
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
九转星河
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
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 11楼 xzlxzlxzl
x版主程序通用性较强~赞一个~九九觉得如果比较函数用函数指针处理,在调用排序函数主体的时候把函数指针作为参数传进去处理就更加清晰了~如果再把yang的排序方法结合在一起就会更清晰易懂了~

还有x版主调用不确定结构体成员的方法值得借鉴~想不到之前九九写的大型学生信息管理系统比较的引用方法差不多~x版主也是这样写更加肯定了九九那种写法了~

不过九九还有一个小问题想请教一下~比较部分把int float double char型统一换成double比较这样合适吗?~~

[此贴子已经被作者于2017-2-12 13:35编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-12 13:33
快速回复:关于链表排序~
数据加载中...
 
   



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

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