精华内容
下载资源
问答
  • C语言链表节点排序

    千次阅读 2019-05-07 19:54:45
    初次用到链表排序还是在C语言课程设计上,当时想着要把代码发到CSDN上,结果一拖再拖到现在。 我的课程设计项目为“学生成绩管理系统”,所用链表为双向链表链表。 涉及到成绩管理则避免不了成绩排序。 结构体中...

    初次用到链表的排序还是在C语言课程设计上,当时想着要把代码发到CSDN上,结果一拖再拖到现在。

    我的课程设计项目为“学生成绩管理系统”,所用链表为双向链表链表。
    涉及到成绩管理则避免不了成绩的排序。
    结构体中的项目包括:

    1. 学生成绩;
    2. 学生姓名;
    3. 学生学号;
    4. 结构体的头指针与尾指针;
      先创建结构体:
    #include"stdio.h"
    #include"stdlib.h"
    #include"string.h"
    struct student
    {
    	struct student *ahead;
    	float grade[10];
    	char name[10];
    	char x[10];
    	struct student *next;
    }*head, *end, *New, *get, *stu;
    

    设置head指针和end指针。head指向头结点,end始终指向尾节点。
    输入数据:

    int input(int N, char **G)//数据输入
    //变量说明:“N”为考试的科目数量,此处**G为字符串指针数组,其中存储着考试科目。
    {
    	int i, c = 1, icount = 0, s[10], j, k, d;
    	char r[10];
    	for (j = 0; j < 10; j++)
    		s[j] = 0;
    	while (c)
    	{
    		New = (struct student *)malloc(sizeof(struct student));
    		printf("\t\t输入该名学生姓名(结束请按‘0’):");
    		scanf("%s", New->name);
    		if (New->name[0] != 48)
    		{
    			printf("\t\t输入该名学生学号:");
    			scanf("%s", r);
    			icount++;
    			strcpy(New->x, r);
    			New->grade[N] = 0;
    			for (i = 0; i < N; i++)
    			{
    				printf("\t\t%s成绩:", G[i]);
    				scanf("%f", &New->grade[i]);
    				if (New->grade[i] < 60)
    					s[i]++;
    				New->grade[N] = New->grade[N] + New->grade[i];
    			}
    			strcpy(New->mima, "1234");
    			end->next = New;
    			New->ahead = end;
    			end = New;
    			end->next = NULL;
    		}
    	}
    	else
    	{
    		c = 0;
    	}
    }
    

    链表已经创建完成,现在只需要向其中添加数据,下一步祭出我屌炸天 的链表节点排序代码?
    此代码运用简单选择排序的排序方法。即,先比较两个节点中数据的大小,并两个选中较大或较小的一个。并让选中的节点与下一个节点中的数据比较直到最后一个节点。比较完毕后将最小的节点接到链表的最后。
    当然,开始排序之前,我创建了一个空节点让其存储成绩的数组的每一个元素都等于“-1”将其接到了链表的最后作为新的有序链表与旧的无序链表的边界。在排序完毕后程序自动将此空节点删除。得到的就是新的有序数组。

    1.排序前的准备阶段(假设此处为升序排序)

    主要步骤为:

    1. 创建三个结构体指针“ *min”、“*xunow”、“ *uend”;
    2. uend就是我添加的边界空指针;
    int paixu(int N)//成绩排序
    {
    	int i;//在程序的后便会让用户选择升序还是降序排序,变量i的作用是根据i的值选择排序方式。若i为1则降序排列,0则升序排列
    	struct student *min, *xunow, *uend;
    	uend = (struct student *)malloc(sizeof(struct student));
    	uend->grade[0] = -1;
    	uend->next = NULL;
    	uend->ahead = end;
    	end->next = uend;
    

    2.排序执行阶段

    上一步中创建的三个结构体指针已经用掉了一个,在这一步中“min”代表比较值最小的节点。"xunow"表示当前与min节点比较的节点。

    1. 通过简单选择排序找出旧链表中的最小值节点;
    2. 将此最小值节点接到链表的最后;
    printf("\n\t\t升序排序(0)     降序排序(1)\n\t\t");
    	scanf("%d", &i);
    	for (min = head->next; min->next->grade[0] != -1; min = head->next)
    	{
    		xunow = min->next;
    		if (i == 0)
    		{
    			do
    			{
    				if (xunow->grade[0] < min->grade[0])
    				{
    					min = xunow;
    				}
    				xunow = xunow->next;
    			} while (xunow->next->grade[0] != -1 && xunow->grade[0] != -1 && min->next->grade[0] != -1);
    			min->ahead->next = min->next;
    			min->next->ahead = min->ahead;
    			min->ahead = uend;
    			uend->next = min;
    			uend = min;
    		}
    		else
    		{
    			do
    			{
    				if (xunow->grade[0] > min->grade[0])
    				{
    					min = xunow;
    				}
    				xunow = xunow->next;
    			} while ( xunow->grade[0] != -1 && min->next->grade[0] != -1);
    			min->ahead->next = min->next;
    			min->next->ahead = min->ahead;
    			min->ahead = uend;
    			uend->next = min;
    			uend = min;
    		}
    		
    	}
    

    3.排序完成收尾阶段

    在执行完上步代码后,表明排序基本完成。按照步骤,此时边界空节点的旧链表一侧还有最后一个具有有效数据的节点,即存储最大数据的节点。现在只需要将此节点与边界节点一起转移到整个链表的最后再删除边界节点,就能最终完成链表的排序。

        min = head->next;
    	xunow = min->next;
    	head->next = xunow->next;
    	xunow->next->ahead = head;
    	xunow->next = NULL;
    	min->ahead = uend;
    	uend->next = min;
    	uend = xunow;
    	end = uend->ahead;
    	uend->ahead->next = NULL;
    	free(uend);
    	return 0;
    }
    

    这就是自己在本学期的课程设计中,灵光一现敲出的链表节点排序代码。虽然不够简洁但不管怎么样这段代码还是实现了功能,即节点排序。

    展开全文
  • //创建链表,要求输入的学号不按顺序,但是链表要按学号顺序排列。 返回head地址 void print(struct stu *); //打印链表 void sortll(struct stu *,struct stu *,int ); //插入数据,输入 首地址,需要插入的数据...
  • C语言链表的创建插入删除排序,学生成绩排序和平均分计算#include#include#define NULL 0#define LEN sizeof(struct student)struct student{};int n;struct student *creat(void)//创建链表{struct student *head; ...

    C语言链表的创建插入删除排序,学生成绩排序和平均分计算

    #include

    #include

    #define NULL 0

    #define LEN sizeof(struct student)

    struct student

    {

    };

    int n;

    struct student *creat(void)//创建链表

    {

    struct student *head; struct student *p1,*p2; n=0; p1=p2=(struct student*)malloc(LEN); scanf("%ld,%f",&p1->num,&p1->score); head=NULL; while(p1->num!=0) { } p2->next=NULL; return(head);//带回链表的头指针 n=n+1; if(n==1)head=p1; else p2->next=p1; p2=p1; p1=(struct student *)malloc(LEN); scanf("%ld,%f",&p1->num,&p1->score); long num; float score; struct student *next;

    展开全文
  • 学生成绩排序与平均分计算利用c语言链表创建插入删除#include#include#define NULL 0#define LEN sizeof(struct student)struct student{long num;float score;struct student *next;};int n;struct student *creat...

    学生成绩排序与平均分计算利用c语言链表创建插入删除

    #include

    #include

    #define NULL 0

    #define LEN sizeof(struct student)

    struct student

    {

    long num;

    float score;

    struct student *next;

    };

    int n;

    struct student *creat(void)//创建链表

    {

    struct student *head;

    struct student *p1,*p2;

    n=0;

    p1=p2=(struct student*)malloc(LEN);

    scanf("%ld,%f",&p1->num,&p1->score);

    head=NULL;

    while(p1->num!=0)

    {

    n=n+1;

    if(n==1)head=p1;

    else p2->next=p1;

    p2=p1;

    p1=(struct student *)malloc(LEN);

    scanf("%ld,%f",&p1->num,&p1->score);

    }

    p2->next=NULL;

    return(head);//带回链表的头指针

    }

    void print(struct student *head)//输出链表

    {

    struct student *p;

    printf("\nNow,there %d records are:\n",n);

    p=head;

    if(head!=NULL)

    do

    {

    printf("%ld %5.1f\n",p->num,p->score);

    p=p->next;

    }

    while(p!=NULL);

    }

    void averprintf(struct *head)//平均值输出

    {

    struct student *p;

    float aver,sum=0,high=0,low=0;

    long num1;

    printf("\nNow,the averge score is:\n");

    p=head;

    if(head!=NULL)

    do

    {

    sum=sum+p->score;

    p=p->next;

    }

    while(p!=NULL);

    aver=sum/n;printf("%5.1f\n",aver);}

    void highprintf(struct student *p)/*求最高分*/

    {

    int high=p->score;

    long num1=p->num;

    do {if (highscore)

    {high=p->score;

    num1=p->num;}

    p=p->next ;}while (p!=NULL);

    printf("\nThe highest score is:%d,and its number is:%ld\n",high,num1);}

    void lowprintf(struct student *p)/*求最低分*/

    {

    int low=p->score;

    long num1=p->num;

    do{if (low>p->score)

    {low=p->score;

    num1=p->num;}

    p=p->next;}while (p!=NULL);

    printf("\nThe lowest score is:%d,and its number is:%ld\n",low,num1);}

    void sort(struct student *head)//学生成绩排序

    {

    struct student *p1,*p2;

    float i;long t;

    printf("Students from low to high ranking\n");

    p1=head;

    if(head==NULL)

    {

    printf("it is blank\n");

    }

    else

    {

    while(p1!=NULL)

    {

    p2=p1->next;

    while(p2!=NULL)

    {

    if(p1->score>p2->score)

    {

    i=p2->score;

    p2->score=p1->score;

    p1->score=i;

    t=p2->num;

    p2->num=p1->num;

    p1->num=p2->num;

    }

    p2=p2->next;

    }

    p1=p1->next;

    }

    }

    while

    展开全文
  • /*输入学生成绩记录*/ printf("\t\t\t2. 显示 Print the record\n"); /*显示*/ printf("\t\t\t3. 寻找 Search record on name\n"); /*寻找*/ printf("\t\t\t4. 删除 Delete a record\n"); /*删除*/ printf("\t\t\t5...

    匿名用户

    1级

    2008-04-21 回答

    /*头文件*/

    #include

    #include

    #include /*其它说明*/

    #include /*字符串函数*/

    #include /*内存操作函数*/

    #include /*字符操作函数*/

    #include /*动态地址分配函数*/

    #define LEN sizeof(STUDENT)

    typedef struct stu /*定义结构体数组用于缓存数据*/

    {char num[6];

    char name[5];

    int score[3];

    int sum;

    float average;

    int order;

    struct stu *next;

    }STUDENT;

    /*函数原型*/

    STUDENT *init(); /*初始化函数*/

    int menu_select(); /*菜单函数*/

    STUDENT *create(); /*创建链表*/

    void print(STUDENT *head); /* 显示全部记录*/

    void search(STUDENT *head); /*查找记录*/

    STUDENT *delete(STUDENT *head); /*删除记录*/

    STUDENT *sort(STUDENT *head); /*排序*/

    STUDENT *insert(STUDENT *head,STUDENT *new); /*插入记录*/

    void save(STUDENT *head); /*保存文件*/

    STUDENT *load(); /*读文件*/

    /*主函数界面*/

    main()

    {STUDENT *head,new;

    head=init(); /*链表初始化,使head的值为NULL*/

    for(;;) /*循环无限次*/

    {switch(menu_select())

    {

    case 1:head=create();break;

    case 2:print(head);break;

    case 3:search(head);break;

    case 4:head=delete(head);break;

    case 5:head=sort(head);break;

    case 6:head=insert(head,&new);break; /*&new表示返回地址*/

    case 7:save(head);break;

    case 8:head=load(); break;

    case 9:exit(0); /*如菜单返回值为9则程序结束*/

    }

    }

    }

    /*初始化函数*/

    STUDENT *init()

    {

    return NULL; /*返回空指针*/

    }

    /*菜单选择函数*/

    menu_select()

    {int n;

    struct date d; /*定义时间结构体*/

    getdate(&d); /*读取系统日期并把它放到结构体d中*/

    printf("\n按任一键进入主菜单...... \npress any key to enter the menu......"); /*按任一键进入主菜单*/

    getch(); /*从键盘读取一个字符,但不显示于屏幕*/

    clrscr(); /*清屏*/

    printf("********************************************************************************\n");

    printf("\t\t 欢迎 Welcome to\n");

    printf("\n\t\t\t 使用学生管理系统1.0\n\n\t\t\t\t\t-----------景炎中学计算机组WJQ\n");

    printf("*************************************MENU***************************************\n");

    printf("\t\t\t1. 输入学生成绩记录 Enter the record\n"); /*输入学生成绩记录*/

    printf("\t\t\t2. 显示 Print the record\n"); /*显示*/

    printf("\t\t\t3. 寻找 Search record on name\n"); /*寻找*/

    printf("\t\t\t4. 删除 Delete a record\n"); /*删除*/

    printf("\t\t\t5. 排序 Sort to make new a file\n"); /*排序*/

    printf("\t\t\t6. 插入 Insert record to list\n"); /*插入*/

    printf("\t\t\t7. 保存 Save the file\n"); /*保存*/

    printf("\t\t\t8. 读取 Load the file\n"); /*读取*/

    printf("\t\t\t9. 退出 Quit\n"); /*退出*/

    printf("\n\t\t 制作吴俊遒WJQ Made by Wu Junqiu.\n");

    printf("********************************************************************************\n");

    printf("\t\t\t\t当前系统日期:%d\\%d\\%d\n",d.da_year,d.da_mon,d.da_day); /*显示当前系统日期*/

    do{

    printf("\n\t\t\t输入你的选择Enter your choice(1~9):");

    scanf("%d",&n);

    }while(n<1||n>9); /*如果选择项不在1~9之间则重输*/

    return(n); /*返回选择项,主函数根据该数调用相应的函数*/

    }

    /*输入函数*/

    STUDENT *create()

    {int i,s;

    STUDENT *head=NULL,*p; /* 定义函数.此函数带回一个指向链表头的指针*/

    clrscr();

    for(;;)

    {p=(STUDENT *)malloc(LEN); /*开辟一个新的单元*/

    if(!p) /*如果指针p为空*/

    {printf("\n输出内存溢出. Out of memory."); /*输出内存溢出*/

    return (head); /*返回头指针,下同*/

    }

    printf("输入学号Enter the num(0:list end):");

    scanf("%s",p->num);

    if(p->num[0]=='0') break; /*如果学号首字符为0则结束输入*/

    printf("输入名字Enter the name:");

    scanf("%s",p->name);

    printf("请输入3门成绩Please enter the %d scores\n",3); /*提示开始输入成绩*/

    s=0; /*计算每个学生的总分,初值为0*/

    for(i=0;i<3;i++) /*3门课程循环3次*/

    {

    do{

    printf("成绩score%d:",i+1);

    scanf("%d",&p->score[i]);

    if(p->score[i]<0 || p->score[i]>100) /*确保成绩在0~100之间*/

    printf("数据错误,请重新输入 Data error,please enter again.\n");

    }while(p->score[i]<0 || p->score[i]>100);

    s=s+p->score[i]; /*累加各门成绩*/

    }

    p->sum=s; /*将总分保存*/

    p->average=(float)s/3; /*先用强制类型转换将s转换成float型,再求平均值*/

    p->order=0; /*未排序前此值为0*/

    p->next=head; /*将头结点做为新输入结点的后继结点*/

    head=p; /*新输入结点为新的头结点*/

    }

    return(head);

    }

    /* 显示全部记录函数*/

    void print(STUDENT *head)

    {int i=0; /* 统计记录条数*/

    STUDENT *p; /*移动指针*/

    clrscr();

    p=head; /*初值为头指针*/

    printf("\n************************************STUDENT************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("| Rec | Num | Name | Sc1 | Sc2 | Sc3 | Sum | Ave | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    while(p!=NULL)

    {

    i++;

    printf("| %3d | %4s | %-4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",

    i, p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    p=p->next;

    }

    printf("-------------------------------------------------------------------------------\n");

    printf("**************************************END**************************************\n");

    }

    /*查找记录函数*/

    void search(STUDENT *head)

    {STUDENT *p; /* 移动指针*/

    char s[5]; /*存放姓名用的字符数组*/

    clrscr();

    printf("请输入个姓名来查找. Please enter name for searching.\n");

    scanf("%s",s);

    p=head; /*将头指针赋给p*/

    while(strcmp(p->name,s) && p != NULL) /*当记录的姓名不是要找的,或指针不为空时*/

    p=p->next; /*移动指针,指向下一结点*/

    if(p!=NULL) /*如果指针不为空*/

    {printf("\n*************************************FOUND************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",

    p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    }

    else

    printf("\n没有该学生 There is no num %s student on the list.\n",s); /*显示没有该学生*/

    }

    /*删除记录函数*/

    STUDENT *delete(STUDENT *head)

    {int n;

    STUDENT *p1,*p2; /*p1为查找到要删除的结点指针,p2为其前驱指针*/

    char c,s[6]; /*s[6]用来存放学号,c用来输入字母*/

    clrscr();

    printf("请输入要删除的学号 Please enter the deleted num: ");

    scanf("%s",s);

    p1=p2=head; /*给p1和p2赋初值头指针*/

    while(strcmp(p1->num,s) && p1 != NULL) /*当记录的学号不是要找的,或指针不为空时*/

    {p2=p1; /*将p1指针值赋给p2作为p1的前驱指针*/

    p1=p1->next; /*将p1指针指向下一条记录*/

    }

    if(strcmp(p1->num,s)==0) /*学号找到了*/

    {printf("**************************************FOUND************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",

    p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    printf("\n是否要删除,输入Y删除,N则退出\nAre you sure to delete the student Y/N ?"); /*提示是否要删除,输入Y删除,N则退出*/

    for(;;)

    {scanf("%c",&c);

    if(c=='n'||c=='N') break; /*如果不删除,则跳出本循环*/

    if(c=='y'||c=='Y')

    {

    if(p1==head) /*若p1==head,说明被删结点是首结点*/

    head=p1->next; /*把第二个结点地址赋予head*/

    else

    p2->next=p1->next; /*否则将一下结点地址赋给前一结点地址*/

    n=n-1;

    printf("\n学号为(Num): %s 学生以被删除(student have been deleted.)\n",s);

    printf("别忘了保存. Don't forget to save.\n");break; /*删除后就跳出循环*/

    }

    }

    }

    else

    printf("\n没有这个学生在表上\nThere is no num %s student on the list.\n",s); /*找不到该结点*/

    return(head);

    }

    /*排序函数*/

    STUDENT *sort(STUDENT *head)

    {int i=0; /*保存名次*/

    STUDENT *p1,*p2,*t,*temp; /*定义临时指针*/

    temp=head->next; /*将原表的头指针所指的下一个结点作头指针*/

    head->next=NULL; /*第一个结点为新表的头结点*/

    while(temp!=NULL) /*当原表不为空时,进行排序*/

    {

    t=temp; /*取原表的头结点*/

    temp=temp->next; /*原表头结点指针后移*/

    p1=head; /*设定移动指针p1,从头指针开始*/

    p2=head; /*设定移动指针p2做为p1的前驱,初值为头指针*/

    while(t->averageaverage&&p1!=NULL) /*作成绩平均分比较*/

    {

    p2=p1; /*待排序点值小,则新表指针后移*/

    p1=p1->next;

    }

    if(p1==p2) /*p1==p2,说明待排序点值大,应排在首位*/

    {

    t->next=p1; /*待排序点的后继为p*/

    head=t; /*新头结点为待排序点*/

    }

    else /*待排序点应插入在中间某个位置p2和p1之间,如p为空则是尾部*/

    {

    t->next=p1; /*t的后继是p1*/

    p2->next=t; /*p2的后继是t*/

    }

    }

    p1=head; /*已排好序的头指针赋给p1,准备填写名次*/

    while(p1!=NULL) /*当p1不为空时,进行下列操作*/

    {

    i++; /*结点序号*/

    p1->order=i; /*将结点序号赋值给名次*/

    p1=p1->next; /*指针后移*/

    }

    printf("排序成功 Sorting is sucessful.\n"); /*排序成功*/

    return (head);

    }

    /*插入记录函数*/

    STUDENT *insert(STUDENT *head,STUDENT *new)

    {STUDENT *p0,*p1,*p2;

    int n,sum1,i;

    p1=head; /*使p1指向第一个结点*/

    p0=new; /*p0指向要插入的结点*/

    printf("\nPlease enter a new record.\n"); /*提示输入记录信息*/

    printf("输入学号Enter the num:");

    scanf("%s",new->num);

    printf("输入名字Enter the name:");

    scanf("%s",new->name);

    printf("Please enter the %d scores.\n",3);

    sum1=0; /*保存新记录的总分,初值为0*/

    for(i=0;i<3;i++)

    {

    do{

    printf("成绩score%d:",i+1);

    scanf("%d",&new->score[i]);

    if(new->score[i]>100||new->score[i]<0)

    printf("数据错误Data error,please enter again.\n");

    }while(new->score[i]>100||new->score[i]<0);

    sum1=sum1+new->score[i]; /*累加各门成绩*/

    }

    new->sum=sum1; /*将总分存入新记录中*/

    new->average=(float)sum1/3;

    new->order=0;

    if(head==NULL) /*原来的链表是空表*/

    {head=p0;p0->next=NULL;} /*使p0指向的结点作为头结点*/

    else

    {while((p0->averageaverage)&&(p1->next!=NULL))

    {p2=p1; /*使p2指向刚才p1指向的结点*/

    p1=p1->next; /*p1后移一个结点*/

    }

    if(p0->average>=p1->average)

    {if(head==p1)head=p0; /*插到原来第一个结点之前*/

    else p2->next=p0; /*插到p2指向的结点之后*/

    p0->next=p1;}

    else

    {p1->next=p0;p0->next=NULL;} /*插到最后的结点之后*/

    }

    n=n+1; /*结点数加1*/

    head=sort(head); /*调用排序的函数,将学生成绩重新排序*/

    printf("\n学生Student %s 已被更新have been inserted.\n",new->name);

    printf("不要忘了保存Don't forget to save the new file.\n");

    return(head);

    }

    /*保存数据到文件函数*/

    void save(STUDENT *head)

    {FILE *fp; /*定义指向文件的指针*/

    STUDENT *p; /* 定义移动指针*/

    char outfile[10];

    printf("输出文件例如:c:\\score Enter outfile name,for example c:\\score\n");

    scanf("%s",outfile);

    if((fp=fopen(outfile,"w"))==NULL) /*为输出打开一个二进制文件,为只写方式*/

    {

    printf("打不开文件Cannot open the file\n");

    return; /*若打不开则返回菜单*/

    }

    printf("\n保存中...Saving the file......\n");

    p=head; /*移动指针从头指针开始*/

    while(p!=NULL) /*如p不为空*/

    {

    fwrite(p,LEN,1,fp); /*写入一条记录*/

    p=p->next; /*指针后移*/

    }

    fclose(fp); /*关闭文件*/

    printf("保存成功....Save the file successfully!\n");

    }

    /* 从文件读数据函数*/

    STUDENT *load()

    {STUDENT *p1,*p2,*head=NULL; /*定义记录指针变量*/

    FILE *fp; /* 定义指向文件的指针*/

    char infile[10];

    printf("倒入文件例如:c:\\score Enter infile name,for example c:\\score\n");

    scanf("%s",infile);

    if((fp=fopen(infile,"r"))==NULL) /*打开一个二进制文件,为只读方式*/

    {

    printf("打不开文件Can not open the file.\n");

    return(head);

    }

    printf("\n寻找文件...Loading the file!\n");

    p1=(STUDENT *)malloc(LEN); /*开辟一个新单元*/

    if(!p1)

    {

    printf("内存溢出!Out of memory!\n");

    return(head);

    }

    head=p1; /*申请到空间,将其作为头指针*/

    while(!feof(fp)) /*循环读数据直到文件尾结束*/

    {

    if(fread(p1,LEN,1,fp)!=1) break; /*如果没读到数据,跳出循环*/

    p1->next=(STUDENT *)malloc(LEN); /*为下一个结点开辟空间*/

    if(!p1->next)

    {

    printf("Out of memory!\n");

    return (head);

    }

    p2=p1; /*使p2指向刚才p1指向的结点*/

    p1=p1->next; /*指针后移,新读入数据链到当前表尾*/

    }

    p2->next=NULL; /*最后一个结点的后继指针为空*/

    fclose(fp);

    printf("\n你成功的从文件中读取了数据!\nYou have success to read data from the file!\n");

    return (head);

    }

    展开全文
  • #include#include#define NULL 0#define LEN sizeof(struct student)struct student{long num;float score;struct student *next;...struct student *creat(void)//创建链表{struct student *head;struct student *...
  • c语言 链表合并,排序

    千次阅读 2019-08-15 10:54:46
    已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 输入: 第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和...
  • C语言-链表排序

    千次阅读 2019-05-13 20:00:54
    C语言-链表排序 题目描述 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 输入 第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的...
  • 做了两个链表 每个节点内有一个学生的编号和成绩,现在要求把两个链表合并,然后按照学号升序排列 不知道为啥 第65行总是报错 我整了一个小时了 没发现哪里错了,貌似运行时候显示说我引用了一个不可以引用的地址?...
  • 该系统基于C语言,运用了指针、结构体和文件读写等技术路线实现了一些功能:包括(输入学生数据,修改学生数据,查找学生资料,排列学生数据,保存学生成绩,调出学生成绩,显示学生资料等7个功能)1、首先,定义学生...
  • C语言链表编写学生成绩管理系统

    万次阅读 多人点赞 2018-09-06 20:04:12
    每位学生记录包含有学号、姓名、性别、出生日期、三门功课的成绩(高等数学、大学英语、C语言)、总分和平均分 系统菜单: (1)录入学生记录 (2)添加学生记录 (3)删除学生记录 (4)修改学生记录(要求...
  • #define NULL 0#define LEN sizeof(struct student)struct student{long num;float score;struct student *next;...struct student *creat(void)//创建链表{struct student *head;struct student *p1,*p2;n=0;p1=p2...
  • 然后按照成绩值进行降序排序(交换链表中结构体位置而不是成员值)怎么实现。我通过冒泡排序for(one=head;one!=NULL;one=one->next) for(two=one->next;two!=NULL;two=two->next) { if() {......} } 一直实现不...
  • 问题 B: C语言-链表排序 时间限制: 1 Sec 内存限制: 128 MB 提交: 54 解决: 48 题目描述 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 输入 第一行,a、b两个...
  • 链表自己随便编了一个学生成绩管理的小程序,比较粗糙,排序功能目前还没有实现~ #include <stdio.h> #include <stdlib.h> typedef struct nodeList{ char name[20]; int score; struct ...
  • C语言链表详解附实例

    万次阅读 多人点赞 2020-03-11 23:43:02
    链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。链表和数组比较,不用事先确定存储空间,而是根据需要开辟内存单元。本文章实现了用C语言编写学生管理系统,可以实现添加、删除、增加..,等功能
  • 有关C语言链表的建立,排序 (初来乍到,请多关照)
  • C语言 链表实现 学生成绩排名

    万次阅读 2018-01-25 10:43:26
    输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开 输出描述: 按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开 示例1 ...
  • c语言链表线性链表线性表链表本文地址:问:十字链表 C语言链表的问题答:管理程序一般用链表,比如通讯录,学生成绩,一些数据统计等等 单,双,什么时候用单,什么时候用双.要看情况,不好说,差别就是双链表有一个前指针....
  • 问题 B: C语言-链表排序 时间限制: 1 Sec 内存限制: 128 MB 提交: 86 解决: 71 [提交][状态][讨论版][命题人:外部导入] 题目描述 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,...
  • 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 输入 第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两...
  • 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 输入: 第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两...
  • 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 输入 第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两...
  • C语言链表实现学生管理系统

    千次阅读 多人点赞 2019-06-19 21:38:02
    C语言链表实现学生管理系统 #include "stdio.h" #include "stdlib.h" #include "string.h" struct Student { unsigned long ID; char Name[21]; float Score; }; struct Node { struct ...
  • 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 输入 第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两...
  • C语言 单向链表 及其排序

    千次阅读 2018-12-19 22:08:48
    { //法……大体思想是:先从链表第一个结点开始遍历链表,找出关键值(这里是成绩score)最大的(因为 struct Student *p, *q, *pt=NULL, *pbf=NULL, *qbf=NULL; //是从大到小排序)结点和链表中第一个结点交换...
  • 这是利用c语言中的链表来解决的问题,有利于你对C语言链表的更好的了解
  • 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 输入 第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,983
精华内容 1,593
关键字:

c语言链表成绩排序

c语言 订阅