精华内容
下载资源
问答
  • 题目描述:创建包含二维点信息的动态链表,其成员数据为整型(x,y)坐标信息,从键盘输入多个点坐标,这些点按其与原点的距离进行排序,输出其从小到大的排序结果。输入0时终止,输出格式"(%d,%d)\n"。 输入样例: 2...

    东北大学在线编程社区problem1521
    题目描述:创建包含二维点信息的动态链表,其成员数据为整型(x,y)坐标信息,从键盘输入多个点坐标,对这些点按其与原点的距离进行排序,输出其从小到大的排序结果。输入0时终止,输出格式"(%d,%d)\n"。
    输入样例:
    2 3
    4 3
    3 6
    2 7
    4 1
    5 5
    0 0
    输出样例:
    (2,3)
    (4,1)
    (4,3)
    (3,6)
    (5,5)
    (2,7)

    #include<stdio.h>
    #include<stdlib.h>
    
    struct point
    {
    	int x;
    	int y;
    	struct point* next;
    };
    typedef struct point PT;
    PT* create()
    {
    	PT* head, * tail, * pnew;
    	head = (PT*)malloc(sizeof(PT));
    	int x, y;
    	if (head == NULL)
    		return 0;
    	head->next = NULL;
    	tail = head;
    	while (1) {
    		scanf("%d%d", &x, &y);
    		if (x == 0 && y == 0)
    			break;
    		pnew = (PT*)malloc(sizeof(PT));
    		pnew->x = x;
    		pnew->y = y;
    		pnew->next = NULL;
    		tail->next = pnew;
    		tail = pnew;
    	}
    	return head;
    }
    void sort(PT* head)
    {
    	PT* now, * tail;
    	int a, b;
    	int m, n;
    	now = head->next;
    	tail = NULL;
    	if (now == NULL || now->next == NULL)
    		return;
    	while (now != tail&&now->next->x!=0) {
    		while (now->next != tail) {
    			a = (now->x * now->x) + (now->y * now->y);
    			b = (now->next->x * now->next->x) + (now->next->y * now->next->y);
    			if (a > b) {
    				m = now->x;
    				now->x = now->next->x;
    				now->next->x = m;
    				n = now->y;
    				now->y = now->next->y;
    				now->next->y = n;
    			}
    			now = now->next;
    		}
    		tail = now;
    		now = head->next;
    	}
    }
    void output(PT *head)
    {
    	PT* p;
    	for (p = head->next; p != NULL; p = p->next) {
    		printf("(%d,%d)\n", p->x, p->y);
    	}
    }
    int main(void)
    {
    	PT* head, * pnew;
    	head = create();
    	putchar('\n');
    	sort(head);
    	output(head);
    	return 0;
    }
    

    该代码在我的VS2019上运行出来的结果是正确的
    在这里插入图片描述

    但是我提交到OJ平台上显示“时间超限”,我想也许是在sort函数中使用的while语句中出现了死循环
    在这里插入图片描述

    但是个人能力有限,Debug不出什么名堂,也想不出更好的方法,所以烦请各位看官点评指教

    展开全文
  • 首先要知道插入排序的过程,这个动态图看着挺清晰的 插入排序动态图 一共需要四个指针, 第一个:头指针,每一轮比较都是从头指针开始的,而且最后返回的也是头指针,所以头指针不能丢。 第二个:当前正在与前面做...

    【题目描述】

    【代码思路】

    首先要知道插入排序的过程,这个动态图看着挺清晰的 插入排序动态图

    一共需要四个指针, 第一个:头指针,每一轮比较都是从头指针开始的,而且最后返回的也是头指针,所以头指针不能丢。 第二个:当前正在与前面做比较的指针,p。 第三个:由于p与前面已经排好顺序的链表比较完之后,p.next就会丢失了,所以要先保存起来,pnext=p.next. 第四个:与前面链表比较时,移动的指针q,q从头指针开始,在循环中向后移动。

    把p之前的链表与p之间断开,不然在q向后移动的时候会到整个大链表的结尾处,

    head.next=None
    复制代码

    如果当前指针比头指针还要小,那么头指针就要改变成当前指针,当前指针指向原来的头指针。

    if p.val<q.val:
        p.next=q
         head=p
    复制代码

    如果当前指针比头指针大,就可以用q来在循环中向后移动,对比的是q.next和p的值,

     while q is not None and q.next is not None and p.val>=q.val:
        q=q.next
    复制代码

    这样的话,当q.next比p值小额时候,q就向后移动;当检测到比p.val大的值的时候,指针q还在比他大的那个位置之前,就可以直接用

    p.next=q.next
    q.next=p
    复制代码

    【源代码】

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def insertionSortList(self, head):
            if head is None or head.next is None:return head
            """
            :type head: ListNode
            :rtype: ListNode
            """
            p=head.next
            head.next=None
            while  p is not None:
                q=head
                pnext=p.next
                if p.val<q.val:
                    p.next=q
                    head=p
                else:
                    while q is not None and q.next is not None and p.val>=q.val:
                        q=q.next
                    p.next=q.next 
                    q.next=p
                p=pnext
            return head
    复制代码
    展开全文
  • 基于动态链表的学生成绩管理系统

    千次阅读 多人点赞 2015-06-19 22:23:56
    利用预处理、数据类型、自定义函数、结构体、链表、文件操作、Windows.h中某些处理等知识,在VS2012中学生成绩管理系统进行编写,初步实现了管理员模式、来宾模式下的输入、删除、查询、修改、排序、保存、切换...

    摘要

    学生综合利用本学期所学完成了学生成绩管理系统的编写,利用预处理、数据类型、自定义函数、结构体、链表、文件操作、Windows.h中某些处理等知识,在VS2012中对学生成绩管理系统进行编写,初步实现了管理员模式、来宾模式下的输入、删除、查询、修改、排序、保存、切换登陆模式、修改管理员信息、退出等功能,并且在删除、查询功能中实现按照学号或姓名操作,排序功能中实现按照学号、姓名、五门课成绩、总分进行由大到小或由小到大的排序。同时,本学生成绩管理系统初步解决了由于输入错误造成的严重后果,又以蓝底黄字及区域化布局的友好界面展示在使用者眼前。

    撰写顺序

     由于学生将本实验在完成实验任务的基础上做成了功能较为完整的学生信息管理系统,但考虑到代码较长(1357行),故学生通过先展示成果后附加代码的形式进行实验分析。

    成果展示

    图1  创建系统管理员

    图一程序开始访问admin.txt文件,若无账号密码信息,则创建系统管理员,并将账号密码信息保存于admin.txt中。

    图2 选择登陆方式


    图2展示已经有管理员信息的情况下选择登陆方式,当输入账号密码时,与admin.txt中的信息匹配,若正确允许进入,错误,提示错误后,重新选择登录方式。

    图3 管理员菜单界面


    图3为管理员菜单界面,0-11分别完成相应的操作。输入错误显示错误,重新输入。

    图4 学生信息输入


    图4为无学生记录情况下的学生信息输入。

    图5 学生信息再输入


    图4为有学生记录情况下的学生信息输入。依次要求输入学号、姓名、5门科成绩。且学科成绩要求整数(依据实际情况设计),若输入错误,提示错误,重新输入直至正确。

    图6 学生信息删除


    图6为有学生记录时学生信息删除,按照学号或姓名两种方式删除。若无学生记录,提示无学生记录,无法删除。

    图7 学生成绩查询


    图7为有学生记录时学生成绩查询,通过学号或姓名进行查询。若无学生记录,提示无学生记录,不提供查询。

    图8 学生信息修改


      图8为有学生记录时学生信息修改,按照学号进行修改其他内容。若无学生记录,提示无学生记录,不提供修改。

    图9 排序菜单


    图9为排序菜单,0-14分别提供如上内容。

    图10排序


    图10为选择排序菜单中“4”时的排序结果。一旦进行排序,数据将保存于stu-sort.c中,而不改变原文件stu.c。

    图11 保存记录


    图11为有新数据写入时保存记录后的界面(因为图4后的操作,故有5名学生记录)。若无新数据写入,保存失败。

    图12  显示不及格学生


    图12为显示不及格学生具体信息及不及格同学总人数。

    图13  显示优秀学生


    图13为显示优秀学生具体信息及总人数。

    图14 修改管理员信息


    图14为修改管理员信息,管理员信息同样保存在admin.txt中。

    图15 来宾菜单界面


    图15为登陆方式选择“0”时,来宾菜单界面,0-6分别完成具体操作。

    图16 退出系统若有数据未保存询问是否保存


    图16 退出系统若有数据未保存询问是否保存,选择后退出整个程序。


    【附件】

    [源程序]

    #include <stdio.h>#include <string.h>
    #include <conio.h>
    #include <time.h>
    #include <stdlib.h>
    #define HEADER2 "  **********************************************************************\n  *     学号     姓名  学科1  学科2  学科3  学科4  学科5  总分   平均  *\n  **********************************************************************\n"
    #define FORMAT  "  * %8s  %7s  %5d  %5d  %5d  %5d  %5d %5d  %.2f  *\n  **********************************************************************\n"
    #define DATA  p->data.num,p->data.name,p->data.grade[0],p->data.grade[1],p->data.grade[2],p->data.grade[3],p->data.grade[4],p->data.total,p->data.ave
    int saveflag=0; /*是否需要存盘的标志变量*/
    int sortflag=0; /*是是否已经排序的标志变量*/
    time_t now;/*系统时间*/
    struct student {
        char num[20];   /*学号*/
        char name[15]; /*姓名*/
        int grade[5];     /*学科成绩*/
        int total;      /*总分*/
        float ave;      /*平均分*/
    };
    typedef struct node{     //定义每条记录或结点的数据结构
        struct student data; /*数据域*/
        struct node *next;    /*指针域*/
    }Node,*Link;   /*Node为node类型的结构变量,*Link为node类型的指针变量*/
    void menu() {
        now = time (NULL);
        printf("                          学生成绩管理系统 \n");
        printf("\n");
        printf("     *************************************************************\n");
        printf("     *                                                           *\n");
        printf("     *          1 输入成绩                 2 删除成绩            *\n");
        printf("     *                                                           *\n");
        printf("     *          3 查询成绩                 4 修改成绩            *\n");
        printf("     *                                                           *\n");
        printf("     *          5 排序成绩                 6 保存记录            *\n");
        printf("     *                                                           *\n");
        printf("     *          7 不及格学生               8 优秀学生            *\n");
        printf("     *                                                           *\n");
        printf("     *          9 显示所有                 0 退出系统            *\n");
        printf("     *                                                           *\n");
        printf("     *************************************************************\n");
        printf("     *          10 切换登录模式            11 修改管理员信息     *\n");
        printf("     *************************************************************\n");
        printf("       Made by ChengXiang, now time is %s\n",ctime(&now));
        printf("\n     *************************************************************\n");
        printf("     *          请您选择操作命令(0~11):");    /*显示提示信息*/
    }
    void menu2(){
        now = time (NULL);
        system("cls");          //清屏
        printf("\n                                                                  来宾模式\n\n\n");
        printf("                          学生成绩管理系统 \n");
        printf("\n");
        printf("     *************************************************************\n");
        printf("     *                                                           *\n");
        printf("     *          1 查询成绩                 2 排序成绩            *\n");
    	printf("     *                                                           *\n");
        printf("     *          3 不及格学生               4 优秀学生            *\n");
        printf("     *                                                           *\n");
        printf("     *          5 显示所有                 0 退出系统            *\n");
        printf("     *                                                           *\n");
        printf("     *************************************************************\n");
        printf("     *          6 切换登录模式                                   *\n");
        printf("     *************************************************************\n");
        printf("       Made by ChengXiang, now time is %s\n",ctime(&now));
        printf("\n     *************************************************************\n");
        printf("     *          请您选择操作命令(0~6):");    /*显示提示信息*/
    }
    void sortmenu(){   
    	now = time (NULL);
        system("cls");          //清屏
        printf("\n                             学生成绩管理系统 \n");
        printf("\n");
        printf("     ****************************排序菜单*************************\n");
        printf("     *                                                           *\n");
        printf("     *          1  按学号从小到大         2  按学号从大到小      *\n");
    	printf("     *                                                           *\n");
        printf("     *          3  按总分从小到大         4  按总分从大到小      *\n");
        printf("     *                                                           *\n");
        printf("     *          5  按学科1从小到大        6  按学科1从大到小     *\n");
        printf("     *                                                           *\n");
        printf("     *          7  按学科2从小到大        8  按学科2从大到小     *\n");
        printf("     *                                                           *\n");
        printf("     *          9  按学科3从小到大        10 按学科3从大到小     *\n");
        printf("     *                                                           *\n");
        printf("     *          11 按学科4从小到大        12 按学科4从大到小     *\n");
        printf("     *                                                           *\n");
        printf("     *          13 按学科5从小到大        14 按学科5从大到小     *\n");
        printf("     *                                                           *\n");
    	printf("     *          0  按姓名字典序排序                              *\n");
        printf("     *************************************************************\n");
        printf("       Made by ChengXiang, now time is %s\n",ctime(&now));
        printf("\n     *************************************************************\n");
        printf("     *          请您选择操作命令(0~14):");    /*显示提示信息*/
    }
    void printheader(){
        printf(HEADER2);
    } /*格式化输出表头*/
    void printdata(Node *pp) {
        Node* p;
        p=pp;
        printf(FORMAT,DATA);
    }/*格式化输出表中数据*/
    void Wrong() {  
        printf("\n");
        printf("     *************************************************************\n");
    	printf("     *                    错误:输入不合法!!!                     *\n");
        printf("     *************************************************************\n");
        getch();
    }/*输出按键错误信息*/
    void Nofind(){ /*输出未查找此学生的信息*/
        printf("\n");
        printf("     *************************************************************\n");
    	printf("     *                      没有该学生!!!                        *\n");
        printf("     *************************************************************\n");
    }
    void Disp(Link l){ /*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/
        system("cls");          //清屏
        Node *p;
        p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/
        printf("\n                          学生成绩管理系统 \n");
        if(!p) /*p==NULL,NUll在stdlib中定义为0*/
        {
    		printf("     ***************************学生记录**************************\n");
    		printf("     *                         无学生记录!                      *\n");
    		printf("     *************************************************************\n");
    		now = time (NULL);
    		printf("      Made by ChengXiang, now time is %s\n",ctime(&now));
            getchar();
            return;
        }
        printheader(); /*输出表格头部*/
        while(p)    /*逐条输出链表中存储的学生信息*/
        {
            printdata(p);
            p=p->next; /*移动直下一个结点*/
        }
    	now = time (NULL);
    	printf("        Made by ChengXiang, now time is %s\n",ctime(&now));
    }
    Node *Locate(Link l,char findmess[],char nameornum[]){
        Node *r;
        if(strcmp(nameornum,"num")==0) /*按学号查询*/
        {
            r=l->next;
            while(r)
            {
                if(strcmp(r->data.num,findmess)==0) /*若找到findmess值的学号*/
                    return r;
                r=r->next;
            }
        }
        else if(strcmp(nameornum,"name")==0) /*按姓名查询*/
        {
            r=l->next;
            while(r)
            {
                if(strcmp(r->data.name,findmess)==0)    /*若找到findmess值的学生姓名*/
                    return r;
                r=r->next;
            }
        }
        return 0; /*若未找到,返回一个空指针*/
    }
    void failStu(Link l)
    {
    	Node *r;
    	int q,sum=0;
    	system("cls");
    	now = time (NULL);
        printf("\n                          学生成绩管理系统 \n");
    	printheader();
    	r=l->next;
    	while(r)
    	{
    		int i;
    		q=0;
    		for(i=0;i<5;i++)
    			if(r->data.grade[i]<60)
    			{
    				q=1;
    				break;
    			}
    		if(q)
    		{
    			printdata(r);
    		}
    		sum+=q;
    		r=r->next;
    	}
    	if(sum)
    		printf("  *                           共有%d名学生不及格                        *\n",sum);
    	else
    		printf("  *                           good,没有同学不及格                       *\n",sum);
        printf("  **********************************************************************\n");
    	printf("           Made by ChengXiang, now time is %s\n",ctime(&now));
    	getchar();
    	getchar();
    }
    void prefectStu(Link l)
    {
    	Node *r;
    	int q,sum=0;
    	system("cls");
    	now = time (NULL);
        printf("\n                          学生成绩管理系统 \n");
    	printheader();
    	r=l->next;
    	while(r)
    	{
    		int i;
    		q=0;
    		for(i=0;i<5;i++)
    			if(r->data.grade[i]>=90)
    			{
    				q=1;
    				break;
    			}
    		if(q)
    		{
    			printdata(r);
    		}
    		sum+=q;
    		r=r->next;
    	}
    	if(sum)
    		printf("  *                            共有%d名学生优秀                         *\n",sum);
    	else
    		printf("  *                          poor,没有同学是优秀的                      *\n",sum);
        printf("  **********************************************************************\n");
    	printf("           Made by ChengXiang, now time is %s\n",ctime(&now));
    	getchar();
    	getchar();
    }
    void stringinput(char *t,int lens,char *notice){/*输入字符串信息*/
       char n[255];
       do
       {
           printf(notice); /*显示提示信息*/
           scanf("%s",n); /*输入字符串*/
           if(strlen(n)>lens) /*进行长度校验,超过lens值重新输入*/
    	   {   
    			printf("\n");
    			printf("     *************************************************************\n");
    			printf("     *                        超出长度!!!                        *\n");
    			printf("     *************************************************************\n");
    	   }
       }while(strlen(n)>lens);
       strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/
    }
    int numberinput(char *notice){/*输入分数信息*/
        int t=0;
        do
        {
            printf(notice); /*显示提示信息*/
            scanf("%d",&t); /*输入分数*/
            if(t>100 || t<0) //分数校验
    		{
    			printf("\n");
    			printf("     *************************************************************\n");
    			printf("     *                   分数必须在0~100之间!!!                  *\n");
    			printf("     *************************************************************\n");
    		}
        }while(t>100 || t<0);
        return t;
    }
    void Add(Link l){/*在表尾添加学生信息*/
        Node *p,*r,*s;
    	int i;
        char ch,flag=0,num[10];
        r=l;
        system("cls");
        Disp(l); /*先打印出已有的学生信息*/
        while(r->next!=NULL)
            r=r->next; /*将指针移至于链表最末尾,准备添加记录*/
        while(1) /*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/
        {
            s=l->next;
            while(1)
            {
    			printf(" **********************************************************************\n");
                stringinput(num,10,"  *    学号(按0退出):"); /*格式化输入学号并检验*/
                flag=0;
                if(strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/
                    return ;
                s=l->next;
                while(s) /*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/
                {
                    if(strcmp(s->data.num,num)==0)
                    {
                        flag=1;
                        break;
                    }
                    s=s->next;
                }
                if(flag==1) /*提示用户是否重新输入*/
                {
                    getchar();
    				printf("  **********************************************************************\n");
                    printf("  *    学号%s已存在,是否重新输入?(y/n)\a",num);
                    scanf("%c",&ch);
                    if(ch=='y'||ch=='Y')
                        continue;
                    else
                        return ;
                }
                else
                    break;
            }
            p=(Node *)malloc(sizeof(Node));
            strcpy(p->data.num,num); /*将字符串num拷贝到p->data.num中*/
    		printf("  **********************************************************************\n");
            stringinput(p->data.name,15,"  *    Name:");
    		printf("  **********************************************************************\n");
            p->data.grade[0]=numberinput("  *    学科1[0-100]:");
    		printf("  **********************************************************************\n");
            p->data.grade[1]=numberinput("  *    学科2[0-100]:");
    		printf("  **********************************************************************\n");
            p->data.grade[2]=numberinput("  *    学科3[0-100]:");
    		printf("  **********************************************************************\n");
            p->data.grade[3]=numberinput("  *    学科4[0-100]:");
    		printf("  **********************************************************************\n");
            p->data.grade[4]=numberinput("  *    学科5[0-100]:");
    		printf("  **********************************************************************\n");
    		for(i=0,p->data.total=0;i<5;i++)
    			p->data.total+=p->data.grade[i]; /*计算总分*/
            p->data.ave=(float)(p->data.total*1.0/5); /*计算平均分*/
            p->next=NULL;
            while(r->next!=NULL)
                r=r->next;
            r->next=p;
            saveflag=1;
        }
    }
    void Qur(Link l){ /*按学号或姓名,查询学生记录*/
        system("cls");
        int select; /*1:按学号查,2:按姓名查,其他:返回主界面(菜单)*/
        char searchinput[20]; /*保存用户输入的查询内容*/
        Node *p;	
        if(!l->next) /*若链表为空*/
        {	
    		printf("\n                             学生成绩管理系统 \n\n");
    		printf("     ***************************查询成绩**************************\n");
    		printf("     *                    暂无学生记录,查询失败                  *\n");
    		printf("     *************************************************************\n");
    		now = time (NULL);
    		printf("      Made by ChengXiang, now time is %s\n",ctime(&now));
    		getchar();
    		getchar();
            return;
        }
    	printf("\n                             学生成绩管理系统 \n\n");
    	printf("     ***************************查询成绩**************************\n");
        printf("     *                                                           *\n");
    	printf("     *           1 通过学号查找            2 通过姓名查找        *\n");
        printf("     *                                                           *\n");
    	printf("     *************************************************************\n");
    	now = time (NULL);
    	printf("      Made by ChengXiang, now time is %s\n",ctime(&now));
    	printf("\n");
    	printf("     *************************************************************\n");
        printf("     *           请选择[1,2]:");
        scanf("%d",&select);
        if(select==1)   /*按学号查询*/
        {
            stringinput(searchinput,10,"     *           请输入要查找的学号:");
            p=Locate(l,searchinput,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/
            if(p) /*若p!=NULL*/
            {
                printheader();
                printdata(p);
    			printf("     *************************************************************\n");
            }
            else
                Nofind();
        }
        else if(select==2) /*按姓名查询*/
        {
            stringinput(searchinput,15,"     *           请输入学生姓名:");
            p=Locate(l,searchinput,"name");
            if(p)
            {
                printheader();
                printdata(p);
    			printf("     *************************************************************\n");
            }
            else
                Nofind();
        }
        else
            Wrong();
        system("PAUSE");
    }
    void Del(Link l){//删除学生记录:先找到保存该学生记录的节点,然后删除该节点
        int sel;
        Node *p,*r;
        char findmess[20];
        if(!l->next)
        {
            system("cls");
    		printf("\n");
    		printf("                          学生成绩管理系统 \n");
    		printf("\n");
    		printf("     *************************************************************\n");
            printf("     *                      暂无学生记录!!!                      *\n");
    		printf("     *************************************************************\n");
            getch();
            return;
        }
        system("cls");
        Disp(l);
    	printf("     *************************************************************\n");
        printf("     *              1 通过学号删除       2 通过姓名删除          *\n");
        printf("     *              请选择[1,2]:");
        scanf("%d",&sel);
        if(sel==1)
        {
            stringinput(findmess,10,"     *              请输入学号:");
            p=Locate(l,findmess,"num");
            if(p)
            {
                r=l;
                while(r->next!=p)
                r=r->next;
                r->next=p->next;
                free(p); /*释放内存空间*/
    			printf("     *************************************************************\n");
    			printf("     *                          删除成功!!!                      *\n");
    			printf("     *************************************************************\n");
                saveflag=1;
            }
            else
                Nofind();
        }
        else if(sel==2) /*先按姓名查询到该记录所在的节点*/
        {
            stringinput(findmess,15,"     *              请输入学生姓名:");
            p=Locate(l,findmess,"name");
            if(p)
            {
                r=l;
                while(r->next!=p)
                r=r->next;
                r->next=p->next;
                free(p);
    			printf("     *************************************************************\n");
    			printf("     *                          删除成功!!!                      *\n");
    			printf("     *************************************************************\n");
                saveflag=1;
            }
            else
            Nofind();
        }
        else
            Wrong();
        getchar();
    }
    void Modify(Link l){//修改学生记录.先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改
        Node *p;
    	int i;
        char findmess[20];
        if(!l->next)
        {
            system("cls");
    		printf("\n                          学生成绩管理系统 \n\n");
    		printf("     *************************************************************\n");
            printf("     *                        没有学生记录!!!                    *\n");
    		printf("     *************************************************************\n");
    		now = time (NULL);
    		printf("       Made by ChengXiang, now time is %s\n",ctime(&now));
            getchar();
            getchar();
            return;
        }
        system("cls");
        printf("修改学生记录");
        Disp(l);
    	printf(" **********************************************************************\n");
        stringinput(findmess,10,"  *            请输入学号:"); /*输入并检验该学号*/
    	printf("  **********************************************************************\n");
        p=Locate(l,findmess,"num"); /*查询到该节点*/
        if(p) /*若p!=NULL,表明已经找到该节点*/
        {
            printf("  *            学号:%s\n",p->data.num);
            printf("  *            姓名:%s                                                  *\n",p->data.name);
            stringinput(p->data.name,15,"  *            输入新姓名:");
            printf("  *            学科1:%d                                                *\n",p->data.grade[0]);
            p->data.grade[0]=numberinput("  *            学科1[0-100]:");
            printf("  *            学科2:%d                                                *\n",p->data.grade[1]);
            p->data.grade[1]=numberinput("  *            学科2[0-100]:");
            printf("  *            学科3:%d                                                *\n",p->data.grade[2]);
            p->data.grade[2]=numberinput("  *            学科3[0-100]:");
            printf("  *            学科4:%d                                                *\n",p->data.grade[3]);
            p->data.grade[3]=numberinput("  *            学科4[0-100]:");
            printf("  *            学科5:%d                                                *\n",p->data.grade[4]);
            p->data.grade[4]=numberinput("  *            学科5[0-100]:");
    		for(i=0,p->data.total=0;i<5;i++)
    			p->data.total+=p->data.grade[i]; /*计算总分*/
            p->data.ave=(float)(p->data.total*1.0/5);
    		printf("  **********************************************************************\n");
            printf("  *                              修改成功!!!                           *\n");
    		printf("  **********************************************************************\n%");
    		getchar();
            saveflag=1;
        }
        else
            Nofind();
        getchar();
    }
    void Sort(Link l){
        system("cls");		
        Link ll;
        Node *p,*rr,*s;
        int i=0,select;
        if(l->next==NULL)
        {
    	    printf("\n                          学生成绩管理系统 \n");
    		printf("     *************************************************************\n");
            printf("     *            暂无学生记录!请输入学生记录后再进行排序        *\n");
    		printf("     *************************************************************\n");
    		now = time (NULL);
    		printf("           Made by ChengXiang, now time is %s\n",ctime(&now));
            getchar();
    		getchar();
    		return ;
        }  
    	sortmenu();
    	scanf("%d",&select);
        printf("     *************************************************************\n");
    	switch(select)
        {
        case 1:/*按学号从小到大*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.num<p->data.num)
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;            /*增加学生记录*/
    		}
    	case 2:/*按学号从大到小*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.num>=p->data.num)
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;
    		}
    
    
    	case 3:/*按总分从小到大*/
    		{			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.total<p->data.total)
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;
    		}
    
    
    	case 4:/*按总分从大到小*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); /*用于创建新的节点*/
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l); /*显示排序前的所有学生记录*/
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node)); /*新建节点用于保存从原链表中取出的节点信息*/
    				s->data=p->data; /*填数据域*/
    				s->next=NULL;    /*指针域为空*/
    				rr=ll;
    		/*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/
    				while(rr->next!=NULL && rr->next->data.total>=p->data.total)
    				{
    					rr=rr->next;
    				} /*指针移至总分比p所指的节点的总分小的节点位置*/
    				if(rr->next==NULL)/*若新链表ll中的所有节点的总分值都比p->data.total大时,就将p所指节点加入链表尾部*/
    					rr->next=s;
    				else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next; /*原链表中的指针下移一个节点*/
    			}
    			l->next=ll->next; /*ll中存储是的已排序的链表的头指针*/
    			p=l->next;           /*已排好序的头指针赋给p,准备填写名次*/
    			while(p!=NULL) /*当p不为空时,进行下列操作*/
    			{
    				i++;       /*结点序号*/
    				p=p->next;   /*指针后移*/
    			}
    			break;
    		}
    
    
    	case 5:/*按学科1从小到大*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[0]<p->data.grade[0])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;
    		}
    	case 6:/*按学科1从大到小*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[0]>=p->data.grade[0])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;
    		}
    	case 7:/*按学科2从小到大*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[1]<p->data.grade[1])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;            /*增加学生记录*/
    		}
    
    
    	case 8:/*按学科2从大到小*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[1]>=p->data.grade[1])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;            /*增加学生记录*/
    		}
    
    
    	case 9:/*按学科3从小到大*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[2]<p->data.grade[2])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;            /*增加学生记录*/
    		}
    
    
    	case 10:/*按学科3从大到小*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[2]>=p->data.grade[2])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;            /*增加学生记录*/
    		}
    
    
    	case 11:/*按学科4从小到大*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[3]<p->data.grade[3])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;            /*增加学生记录*/
    		}
    	case 12:/*/*按学科4从大到小*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[3]>=p->data.grade[3])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;            /*增加学生记录*/
    		}
    	case 13:/*按学科5从小到大*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[4]<p->data.grade[4])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;
    		}
    	case 14:/*按学科5从大到小*/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node)); 
    				s->data=p->data;
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.grade[4]>=p->data.grade[4])
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next;
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;
    		}
    	case 0:/**/
    		{
    			ll=(Node*)malloc(sizeof(Node)); 
    			ll->next=NULL;
    			printf("当前状态:\n");
    		  //  puts("错误不在这!");
    			Disp(l);
    		  //  system("PAUSE");
    			p=l->next;
    			while(p) /*p!=NULL*/
    			{
    				s=(Node*)malloc(sizeof(Node));
    				s->data=p->data; 
    				s->next=NULL;
    				rr=ll;
    				while(rr->next!=NULL && rr->next->data.name>=p->data.name)
    				{
    					rr=rr->next;
    				} 
    				if(rr->next==NULL)
    					rr->next=s;
    				else 
    				{
    					s->next=rr->next;
    					rr->next=s;
    				}
    				p=p->next;
    			}
    			l->next=ll->next; 
    			p=l->next;
    			while(p!=NULL) 
    			{
    				i++;
    				p=p->next;
    			}
    			break;
    		}
            default: Wrong();getch();break;        /*按键有误,必须为数值0-9*/
        }
        printf("\n*********************************************\n");
    //  puts("错误不在这!");
        Disp(l);
        saveflag=1;
    	printf(" **********************************************************************\n");
        printf("  *                          排序完成!!!                               *\n");
    	printf("  **********************************************************************\n");
    	sortflag=1;
        system("PAUSE");
    }
    void Save(Link l){   //数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘
        FILE* fp1, *fp2;
        Node *p;
        int count=0;
        fp1=fopen("stu.c","w+");/*以只写方式打开二进制文件*/
        fp2=fopen("stu-sort.c","w+");/*以只写方式打开二进制文件*/
        if(sortflag==0)
    	{
    		p=l->next;
    		while(p)
    		{
    			if(fwrite(p,sizeof(Node),1,fp1)==1)
    			{
    				p=p->next;
    				count++;
    			}
    			else break;
    		}
    		if(count>0)
    		{
    			printf("\n\n\n\n\n");
    			printf("     *************************************************************\n");
    			printf("     *                 保存完毕,当前有%d名学生记录              *\n",count);
    			printf("     *************************************************************\n");
    			saveflag=0;
    		}
    		else
    			printf("空文件,保存失败!!\n");
    		fclose(fp1); //关闭此文件
    		getch();
    	}
    	else
    	{
    		    p=l->next;
    		while(p)
    		{
    			if(fwrite(p,sizeof(Node),1,fp2)==1)
    			{
    				p=p->next;
    				count++;
    			}
    			else break;
    		}
    		if(count>0)
    		{
    			printf("\n\n\n\n\n        保存完毕,当前有%d名学生记录\n",count);
    			saveflag=0;
    		}
    		else
    			printf("空文件,保存失败!!\n");
    		fclose(fp2); //关闭此文件
    		getch();
    		sortflag=0;
    	}
    }
    int login(){
        FILE *fp1,*fp2;
        int state;
        char str1[20],str2[20],str_z[20],str_m[20];		
        if((fp1=fopen("admin.txt","rb"))==NULL)
        {
    		printf("\n                             学生成绩管理系统 \n\n");
    		printf("     *************************创建管理员账号**********************\n");
    		printf("     *                    本系统无管理员,请创建!               *\n");
    		printf("     *************************************************************\n");
    		now = time (NULL);
    		printf("      Made by ChengXiang, now time is %s\n",ctime(&now));
    		printf("     *************************************************************\n");
            printf("     *              请输入管理员账号:");
            scanf("%s",str_z);
            printf("     *              请输入密码:      ");
            scanf("%s",str_m);
    		printf("     *************************************************************\n");
            fp2=fopen("admin.txt","wb");
            fprintf(fp2,"%s%c",str_z,'\n');
            fprintf(fp2,"%s%c",str_m,' ');
            fclose(fp2);
        }
        fp1=fopen("admin.txt","rb");
        fscanf(fp1,"%s",str1);
        fscanf(fp1,"%s",str2);
        fclose(fp1);
        while(1)
        {
    		system("cls");
    		printf("\n                             学生成绩管理系统 \n\n");
    		printf("     ****************************登录方式*************************\n");
    		printf("     *                                                           *\n");
            printf("     *              1.管理员模式          0.来宾模式             *\n");
    		printf("     *                                                           *\n");
    		printf("     *************************************************************\n");
    		now = time (NULL);
    		printf("      Made by ChengXiang, now time is %s\n",ctime(&now));
    		printf("     *************************************************************\n");
            printf("     *              请你选择(0-1):");
            scanf("%d",&state);
    		printf("     *************************************************************\n");
            if(state==0)
                return 0;
            else if(state==1)
            {
    			printf("\n     *************************************************************\n");
    			printf("     *              请输入账号:");
                scanf("%s",str_z);
    			printf("     *              请输入密码:");
                scanf("%s",str_m);
    			printf("     *************************************************************\n");
                if(strcmp(str1,str_z)==0&&strcmp(str2,str_m)==0)
    			{
    				getchar();
    				getchar();
                    return 1;
    			}
                else
                {
    				printf("     *************************************************************\n");
                    printf("     *                     账号或密码错误!!!                     *\n");
    				printf("     *************************************************************\n");
                    system("PAUSE");
                    system("cls");
                }
            }
            else
            {				
    			printf("     *************************************************************\n");
    			printf("     *                        输入不合法!!!                      *\a \n");
    			printf("     *************************************************************\n");
                system("PAUSE");
                system("cls");
            }
        }
    }
    void Modify_admin(){
        FILE *fp;
        char str_z[20],str_m[20];
        fp=fopen("admin.txt","wb");
    	printf("     *************************************************************\n");
    	printf("     *          请输入管理员账号:");
        scanf("%s",str_z);
    	printf("     *          请输入密码:      ");
        scanf("%s",str_m);
    	printf("     *************************************************************\n");
        fprintf(fp,"%s%c",str_z,'\n');
        fprintf(fp,"%s%c",str_m,' ');
        fclose(fp);
    	printf("\n     *************************************************************\n");
        printf("     *                  管理员信息更新完毕!!!                   *\a\n");
    	printf("     *************************************************************\n");
        getch();
    }
    int main(){
        system("color 9e");//主屏函数黄色
        Link L;      /*定义链表*/
        FILE *fp,*fp1;    /*文件指针*/
        int select,State=0;  /*保存选择结果变量*/
        char ch,admin[20],admin_p[20];     /*保存(y,Y,n,N)*/
        int count=0; /*保存文件中的记录条数(或结点个数)*/
        Node *p,*r;  /*定义记录指针变量*/
        L=(Node*)malloc(sizeof(Node));
        L->next=NULL;
        r=L;
        fp=fopen("stu.c","ab+");
        fp1=fopen("stu-sort.c","ab+");
        Loop:{
            State=login();
        }
        while(!feof(fp))
        {
            p=(Node*)malloc(sizeof(Node));
            if(fread(p,sizeof(Node),1,fp)==1) /*一次从文件中读取一条学生成绩记录*/
            {
                p->next=NULL;
                r->next=p;
                r=p;                            /*r指针向后移一个位置*/
                count++;
            }
        }
        fclose(fp); /*关闭文件*/
        if(State==1)
        {
        while(1)
        {
            system("cls");
            printf("\n                                                                  管理员模式\n\n\n");
            menu();
            p=r;
            scanf("%d",&select);
    		printf("     *************************************************************\n");
            if(select==0)
            {
                if(saveflag==1) /*若对链表的数据有修改且未进行存盘操作,则此标志为1*/
                {
                    getchar();
    				printf("     *************************************************************\n");
                    printf("     *           记录已修改,是否保存当前记录?(y/n):");
                    scanf("%c",&ch);
    				printf("     *************************************************************\n");
                    if(ch=='y'||ch=='Y')
                        Save(L);
                }
    			printf("     *************************************************************\n");
                printf("     *                         谢谢您的使用!!!                   *\n");
    			printf("     *************************************************************\n");
                break;
            }
            switch(select)
            {
            case 1:Add(L);break;            /*增加学生记录*/
            case 2:Del(L);break;           /*删除学生记录*/
            case 3:Qur(L);break;           /*查询学生记录*/
            case 4:Modify(L);break;        /*修改学生记录*/
            case 5:Sort(L);break;        /*排序学生记录*/
            case 6:Save(L);break;        /*保存学生记录*/
            case 7:failStu(L);break;        /*不及格学生记录*/
            case 8:prefectStu(L);break;        /*优秀学生记录*/
            case 9:Disp(L);system("PAUSE");break;         /*显示学生记录*/
            case 10:system("cls");goto Loop;
            case 11:Modify_admin();break;
            default: Wrong();getch();break;        /*按键有误,必须为数值0-9*/
            }
        }
        }
        else
        {
            while(1)
            {
                system("cls");
    			now = time (NULL);
    			printf("           Made by ChengXiang, now time is %s\n",ctime(&now));
                menu2();
                scanf("%d",&select);
    		printf("     *************************************************************\n");
                if(select==0)
                {
    				printf("     *************************************************************\n");
    				printf("     *                         谢谢您的使用!!!                   *\n");
    				printf("     *************************************************************\n");
                    exit(1);
                }
                switch(select)
                {
                    case 1:Qur(L);break;           /*查询学生记录*/
                    case 2:Sort(L);break;        /*排序学生记录*/
    				case 3:failStu(L);break;        /*不及格学生记录*/
    				case 4:prefectStu(L);break;        /*优秀学生记录*/
                    case 5:Disp(L);system("PAUSE");break;         /*显示学生记录*/
                    case 6:system("cls");goto Loop;
                    default: Wrong();getch();break;        /*按键有误,必须为数值0-9*/
                }
            }
        }
        return 0;
    }

    下面分别对上述知识进行总结,以帮助今后的进一步学习。

    预处理:

    预处理功能主要包括宏定义,文件包含,条件编译三部分。分别对应宏定义命令,文件包含命令,条件编译命令三部分实现。

      预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。

    预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。

    数据类型:

    自定义函数:

    C源程序是由函数组成的。虽然在C语言入门系列前面几篇的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成。函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。C语言不仅提供了极为丰富的库函数,还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言。

     由于采用了函数模块式的结构,C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。


    结构体:

    C语言中,结构体是一种很常用的数据类型。简单而又复杂,能够用好它实属不易。下面总结下它的常见用法及容易出错的地方。
    链表:

    C语言中,结构体是一种很常用的数据类型。简单而又复杂,能够用好它实属不易。下面总结下它的常见用法及容易出错的地方。
    文件操作:
    文件的基本概念
      所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。

    声明:以上详情均可见网站链接。


    展开全文
  • 何为链表链表是一种常用的物理存储单元上非连续、非顺序的存储结构,数据元素...链表类模板链表是一种数据结构,创建链表类模板就是创建一个对象的容器,在容器内可以不同类型的对象进行插入、删除和排序等操作...
    0c776f9d4a9a45bac5d5087c7888fa1c.png

    何为链表?

    链表是一种常用的物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。

    链表由一系列的结点组成,结点可以再运行时动态生成。

    何为结点?

    链表中每一个元素称为结点。每个结点包括两个部分:1.存储数据的数据域 2.存储下个结点地址的指针域。

    链表类模板

    链表是一种数据结构,创建链表类模板就是创建一个对象的容器,在容器内可以对不同类型的对象进行插入、删除和排序等操作。C++标准模板中也有链表类模板。

    如何设计一个简单的链表?

    一、链表的形式选择:

    1.简单单链表

    1.1 不带表头结点的单链表

    2412b5aa35ba2c5cf99baf97320a9018.png

    1.2 带表头结点的单链表

    501edd2b5921e34b05274b563d2adb23.png

    2.单循环链表

    2.1一般形式单链表

    1. 带表头结点的非空循环单链表

    5511fa65a1c340418be0ed372a9d616a.png

    2.带表头结点的空循环单链表

    dee2309f5cec88a19e7bfc3c2455e746.png

    2.2只设尾指针的循环链表

    1.非空表

    0bdffd7c2c5f9382477ffa5972d2cc8c.png

    2.空表

    e908c667c59601504ebfc61f6f64b64a.png

    3.双向链表

    1.非空表

    17b0aee2d5e16741a82b952376f42ebd.png

    2.空表

    79fd939327b17c363b3544b2b2b83218.png

    4.双向循环链表

    1.空表

    145939347402f82169fc4827250aa3ec.png

    2.非空表

    ee10534c46ab470944eabd6b20af3faa.png

    二、链表的功能设定:

    1.向尾节添加数据

    2.遍历链表中的结点

    3.链表结束时释放所有结点

    4.实现队列

    5.实现插入及查找等

    三、设计一个简单的单向链表,实现向尾结点添加数据等功能。

    1.定义一个结点类:

    #include  //引用输入输出流库头文件using namespace std; //引用标准C++库//定义一个链表类class CNode //定义一个结点类{public:CNode *m_pNext; //结点指针int m_Data; //结点数据CNode() //构造函数{m_pNext = NULL; //下个结点数据设为空}};

    2.定义一个链表类:

    class CList //定义一个链表类{private:CNode *m_pHeader; //头结点指针int m_NodeSum; //结点数量public://定义链表构造函数,实现初始化变量CList() {m_pHeader = NULL;m_NodeSum = 0;} //定义链表移动功能构造函数,实现指针向尾节点移动CNode *MoveTrail() {CNode *pTmp = m_pHeader;for (int i = 1; i < m_NodeSum; i++){pTmp = pTmp->m_pNext;}return pTmp;} //定义添加结点数据函数void AddNode(CNode *pNode){if (m_NodeSum == 0){m_pHeader = pNode;}else{CNode *pTrail = MoveTrail();pTrail->m_pNext = pNode;}m_NodeSum++;}//定义遍历链表函数void PassList(){if (m_NodeSum > 0){CNode *pTmp = m_pHeader;printf("%4d
    展开全文
  • /*设计Sort_Link函数(10分):按指定数据项的顺序【学号(升序),或者,成绩(降序)】学生链表进行排序*/ struct StuLink*Sort_Link(struct StuLink *list,int n) { if(n=0) //若链表排序后改变了原...
  • 链表

    2015-01-06 11:11:55
    带头结点的链表动态创建链表,对表内数据进行升序排序,删除重复数据
  • 链表分为动态链表和静态链表,动态链表是通过指针进行访问的,静态链表是通过数组下标进行访问的。本章节主要以静态链表为主,中间涉及静态链表的排序问题。 几点注意: 链表的思想与静态链表的思想:链表思想...
  • C++双向循环链表

    2013-07-04 20:08:47
    同时通过插入链表可以实现插入排序,也就是说,当你把新的数据输入时,数据所在的位置已经是按顺序排好的了,在输出时,只要遍历链表就可以了,用双向循环链表实现的好处在于能够按两种顺序(从大到小,从小到大)对链表进行...
  • 由于链表中,在某一时间段内每个元素使用的频率不同,所以,依赖于这种特点,产生了自组织链表,来提高链表的查找... 3、计数法:在结点中记录被访问的次数,根据被访问的次数,对链表进行排序 4、排序法:根据链表...
  • 自组织链表 由于链表中,在某一时间段内每个元素使用的频率不同,所以,依赖于这种特点,产生了自组织链表,来提高链表的查找... 3、计数法:在结点中记录被访问的次数,根据被访问的次数,对链表进行排序 4、排...
  • 该探索项目分为九个子栏目:数组、字符串、链表、树、排序和搜索、动态规划、设计问题、数学及其他。 关于链表的基础知识:LeetCode链表&链表概念梳理及代码示例 目录 A.链表 (主要考察指针) 链表初级算法...
  • LeetCode#148 排序链表

    2020-11-17 12:48:21
    你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 示例 1: 输入:head = [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3: 输入:head = [] ...
  • 少量字符串排序去重

    2019-04-25 21:04:49
    题目:从键盘输入一个字符串,按照字符顺序从小到大进行排序,并要求删除重复字符。 比如输入”ad2f3adjfeainzzzv”,则输出”23adefijnvz” 今天突然看到这样一个题目 就手痒起来,顺便练习一下,长期考虑业务...
  • 链表:存储的数据的长度是动态的,而且不需要数据进行排序,数据和数据之间是一一的关系(满足线性结构)。 在实际工作中,数组和链表可以解决大部分的问题!!! 栈:需要先进后出的时候 队列:需要先进先出的...
  • 对动态链表的创建不太熟悉的同学请看https://blog.csdn.net/tongjingqi_/article/details/105831323 想了解单链表的增删改的同学请看 https://blog.csdn.net/tongjingqi_/article/details/105873529 本篇讲用选择法...
  • 一、 功能需求说明(必须采用结构体和动态链表实现) (1)用户登录与主界面模块。负责用户登录窗口的生成、用户名以及用户密码的输入与确认。 (2)输入模块。涉及课程信息(包括开课...
  • 只有这样系统才能高效统一的数据进行管理。 算法的时间复杂度取决于() A.问题的规模 B.待处理的数据的初态 C.计算机的配置 D.A和B D 略 顺序表中第一个元素的储存地址是100,每个元素的长度为2,则第5个...
  • 只有这样系统才能高效统一的数据进行管理。 算法的时间复杂度取决于() A.问题的规模 B.待处理的数据的初态 C.计算机的配置 D.A和B D 略 顺序表中第一个元素的储存地址是100,每个元素的长度为2,则第5个...
  • 二叉排序

    2016-04-18 10:50:00
    当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中 节点按关键字有序,且不能用链表... 若要对动态查找表进行高效率的查找,可采用下面介绍的几种特殊的二叉树或...
  • 第二步则是顺序的调整,顺序的调整当然利用二叉搜索树的中序遍历具有的排序功能,该树进行中序遍历,且在遍历的时候动态的将节点的左右指针值更改掉。且需要维护一个前节点指针pr,将当期节点的pre指针指向pr,pr...
  • 链表动态进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。从内存存储的角度看;数组从栈中分配空间(用new则在堆上创建),程序员方便快速,但是自由度小;链表从堆中分配空间,自由....
  • /* 以下代码是测试动态库libxiyuan.so或静态库xiyuanlib.a的容器 操作的testVessel.c源代码。 其中:(该版本加入容器属性) ...该容器可以数据根据比较函数的不同,进行不同的排序; 3.该容器可以根据key值的和...
  • 该探索项目分为九个子栏目:数组、字符串、链表、树、排序和搜索、动态规划、设计问题、数学及其他。 动态规划 首先推荐一篇博文——算法-动态规划 Dynamic Programming--从菜鸟到老鸟,From HankingHu。有关于...
  • 越看到后面,越觉得很多题目都是非常相似的,很多题目都是通过基本的思想扩展来的,因此需要题型进行总结。 算法题目一般分为以下几类,常见的用红色背景标出: 算法思想:贪心、动态规划、分治、递归。 搜索...
  • 二叉排序树与平衡二叉树的实现

    热门讨论 2010-12-26 15:25:31
    二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上...
  • 树上的查找-二叉排序

    千次阅读 2014-08-24 20:08:27
    当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字...若要对动态查找表进行高效率的查找,可采用下面介绍的几种特殊的二叉树或树作为表的组织形式。不妨
  • 二叉搜索树(二叉排序树)

    千次阅读 2013-09-25 22:28:29
    当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字...若要对动态查找表进行高效率的查找,可采用下面介绍的几种特殊的二叉树或树作为表的组织形式。不妨
  • 链表动态进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。从内存存储的角度看;数组从栈中分配空间(用new则在堆上创建),程序员方便快速,但是自由度小;链表从堆中分配空间,自由...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

对动态链表进行排序