自写信息管理系统——C实现

Posted chudongfang2015

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自写信息管理系统——C实现相关的知识,希望对你有一定的参考价值。

信息管理系统

简介:

该管理系统分为三个权限:学生,老师,管理员

用双向链表实现,文件储存,有账号密码功能。

密码实现MD5加密,较难破解

实现了链表添加,查找,排序,删除等基本操作

共分为6个文件

5个.cpp文件  1个.h文件

下面上代码 :

mian.cpp:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#include<ctype.h>
#include<io.h>
 
#define LEN  100
#define PAGE 3  //分页输出时,每页的学生个数 


void admin();
int menu_admin();
void change_change_order_tea();
int  menu_change_order_tea();
void change_delete_order_tea();

void teacher();
int menu_tea();
bool judge_tea();
int read_file_order_tea();




void change_change_order_stu();
int  menu_change_order_stu();
void change_delete_order_stu();


void student();
int menu_stu();
bool judge_stu();
int read_file_order_stu();

bool judge_admin();
void change_order_admin();





int  menu();
int  pmenu_search();
int  read_file();

void pdisplay();
void pdisplay_sort();

int  psearch_mname();
int  psearch_schoolnum();
int  psearch_phone();
int  psearch_sex();
int  psearch_age();

int  delete_pmenu_search();
int  delete_psearch_schoolnum();
int  delete_psearch_mname();
int  delete_psearch_phone();
int  delete_psearch_age();
int  delete_psearch_sex();

int  change_pmenu_search();
int  change_psearch_schoolnum();
int  change_psearch_mname();
int  change_psearch_phone();
int  change_psearch_age();
int  change_psearch_sex();

int  psort_menu();
void psort_age();
void psort_schoolnum();

void save_order_tea();
void save();
void save_order_stu();

typedef struct {
		char mname[9];
	    char schoolnum[15];
    	char sex[3];
    	int  age;
    	char address[20];
        char phone[15];		
	}Node;
	
typedef struct student
{
	Node information; 
	struct student *next;
	struct student *last;
}STUDENT;


typedef struct
{
	char username[100];
	char password[100];
}Node_order_tea;


typedef struct order_tea
{ 
    Node_order_tea information;
	struct order_tea *next;
	struct order_tea *last;
}ORDER_TEA;

typedef struct
{
	char username[100];
	char password[100];
}Node_order_stu;


typedef struct order_stu
{ 
    Node_order_stu information;
	struct order_stu *next;
	struct order_stu *last;
}ORDER_STU;



int num=0;                   //文件中总的学生信息个数 
STUDENT *head=NULL,*iend,*inew;
FILE *fp;                    //文件指针 

int num_order_tea=0;                   //文件中总的学生信息个数 
ORDER_TEA *head_order_tea=NULL,*iend_order_tea,*inew_order_tea;
FILE *fp_order_tea; 

int num_order_stu=0;                   //文件中总的学生信息个数 
ORDER_STU *head_order_stu=NULL,*iend_order_stu,*inew_order_stu;
FILE *fp_order_stu; 

unsigned char PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  



/**********************新加入*****************************/
int main()
{
	int chioce;
	do
	{
    	printf("\n\t\t********************************\n");
    	printf("\t\t*        1.老师                 *\n");
     	printf("\t\t*        2.学生                 *\n");
    	printf("\t\t*        3.管理员               *\n");			
    	printf("\t\t*        0.退出                 *\n");
    	printf("\t\t*********************************\n");
    	printf("\t\t请选择登陆身份:");
    	scanf("%d",&chioce);
        switch(chioce)
    	{  
    	    case 1:
                teacher();
        		break;
        	case 2:
                student();
        		break;
        	case 3:
	        	admin();
        	default:
	        	break;
    	}
	}while(chioce!=0);
	return 0;
}








feature.cpp

#include"head.h"

/********************获取文件名;读取内容;给num,fp,head,flieopenname赋值;创建链表***********************/
//打开文件,并读取文件 
int read_file()
{
	int i;
	int fno,fsize;
	if((fp=fopen("student_system.txt","rt"))==NULL)//判断文件是否存在,若存在打开 
	{                                  //否则询问是否继续打开 
		printf("\n库文件不存在!\n");
		return 0;
	}

	rewind(fp);                            //使文件内部指针移动到文件的开始位置 
	fno=fileno(fp);              //获取文件描述字                       
	fsize=filelength(fno);      //计算文件大小,以字节为单位 
	num=fsize/sizeof(Node);     //计算文件包含的学生信息数目 
	iend=inew=(STUDENT *)malloc(sizeof(STUDENT));//申请动态空间 
	fread(inew,sizeof(Node),1,fp);   //以Node(结构体)的空间大小读数据 
	for(i=1;i<=num;i++)   //利用for循环创建链表,并把数据储存到其中 
	{
	    if(i==1)          //第一个节点的创建 
		{
			inew->next=head;
			inew->last=NULL; //双向链表 
		    iend=inew;
		    head=inew;
		}
	    else
		{
			inew->next=NULL;
			inew->last=iend;
		    iend->next=inew;
		    iend      =inew;
		}
		inew=(STUDENT *)malloc(sizeof(STUDENT));
		fread(inew,sizeof(Node),1,fp);
	}
    free(inew);//释放最后一个没有储存数据的节点 
    fclose(fp);//关闭文件 
    return num;
}











/****************************输入函数*******************/ 

STUDENT *pinput()
{
	char ch;
	if(num==0)//判断是否是第一次录入 
	{
		iend=inew=(STUDENT *)malloc(sizeof(STUDENT));//申请空间 
	    inputone(inew);                              //录入信息 
	    while(1)                                      
		{
			num++;           
		    if(num==1)       //录入第一个学生信息时,第一个节点的指针指向           
			{
				inew->next=NULL;
				inew->last=NULL; 
			    iend      =inew;
			    head      =inew;
			}
 		    else             //在第一个节点的存在下,进行其他节点的录入               
			{
				inew->next=NULL;     //新建立节点next指向NULL         
				inew->last=iend;     //新建立节点last指向上一个节点 
			    iend->next=inew;     //第一个next->下一个节点
			    iend      =inew;     //让iend指向最后一个节点 
			}
		    inew=(STUDENT *)malloc(sizeof(STUDENT));
		    printf("信息输入完毕,是否继续?(是-Y  否-N):"); 
		    scanf("\n%c",&ch);
	        if(ch=='N'||ch=='n')     break;//判断是否跳出循环 
        	inputone(inew);	
		}
    	free(inew);                  //释放未存储数据的节点 
    	return head;
	}
	else//非第一次录入时 
	{
		while(1)//进行循环输入,并进行判断,是否跳出循环 
		{
			
			inew=(STUDENT *)malloc(sizeof(STUDENT));
			getch();
		    inputone(inew);
		    num++;
			inew->next=NULL;   //新建立节点next指向NULL    
			inew->last=iend;   //新建立节点last指向上一个节点
		    iend->next=inew;   //第一个next->下一个节点   
		    iend      =inew;   //让iend指向最后一个节点
    	    printf("信息输入完毕,是否继续?(是-Y  否-N):");
    	    scanf("\n%c",&ch);
	        if(ch=='N'||ch=='n')
	         break;
		}
    	return head;
	}
}

void inputone(STUDENT *temp)
{
	printf("************************\n");
	printf("请输入学生的姓名:");
    scanf("%s",inew->information.mname);
    printf("请输入学生的学号:");
    scanf("%s",inew->information.schoolnum);
    printf("请输入学生的性别(男-M  女-F):");
    scanf("%s",inew->information.sex);
    printf("请输入学生的年龄:");
    scanf("%d",&inew->information.age);
    printf("请输入学生的家庭住址:");
    scanf("%s",inew->information.address);
    printf("请输入学生的电话号码:");
    scanf("%s",inew->information.phone);
}






/****************************输出函数*******************/ 
void displayone(STUDENT *temp) //为简化程序-  单个输出函数,用于调用! 
{
    printf("**********************************\n"); 
    printf("姓名:%s\n",temp->information.mname);
    printf("学号:%s\n",temp->information.schoolnum); 
    printf("性别:%s\n",temp->information.sex);
    printf("年龄:%d\n",temp->information.age);
    printf("家庭住址:%s\n",temp->information.address);
    printf("电话号码:%s\n",temp->information.phone);
	printf("===========================\n");
}

/**************************以head为起始输出链表******************************/
void pdisplay()//核心思想:对链表进行操作,然后利用while循环输出 
{
	STUDENT *temp,*temp1;
	int page=1,lastnum=num%PAGE,stu=0,i,page1;
	char ch;
	int choice;
	if(head==NULL)//判断文件中是否有数据 
	{
		printf("文件中没有数据!!\n");
		getch();
		return;
	}
	temp=head;
	page1=num/PAGE+1;//进行页数的初始化 
	if(lastnum==0)//判断最后一页的数据数 
	{
		lastnum=PAGE;
		page1=page1-1;
	} 	
	while(1)//保留最后节点的指针 
	{
		if(temp->next==NULL)
    	{
	    	temp1=temp;
	    	break;
    	}
    	temp=temp->next;
	} 
	temp=head;
	rewind(fp);		
loop:	printf("----------------------------第%d页-----------------------------\n",page);
 	while(temp!=NULL)//利用while 结构进行输出 知道到最后节点 
	{
        displayone(temp); 
		temp=temp->next;
		stu++;
		if(stu==PAGE)//一页输出完后进行选择,对其链表进行操作 
		{
			printf("4---首页  <--上一页--1                   3--下一页-->  尾页---6  \n");
			scanf("%d",&choice);
			switch(choice)
			{
				case 1://上一页,清屏 ,对其链表进行操作 
					for(i=1;i<=PAGE+stu;i++)
					{
						temp=temp->last;
						if(temp==head)
			    		{
			    			temp=head;
			    			page=1;
			    			break;
				    	}
					}
					if(temp!=head)
					page--;
					stu=0;
					system("cls");
					goto loop;
					
					break;
				case 4://第一页,清屏 ,把head值赋给temp 
					system("cls");
					temp=head;
					stu=0;
					page=1;
					goto loop; 
					break;
				case 6://最后一页,清屏 ,对链表进行操作,找到相应链表值赋给temp 
					system("cls");
					temp=temp1;
					for(i=1;i<=lastnum-1;i++)
					{
						temp=temp->last;
						if(temp==head)
			    		{
			    			temp=head;
			    			page=1;
			    			break;
				    	}
					}
					if(temp!=head)
					page=page1;	
					goto loop; 	
					break;
				case 3://下一页,清屏 继续输出,
					system("cls");
					stu=0;
					page++;
					goto loop;
					break;				
			}
			stu=0;
		}	
	}			
    if(temp==NULL)
	{
	   	printf("\n-------------已到尾页,是否返回首页?(是-Y 否-N):---------------");
		scanf("\n%c",&ch);
		if(toupper(ch)=='Y')
		{
			temp= head;
			page=1; 
			stu=0;
			system("cls");
			goto loop;
		}
	}    
	getch();
}

/***************************加上提示语句*以head为起始输出链表**********************************/ 
void pdisplay_sort()
{                     //提示语句,表示已经进行排序,然后调用输出函数 
	printf("\n信息已经进行了排序,排序后信息如下:\n");
	pdisplay();
}






/****************************搜索函数***head****************/
//基本思路:从第一个数据节点开始进行遍历,知道找到相应信息为止
//遍历: while循环      
//信息比较:if()条件判断语句        及用break;跳出循环 
//进行显示 
//若未找到,输出提示! 
int pmenu_search()
{
	int chioce;
	do//利用switch选择结构和do-while循环,创建子菜单! 
	{
		printf("\n");
	    printf("\t\t********************************\n");
     	printf("\t\t*        1.按姓名查询          *\n");
     	printf("\t\t*        2.按学号查询          *\n");
     	printf("\t\t*        3.按电话号码查询      *\n");			
     	printf("\t\t*        4.按性别查询          *\n");
    	printf("\t\t*        5.按年龄查询          *\n");
    	printf("\t\t*        0.退出                *\n");
    	printf("\t\t********************************\n");
      	printf("\t\t请选择:");
     	scanf("%d",&chioce);
    	switch(chioce)
		{  
	    case 1:
         psearch_mname();        //调用按姓名查询函数  
		 getch();
		break;
     	case 2:
         psearch_schoolnum();     //调用按学号查询函数  
		 getch();
		break;
    	case 3:
         psearch_phone();         //调用按电话号码查询函数  
		 getch();
		break;
    	case 4:
		 psearch_sex();          //调用按性别查询函数  
		 getch();
	    break;
     	case 5:
         psearch_age();          //调用按年龄查询函数  
         getch();
	   	break;
    	default:
		break;
	}
	}while(chioce!=0);
	return 0;
}

int psearch_schoolnum()
{
	char schoolnum1[15];
	int x=0;
	STUDENT *temp;
	temp=head;
	printf("请输入学生学号:");
	scanf("%s",schoolnum1);
	while(temp!=NULL)       //利用while 函数对链表进行遍历,并查询 
	{
		if(!strcmp(schoolnum1,temp->information.schoolnum))//利用字符串处理函数进行比较 
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			break;           //输出并跳出循环 
		}
		x++;
		temp=temp->next;
	}
	if(x==num)//判断是否找到 ,如果未找到,输出提示! 
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
		return x;
}

int psearch_mname()
{
	char mname1[9];
	int x=0;
	STUDENT *temp;
	temp=head;
	printf("请输入学生姓名:");
	scanf("%s",mname1);
	while(temp!=NULL)
	{
		if(!strcmp(mname1,temp->information.mname))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			break;
		}
		x++;
		temp=temp->next;
	}
	if(x==num)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
		return x;

}

int psearch_phone()
{
	char phone1[15];
	int x=0;
	STUDENT *temp;
	temp=head;
	printf("请输入学生电话:");
	scanf("%s",phone1);
	while(temp!=NULL)
	{
		if(!strcmp(phone1,temp->information.phone))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			break;
		}
		x++;
		temp=temp->next;
	}
	if(x==num)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
		return x;
}

int psearch_sex()
{
	char sex1[15];
	int x=0;
	STUDENT *temp;
	temp=head;
	printf("请输入学生性别:");
	scanf("%s",sex1);
	while(temp!=NULL)
	{
		if(!strcmp(sex1,temp->information.sex))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
		}
		x++;
		temp=temp->next;
	}
	if(x==num)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
		return x;

}

int psearch_age()
{
	STUDENT *temp;
	temp=head;
	int  age,x=0;
	printf("请输入学生年龄:");
	scanf("%d",&age);
	while(temp!=NULL)
	{
		if(age==temp->information.age)
		{		
		    printf("姓名:%s\n",temp->information.mname);
	       	printf("学号:%s\n",temp->information.schoolnum);
	    	printf("性别:%s\n",temp->information.sex);
	    	printf("年龄:%d\n",temp->information.age);
     		printf("家庭住址:%s\n",temp->information.address);  
		    printf("电话号码:%s\n",temp->information.phone);
			printf("===========================\n");
			x++;
		}
		temp=temp->next;
	}
	if(x==num)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
		return x;
}



/****************************删除函数  head*******************/ 
//基本思路:从第一个数据节点开始进行遍历,知道找到相应信息为止
//而后把其节点删除,把指针连接到下一节点上 
//若未找到,输出提示! 
int delete_pmenu_search()
{
	int chioce;
	do
	{
		printf("\n");
	    printf("\t\t********************************\n");
     	printf("\t\t*        1.按姓名检索          *\n");
     	printf("\t\t*        2.按学号检索          *\n");
     	printf("\t\t*        3.按电话号码检索      *\n");			
     	printf("\t\t*        4.按性别检索          *\n");
    	printf("\t\t*        5.按年龄检索          *\n");
    	printf("\t\t*        0.退出                *\n");
    	printf("\t\t********************************\n");
      	printf("\t\t请选择:");
     	scanf("%d",&chioce);
    	switch(chioce)
		{  
	    case 1:
         delete_psearch_mname();
		 getch();
		break;
     	case 2:
         delete_psearch_schoolnum();
		 getch();
		break;
    	case 3:
         delete_psearch_phone();
		 getch();
		break;
    	case 4:
		 delete_psearch_sex();
		 getch();
	    break;
     	case 5:
         delete_psearch_age();
         getch();
	   	break;
    	default:
		break;
	}
	}while(chioce!=0);
	return 0;
}
                
int delete_psearch_schoolnum()
{
	char schoolnum1[15];
	char ch;
	int i;
	int x=0,live=0;
	STUDENT *temp,*pPre,*pTemp;
	temp =head;
	pTemp=head;
	pPre =head;
	printf("请输入学生学号:");
	scanf("%s",schoolnum1);
	while(temp!=NULL)//利用while先遍历搜索 
	{
		x++;
		if(!strcmp(schoolnum1,temp->information.schoolnum))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			live=1;
			break;
		}	
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("是否删除数据?(删除-Y,放弃删除-N)");
		scanf("\n%c",&ch);
		if(ch=='y'||ch=='Y')
		{
			if(x==1)//判断是否是第一个数据 
			{
				head=pTemp->next;
			} 
		    else       //x为计数器,找出其节点的上一个和下一个节点 
		    {         //并连接两个节点 ,也可以利用双向链表进行连接 
	         	for(i=1;i<x;i++)    //若建立双向链表 
		        {                   //temp->last->next=temp->next; 
		         	pPre=pTemp;          
		         	pTemp=pTemp->next;  
		        }                         
	        	pPre->next=pTemp->next;
	     	 }
	    	 free(pTemp);     //释放删除了的节点空间 
	    	 num--;           //num代表总的学生数据数,数据数减一 
	    	 printf("数据已删除!");
	    }
     	return x;
	}
	x=0;		
}

int delete_psearch_mname()
{
	char mname1[9];
	char ch;
	int x=0,i,live=0;
	STUDENT *temp,*pPre,*pTemp;
	temp =head;
	pTemp=head;
	pPre =pTemp;
	printf("请输入学生姓名:");
	scanf("%s",mname1);
	while(temp!=NULL)
	{
		x++;
		if(!strcmp(mname1,temp->information.mname))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			live=1;
			break;
		}
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("是否删除数据?(删除-Y,放弃删除-N)");
		scanf("\n%c",&ch);
		if(ch=='y'||ch=='Y')
		{
			if(x==1)
			{
				head=pTemp->next;
			} 
			 else
			 {
			 
	     	   for(i=1;i<x;i++)
		       	{
		     		pPre=pTemp;
		       		pTemp=pTemp->next;
		    	}
	     		pPre->next=pTemp->next;
	   	     }
			free(pTemp);
			num--;
			printf("数据已删除!");
		}

		return x;
	}
	x=0;
}

int delete_psearch_phone()
{
	char phone1[15];
	char ch;
	int x=0,i,live=0;
	STUDENT *temp,*pPre,*pTemp;
	temp =head;
	pTemp=head;
	pPre =pTemp;
	printf("请输入学生电话:");
	scanf("%s",phone1);
	while(temp!=NULL)
	{
		x++;
		if(!strcmp(phone1,temp->information.phone))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			live=1;
			break;
		}
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("是否删除数据?(删除-Y,放弃删除-N)");
		scanf("\n%c",&ch);
		if(ch=='y'||ch=='Y')
		{
			if(x==1)
			{
				head=pTemp->next;
			} 
			 else
			 {
			 
	     	   for(i=1;i<x;i++)
		       	{
		     		pPre=pTemp;
		       		pTemp=pTemp->next;
		    	}
	     		pPre->next=pTemp->next;
	   	     }
			free(pTemp);
			num--;
			printf("数据已删除!");
		}

		return x;
	}
	x=0;
}

int delete_psearch_sex()
{
	char sex1[15];
	int x=0,live=0;
	STUDENT *temp;
	temp=head;
	printf("请输入学生性别:");
	scanf("%s",sex1);
	while(temp!=NULL)
	{
		if(!strcmp(sex1,temp->information.sex))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			live=1;
		}
		x++;
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("请确定您所需要删除的学生信息!");
	    getch();
        delete_pmenu_search();
		return x;
	}
}

int delete_psearch_age()
{
	STUDENT *temp;
	temp=head;
	int  age,x=0,live=0;
	printf("请输入学生年龄:");
	scanf("%d",&age);
	while(temp!=NULL)
	{
		if(age==temp->information.age)
		{		
		    printf("姓名:%s\n",temp->information.mname);
	       	printf("学号:%s\n",temp->information.schoolnum);
	    	printf("性别:%s\n",temp->information.sex);
	    	printf("年龄:%d\n",temp->information.age);
     		printf("家庭住址:%s\n",temp->information.address);  
		    printf("电话号码:%s\n",temp->information.phone);
			printf("===========================\n");
			live=1;
			x++;
		}
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("请确定您所需要删除的学生信息!");
	    getch();
        delete_pmenu_search();
		return x;
	}
}




/***************************修改函数* head******************/ 
//基本思路:从第一个数据节点开始进行遍历,知道找到相应信息为止
//而后把其节点重新录入,覆盖原节点! 
//若未找到,输出提示! 
int change_one(STUDENT *pTemp)//利用单个函数简化函数 
{
	printf("请重新录入!");
	printf("************************\n");
    printf("请输入学生的姓名:");
    scanf("%s",pTemp->information.mname);
	printf("请输入学生的学号:");
	scanf("%s",pTemp->information.schoolnum);
	printf("请输入学生的性别(男-M  女-F):");
	scanf("%s",pTemp->information.sex);
	printf("请输入学生的年龄:");
	scanf("%d",&pTemp->information.age);
	printf("请输入学生的家庭住址:");
	scanf("%s",pTemp->information.address);
	printf("请输入学生的电话号码:");
	scanf("%s",pTemp->information.phone);	
	return 0;
} 

int change_pmenu_search()
{
	int chioce;
	do
	{
		printf("\n");
	    printf("\t\t********************************\n");
     	printf("\t\t*        1.按姓名检索          *\n");
     	printf("\t\t*        2.按学号检索          *\n");
     	printf("\t\t*        3.按电话号码检索      *\n");			
     	printf("\t\t*        4.按性别检索          *\n");
    	printf("\t\t*        5.按年龄检索          *\n");
    	printf("\t\t*        0.退出                *\n");
    	printf("\t\t********************************\n");
      	printf("\t\t请选择:");
     	scanf("%d",&chioce);
    	switch(chioce)
		{  
	    case 1:
        change_psearch_mname();
		 getch();
		break;
     	case 2:
        change_psearch_schoolnum();
		 getch();
		break;
    	case 3:
        change_psearch_phone();
		 getch();
		break;
    	case 4:
	    change_psearch_sex();
		 getch();
	    break;
     	case 5:
        change_psearch_age();
         getch();
	   	break;
    	default:
		break;
	}
	}while(chioce!=0);
	return 0;
}

int change_psearch_schoolnum()
{
	char schoolnum1[15];
	char ch;
	int live=0;
	STUDENT *temp;
	temp=head;
	printf("请输入学生学号:");
	scanf("%s",schoolnum1);
	while(temp!=NULL)
	{
		if(!strcmp(schoolnum1,temp->information.schoolnum))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			live=1;
			break;
		}	
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("是否修改数据?(修改-Y,放弃修改-N)");
		scanf("\n%c",&ch);
		if(ch=='y'||ch=='Y')
		{
            change_one(temp);
			printf("数据修改完成!");
		}
		return 0;
	}		
}
  
int change_psearch_mname()
{
	char mname1[9];
	char ch;
	int live=0;
	STUDENT *temp;
	temp=head;
	printf("请输入学生姓名:");
	scanf("%s",mname1);
	while(temp!=NULL)
	{
		if(!strcmp(mname1,temp->information.mname))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			live=1;
			break;
		}
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("是否修改数据?(修改-Y,放弃修改-N)");
		scanf("\n%c",&ch);
		if(ch=='y'||ch=='Y')
		{
       		change_one(temp);
			printf("数据修改完成!");
		}
		return 0;
	}
}

int change_psearch_phone()
{
	char phone1[15];
	char ch;
	int live=0;
	STUDENT *temp;
	temp =head;
	printf("请输入学生电话:");
	scanf("%s",phone1);
	while(temp!=NULL)
	{
		if(!strcmp(phone1,temp->information.phone))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			live=1;
			break;
		}
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("是否修改数据?(修改-Y,放弃修改-N)");
		scanf("\n%c",&ch);
		if(ch=='y'||ch=='Y')
		{
			change_one(temp);
			printf("数据修改完成!");
		}
		return 0;
	}
}

int change_psearch_sex()
{
	char sex1[15];
	int x=0,live=0;
	STUDENT *temp;
	temp=head;
	printf("请输入学生性别:");
	scanf("%s",sex1);
	while(temp!=NULL)
	{
		if(!strcmp(sex1,temp->information.sex))
		{		
			printf("查询结果如下:\n");
			printf("=============================\n");
		    printf("\t姓名:%s\n",temp->information.mname);
	       	printf("\t学号:%s\n",temp->information.schoolnum);
	    	printf("\t性别:%s\n",temp->information.sex);
	    	printf("\t年龄:%d\n",temp->information.age);
     		printf("\t家庭住址:%s\n",temp->information.address);  
		    printf("\t电话号码:%s\n",temp->information.phone);
			printf("=============================\n");
			live=1;
		}
		x++;
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("请确定您所需要修改的学生信息!");
	    getch();
        change_pmenu_search();
		return x;
	}
}

int change_psearch_age()
{
	STUDENT *temp;
	temp=head;
	int  age,x=0,live=0;
	printf("请输入学生年龄:");
	scanf("%d",&age);
	while(temp!=NULL)
	{
		if(age==temp->information.age)
		{		
		    printf("姓名:%s\n",temp->information.mname);
	       	printf("学号:%s\n",temp->information.schoolnum);
	    	printf("性别:%s\n",temp->information.sex);
	    	printf("年龄:%d\n",temp->information.age);
     		printf("家庭住址:%s\n",temp->information.address);  
		    printf("电话号码:%s\n",temp->information.phone);
			printf("===========================\n");
			live=1;
			x++;
		}
		temp=temp->next;
	}
	if(live==0)
	{
		printf("未能找到符合条件的结果!!");
		return -1;
	}
	else
	{
		printf("请确定您所需要修改的学生信息!");
	    getch();
        change_pmenu_search();
		return x;
	}
}



/****************************排序函数,  head*******************/ 
//基本思路:选择要进行排序的元素(年龄or学号) 选择排序方法 :冒泡排序!  
//注意使用链表排序,交换问题! 
//进行输出,调用输出函数! 
int psort_menu()
{
	int chioce;
	do
	{
		printf("\n");
	    printf("\t\t********************************\n");
     	printf("\t\t*        1.按学号排序          *\n");			
    	printf("\t\t*        2.按年龄年龄          *\n");
    	printf("\t\t*        0.退出                *\n");
    	printf("\t\t********************************\n");
      	printf("\t\t请选择:");
     	scanf("%d",&chioce);
    	switch(chioce)
		{  
	    case 1:
            psort_schoolnum();
    		break;
     	case 2:
            psort_age();
	    	break;
    	default:
		break;
	}
	}while(chioce!=0);
	return 0;
}

void psort_schoolnum()//利用冒泡排序-----下节李珍同学讲 
{
	STUDENT *p1,*p2,*ptemp,*pfinished=NULL;
	for(p1=head;p1->next!=pfinished;)
	{
		for(p2=p1;p2->next!=pfinished;)
		{
			if(atof(p2->information.schoolnum)>atof(p2->next->information.schoolnum))
			{
				if(p2==p1)
				{
			    	p1=p2->next;
			    	p2->next=p1->next;
			    	p1->next=p2;
			    	ptemp=p1;
				}
				else
				{
					ptemp->next=p2->next;
					ptemp=p2->next;
					p2->next=ptemp->next;
			    	ptemp->next=p2;		
				}
			}
			else
			{
				ptemp=p2;
				p2=p2->next;
			}
		}
		pfinished=p2;
	}		
	head=p1;
	pdisplay_sort();
}

void psort_age()
{
	STUDENT *p1,*p2,*ptemp,*pfinished=NULL;
	for(p1=head;p1->next!=pfinished;)
	{
		for(p2=p1;p2->next!=pfinished;)
		{
			if(p2->information.age>p2->next->information.age)
			{
				if(p2==p1)
				{
			    	p1=p2->next;
			    	p2->next=p1->next;
			    	p1->next=p2;
			    	ptemp=p1;
				}
				else
				{
					ptemp->next=p2->next;
					ptemp=p2->next;
					p2->next=ptemp->next;
			    	ptemp->next=p2;
					
				}
			}
			else
			{
				ptemp=p2;
				p2=p2->next;
			}
		}
		pfinished=p2;
	}
	head=p1;		
	pdisplay_sort();
}




//保存链表,把链表保存到相应文件中 
void save()
{	
	STUDENT *temp;
	char ch;	
	temp=head;
	char filename[LEN];	
	getch();
	printf("是否把信息存储到文件中?(是-Y  否-N):"); 
	scanf("\n%c",&ch);			
	if(toupper(ch)=='Y')
	{
		printf("是否储存到原文件中?(是-Y  否-N):");
		scanf("\n%c",&ch);
    	/*******************创建新文件,并把链表写入*************************/ 
		if(toupper(ch)=='N')
		{
			printf("\n请输入要保存的文件的完整路径及文件名:");
		    scanf("\n");
		    gets(filename); 
		    fp=fopen(filename,"wt");
	     	while(temp!=NULL)
		    {
		   		fwrite(temp,sizeof(Node),1,fp);
			   	temp=temp->next;		
		    }					
		    fclose(fp);	
		}
		else /****************把数据写入原文件fileopenname*********************/ 
		{
			fp=fopen("student_system.txt","wt");
	     	while(temp!=NULL)
		    {
     		    fwrite(temp,sizeof(Node),1,fp);
			    temp=temp->next;		
		    }					
		    fclose(fp);		
	    }
	}
}


admin.cpp



#include"head.h"



void admin()
{
	if(judge_admin())
	{
		read_file(); 
		menu_admin();
	}
	else 
		return ;
}


bool judge_admin()
{
	int i=0,j=0;
	FILE *pf;
	char password[100];
	char password1[100];
	pf=fopen("order_admin.txt","rt");
	fscanf(pf,"%s",password);
	fclose(pf);
	printf("\n请输入密码:");
	do
	{
		password1[i]=getch();
		if(password1[i]==0x1B)
		{
			return false;
		}
		if(password1[i]==13)
		{
			password1[i]='\0';
			break;
		}
		i++;
		printf("*");
	}while(1);
	if(!strcmp(MD5(password1),password))
			return true;
	else
	{
	     printf("\n密码错误!");
		 return false;
	}
}



int menu_admin()
{
	int chioce;
	do
	{
    	printf("\n\t\t*******************************\n");
    	printf("\t\t*        1.信息录入           *\n");
     	printf("\t\t*        2.信息查看           *\n");
    	printf("\t\t*        3.信息修改           *\n");			
     	printf("\t\t*        4.信息查询           *\n");
     	printf("\t\t*        5.信息删除           *\n");
    	printf("\t\t*        6.信息排序           *\n");
		printf("\t\t*        7.学生密码管理       *\n");
     	printf("\t\t*        8.老师密码管理       *\n");
    	printf("\t\t*        9.更改管理员密码     *\n");
    	printf("\t\t*        0.退出               *\n");
    	printf("\t\t*******************************\n");
    	printf("\t\t请选择:");
    	scanf("%d",&chioce);
        switch(chioce)
    	{  
    	    case 1:
                pinput();
        		break;
        	case 2:
                pdisplay();
        		break;
        	case 3:
	        	change_pmenu_search();
        		break;
         	case 4:
                pmenu_search();
    	        break;
        	case 5:
                delete_pmenu_search();
        	   	break;
        	case 6:
                psort_menu(); 
        		break;
         	case 7:
				read_file_order_stu();
				menu_change_order_stu();
    	        break;
        	case 8:
				read_file_order_tea();
				menu_change_order_tea();
        	   	break;
        	case 9:
                change_order_admin();
        		break;
        	default:
	        	break;
    	}
	}while(chioce!=0);
	return 0;
}




void change_order_admin()
{
	int i=0;
	FILE *fp;
	FILE *fp1;
	char password[100];
	char oldpassword[100];
	char newpassword[100];
	char newpassword1[100];
	fp=fopen("order_admin.txt","rt");
	fscanf(fp,"%s",password);
	fclose(fp);

	printf("请输入原来密码:");
	scanf("%s",oldpassword);
	if(strcmp(password,MD5(oldpassword)))   
	{
		printf("\n密码错误!");
		return ;
	}
	printf("\n请输入新密码:");
	scanf("%s",newpassword);
	
	strcpy(newpassword1,MD5(newpassword));
	fp1=fopen("order_admin.txt","wt");
	fprintf(fp1,"%s",newpassword1);
	fclose(fp1);
	printf("\n密码修改完毕!");
}


/**************************admin_tea***************************/
int  menu_change_order_tea()
{
	int chioce;
	do
	{
    	printf("\n\t\t********************************\n");
    	printf("\t\t*        1.添加信息             *\n");
     	printf("\t\t*        2.更改信息             *\n");
		printf("\t\t*        3.删除信息             *\n");
    	printf("\t\t*        0.退出                 *\n");
    	printf("\t\t*********************************\n");
    	printf("\t\t请选择:");
    	scanf("%d",&chioce);
        switch(chioce)
    	{  
    		case 0:
				save_order_tea();
				break;
    	    case 1:
                change_add_order_tea();
        		break;
        	case 2:
                change_change_order_tea();
        		break;
			case 3:
                change_delete_order_tea();
        		break;
        	default:
	        	break;
    	}
	}while(chioce!=0);
	return 0;
}

void change_delete_order_tea()//管理老师密码
{
	int x;
	ORDER_TEA *temp=head_order_tea;
	char username1[20];
	printf("\n请输入用户名:");
	scanf("%s",username1);
	while(temp!=NULL)
	{
		if(!strcmp(temp->information.username,username1))
		{
			temp->last->next=temp->next;
			printf("\n删除完毕!");
			return ;
		}
		temp=temp->next;
		x++;
	}
	printf("不存在此用户名!");
	return ;
}




void change_change_order_tea()
{
	int x,i=0;
	ORDER_TEA *temp=head_order_tea;
	char username1[100];
	char password1[100];
	printf("\n请输入用户名:");
	scanf("%s",username1);
	while(temp!=NULL)
	{
		if(!strcmp(temp->information.username,username1))
		{		
			printf("\n请重新输入密码:");
        	scanf("%s",password1);
			/*do
			{
				if(password1[i]=='\0')   break;
				password1[i]=password1[i]+i;
				i++;
			}while(1);*/
			strcpy(temp->information.password,MD5(password1));
			printf("修改完毕!");
			return ;
		}
		temp=temp->next;
		x++;
	}
	printf("不存在此用户名!");
	return ;
}






ORDER_TEA *change_add_order_tea()
{
	int i=0;
	char username2[100];
	char password2[100];
	char ch;
	if(num_order_tea==0)//判断是否是第一次录入 
	{
		iend_order_tea=inew_order_tea=(ORDER_TEA *)malloc(sizeof(ORDER_TEA));//申请空间 
	    printf("\n请输入用户名:");
		scanf("%s",username2);
		strcpy(inew_order_tea->information.username,username2);
		printf("\n请输入密码:");
		scanf("%s",password2);
		/*do
		{
		    if(password2[i]=='\0')   break;
		    password2[i]=password2[i]+i;
		    i++;
		}while(1);*/
		strcpy(inew_order_tea->information.password,MD5(password2));
		//录入信息 
	    while(1)                                      
		{
			num_order_tea++;           
		    if(num_order_tea==1)       //录入第一个学生信息时,第一个节点的指针指向           
			{
				inew_order_tea->next=NULL;
				inew_order_tea->last=NULL; 
			    iend_order_tea      =inew_order_tea;
			    head_order_tea      =inew_order_tea;
			}
 		    else             //在第一个节点的存在下,进行其他节点的录入               
			{
				inew_order_tea->next=NULL;     //新建立节点next指向NULL         
				inew_order_tea->last=iend_order_tea;     //新建立节点last指向上一个节点 
			    iend_order_tea->next=inew_order_tea;     //第一个next->下一个节点
			    iend_order_tea      =inew_order_tea;     //让iend指向最后一个节点 
			}
		    inew_order_tea=(ORDER_TEA *)malloc(sizeof(ORDER_TEA));
		    printf("信息输入完毕,是否继续?(是-Y  否-N):"); 
		    scanf("\n%c",&ch);
	        if(ch=='N'||ch=='n')     break;//判断是否跳出循环 
			printf("\n请输入用户名:");
     		scanf("%s",username2);
    		strcpy(inew_order_tea->information.username,username2);
    		printf("\n请输入密码:");
     		scanf("%s",password2);
	    	/*do
			{
    		    if(password2[i]=='\0')   break;
    		    password2[i]=password2[i]+i;
    		    i++;
			}while(1);*/
        	strcpy(inew_order_tea->information.password,MD5(password2));	
		}
    	free(inew_order_tea);                  //释放未存储数据的节点 
    	return head_order_tea;
	}
	else//非第一次录入时 
	{
		while(1)//进行循环输入,并进行判断,是否跳出循环 
		{
			
			inew_order_tea=(ORDER_TEA *)malloc(sizeof(ORDER_TEA));
			getch();
		    
			printf("\n请输入用户名:");
     		scanf("%s",username2);
    		strcpy(inew_order_tea->information.username,username2);
    		printf("\n请输入密码:");
    		scanf("%s",password2);
     		do
			{
	    	    if(password2[i]=='\0')   break;
    		    password2[i]=password2[i]+i;
     		    i++;
			}while(1);
    		strcpy(inew_order_tea->information.password,password2);
		    
			num_order_tea++;
			inew_order_tea->next=NULL;   //新建立节点next指向NULL    
			inew_order_tea->last=iend_order_tea;   //新建立节点last指向上一个节点
		    iend_order_tea->next=inew_order_tea;   //第一个next->下一个节点   
		    iend_order_tea      =inew_order_tea;   //让iend指向最后一个节点
    	    printf("信息输入完毕,是否继续?(是-Y  否-N):");
    	    scanf("\n%c",&ch);
	        if(ch=='N'||ch=='n')
	         break;
		}
    	return head_order_tea;
	}
}

void save_order_tea()
{
	int i=0;
	ORDER_TEA *temp=head_order_tea;
	fp_order_tea=fopen("order_tea.txt","wt");
	while(temp!=NULL)
	{
		fwrite(temp,sizeof(Node_order_tea),1,fp_order_tea);
	    temp=temp->next;		
	}					
	fclose(fp_order_tea);	
}


/*************************admin_student***********************************/
int  menu_change_order_stu()
{
	int chioce;
	do
	{
    	printf("\n\t\t********************************\n");
    	printf("\t\t*        1.添加信息             *\n");
     	printf("\t\t*        2.更改信息             *\n");
		printf("\t\t*        3.删除信息             *\n");
    	printf("\t\t*        0.退出                 *\n");
    	printf("\t\t*********************************\n");
    	printf("\t\t请选择:");
    	scanf("%d",&chioce);
        switch(chioce)
    	{  
     		case 0:
				save_order_stu();
				break;
    	    case 1:
                change_add_order_stu();
        		break;
        	case 2:
                change_change_order_stu();
        		break;
			case 3:
                change_delete_order_stu();
        		break;
        	default:
	        	break;
    	}
	}while(chioce!=0);
	return 0;
}

void change_delete_order_stu()//管理学生密码
{
	int x;
	ORDER_STU *temp=head_order_stu;
	char username1[20];
	printf("\n请输入用户名:");
	scanf("%s",username1);
	while(temp!=NULL)
	{
		if(!strcmp(temp->information.username,username1))
		{
			temp->last->next=temp->next;
			printf("\n删除完毕!");
			return ;
		}
		temp=temp->next;
		x++;
	}
	printf("不存在此用户名!");
	return ;
}




void change_change_order_stu()
{
	int x,i=0;
	ORDER_STU *temp=head_order_stu;
	char username1[100];
	char password1[100];
	printf("\n请输入用户名:");
	scanf("%s",username1);
	while(temp!=NULL)
	{
		if(!strcmp(temp->information.username,username1))
		{		
			printf("\n请重新输入密码:");
        	scanf("%s",password1);
	    	/*do
			{
				if(password1[i]=='\0')   break;
				password1[i]=password1[i]+i;
				i++;
			}while(1);*/
			strcpy(temp->information.password,MD5(password1));
			printf("修改完毕!");
			return ;
		}
		temp=temp->next;
		x++;
	}
	printf("不存在此用户名!");
	return ;
}






ORDER_STU *change_add_order_stu()
{
	int i=0;
	char username2[100];
	char password2[100];
	char ch;
	if(num_order_stu==0)//判断是否是第一次录入 
	{
		iend_order_stu=inew_order_stu=(ORDER_STU *)malloc(sizeof(ORDER_STU));//申请空间 
	    printf("\n请输入用户名:");
		scanf("%s",username2);
		strcpy(inew_order_stu->information.username,username2);
		printf("\n请输入密码:");
		scanf("%s",password2);
		strcpy(inew_order_stu->information.password,MD5(password2));
		//录入信息 
	    while(1)                                      
		{
			num_order_stu++;           
		    if(num_order_stu==1)       //录入第一个学生信息时,第一个节点的指针指向           
			{
				inew_order_stu->next=NULL;
				inew_order_stu->last=NULL; 
			    iend_order_stu      =inew_order_stu;
			    head_order_stu      =inew_order_stu;
			}
 		    else             //在第一个节点的存在下,进行其他节点的录入               
			{
				inew_order_stu->next=NULL;     //新建立节点next指向NULL         
				inew_order_stu->last=iend_order_stu;     //新建立节点last指向上一个节点 
			    iend_order_stu->next=inew_order_stu;     //第一个next->下一个节点
			    iend_order_stu      =inew_order_stu;     //让iend指向最后一个节点 
			}
		    inew_order_stu=(ORDER_STU *)malloc(sizeof(ORDER_STU));
		    printf("信息输入完毕,是否继续?(是-Y  否-N):"); 
		    scanf("\n%c",&ch);
	        if(ch=='N'||ch=='n')     break;//判断是否跳出循环 
			printf("\n请输入用户名:");
     		scanf("%s",username2);
    		strcpy(inew_order_stu->information.username,MD5(password2));
    		printf("\n请输入密码:");
     		scanf("%s",password2);
			do
			{
			    if(password2[i]=='\0')   break;
			    password2[i]=password2[i]+i;
				i++;
			}while(1);
        	strcpy(inew_order_stu->information.password,password2);	
		}
    	free(inew_order_stu);                  //释放未存储数据的节点 
    	return head_order_stu;
	}
	else//非第一次录入时 
	{
		while(1)//进行循环输入,并进行判断,是否跳出循环 
		{
			
			inew_order_stu=(ORDER_STU *)malloc(sizeof(ORDER_STU));
			getch();
		    
			printf("\n请输入用户名:");
     		scanf("%s",username2);
    		strcpy(inew_order_stu->information.username,username2);
    		printf("\n请输入密码:");
    		scanf("%s",password2);
			do
			{
		        if(password2[i]=='\0')   break;
    		    password2[i]=password2[i]+i;
    		    i++;
			}while(1);
    		strcpy(inew_order_stu->information.password,password2);
		    
			num_order_stu++;
			inew_order_stu->next=NULL;   //新建立节点next指向NULL    
			inew_order_stu->last=iend_order_stu;   //新建立节点last指向上一个节点
		    iend_order_stu->next=inew_order_stu;   //第一个next->下一个节点   
		    iend_order_stu      =inew_order_stu;   //让iend指向最后一个节点
    	    printf("信息输入完毕,是否继续?(是-Y  否-N):");
    	    scanf("\n%c",&ch);
	        if(ch=='N'||ch=='n')
	         break;
		}
    	return head_order_stu;
	}
}

void save_order_stu()
{
	int i=0;
	ORDER_STU *temp=head_order_stu;
	fp_order_stu=fopen("order_stu.txt","wt");
	while(temp!=NULL)
	{
    	fwrite(temp,sizeof(Node_order_stu),1,fp_order_stu);
     	temp=temp->next;		
	}					
	fclose(fp_order_stu);	
}







/***************************************************************************/


student.cpp


#include"head.h"


/*****************************student**********************************/


void student()
{
	read_file_order_stu();
	if(judge_stu())   
	{
		read_file();
		menu_stu();
	}
	else   return ;
}



int menu_stu()
{
	int chioce;
	do
	{
    	printf("\n\t\t*******************************\n");
     	printf("\t\t*        1.信息查看           *\n");			
     	printf("\t\t*        2.信息查询           *\n");
    	printf("\t\t*        3.信息排序           *\n");
    	printf("\t\t*        0.退出               *\n");
    	printf("\t\t*******************************\n");
    	printf("\t\t请选择:");
    	scanf("%d",&chioce);
        switch(chioce)
    	{  
        	case 1:
                pdisplay();
        		break;
         	case 2:
                pmenu_search();
    	        break;
        	case 3:
                psort_menu(); 
        		break;
        	default:
	        	break;
    	}
	}while(chioce!=0);
	return 0;
}





bool judge_stu()
{
	int x,i=0,j=0;
	ORDER_STU *temp=head_order_stu;
	char username1[100];
	char password1[100];
	char password2[100];
	
	printf("\n请输入用户名:");
	scanf("%s",username1);

	while(temp!=NULL)
	{
		if(!strcmp(temp->information.username,username1))
		{		
			printf("\n请输入密码:");
        	do
			{
				password1[i]=getch();
				if(password1[i]==13)
				{
					password1[i]='\0';
					break;
				}
				i++;
				printf("*");	
			}while(1);
			
			/*do{
				if(temp->information.password[j]=='\0') 
				{
					password2[j]='\0';
					break;
				}
				password2[j]=temp->information.password[j]-j;
				j++;
			}while(1);*/
			strcpy(password2,temp->information.password);
			if(!strcmp(MD5(password1),password2))
				return true;
			else
			{
	     			printf("\n密码错误!");
		      		return false;
			}
		
		}
		temp=temp->next;
		x++;
	}
	printf("不存在此用户名!");
	return false;
}


int read_file_order_stu()
{
	int i;
	int fno,fsize;
	if((fp_order_stu=fopen("order_stu.txt","rt"))==NULL) 
	{
		printf("\n库文件不存在!\n");
		return 0;
	}
	rewind(fp_order_stu);                            //使文件内部指针移动到文件的开始位置 
	fno=fileno(fp_order_stu);              //获取文件描述字                       
	fsize=filelength(fno);      //计算文件大小,以字节为单位 
	num_order_stu=fsize/sizeof(Node_order_stu);     //计算文件包含的学生信息数目 
	iend_order_stu=inew_order_stu=(ORDER_STU *)malloc(sizeof(ORDER_STU));//申请动态空间 
	fread(inew_order_stu,sizeof(Node_order_stu),1,fp_order_stu);   //以Node(结构体)的空间大小读数据 
	for(i=1;i<=num_order_stu;i++)   //利用for循环创建链表,并把数据储存到其中 
	{
	    if(i==1)          //第一个节点的创建 
		{
			inew_order_stu->next=head_order_stu;
			inew_order_stu->last=NULL; //双向链表 
		    iend_order_stu=inew_order_stu;
		    head_order_stu=inew_order_stu;
		}
	    else
		{
			inew_order_stu->next=NULL;
			inew_order_stu->last=iend_order_stu;
		    iend_order_stu->next=inew_order_stu;
		    iend_order_stu      =inew_order_stu;
		}
		inew_order_stu=(ORDER_STU *)malloc(sizeof(ORDER_STU));
		fread(inew_order_stu,sizeof(Node_order_stu),1,fp_order_stu);
	}
    free(inew_order_stu);//释放最后一个没有储存数据的节点 
    fclose(fp_order_stu);//关闭文件 
    return num_order_stu;
}






/****************************************************/


teacher.cpp

#include"head.h"



/************************teacher************************************/
void teacher()
{
	read_file_order_tea();
	if(judge_tea()) 
	{
		read_file();
		menu_tea();
	}
	else   return ;
}



int menu_tea()
{
	int chioce;
	do
	{
    	printf("\n\t\t*******************************\n");
    	printf("\t\t*        1.信息录入           *\n");
     	printf("\t\t*        2.信息查看           *\n");
    	printf("\t\t*        3.信息修改           *\n");			
     	printf("\t\t*        4.信息查询           *\n");
     	printf("\t\t*        5.信息删除           *\n");
    	printf("\t\t*        6.信息排序           *\n");
    	printf("\t\t*        0.退出               *\n");
    	printf("\t\t*******************************\n");
    	printf("\t\t请选择:");
    	scanf("%d",&chioce);
        switch(chioce)
    	{  
    	    case 1:
                pinput();
        		break;
        	case 2:
                pdisplay();
        		break;
        	case 3:
	        	change_pmenu_search();
        		break;
         	case 4:
                pmenu_search();
    	        break;
        	case 5:
                delete_pmenu_search();
        	   	break;
        	case 6:
                psort_menu(); 
        		break;
        	default:
	        	break;
    	}
	}while(chioce!=0);
	return 0;
}





bool judge_tea()
{
	int x,i=0,j=0;
	ORDER_TEA *temp=head_order_tea;
	char username1[100];
	char password1[100];
	char password2[100];
	
	printf("\n请输入用户名:");
	scanf("%s",username1);

	while(temp!=NULL)
	{
		if(!strcmp(temp->information.username,username1))
		{		
			printf("\n请输入密码:");
			do
			{
				password1[i]=getch();
				if(password1[i]==13)
				{
					password1[i]='\0';
					break;
				}
				i++;
				printf("*");
				
			}while(1);
			/*do{
				if(temp->information.password[j]=='\0') 
				{
					password2[j]='\0';
					break;
				}
				password2[j]=(temp->information.password[j])-j;
				j++;
			}while(1);*/
			strcpy(password2,temp->information.password);
			if(!strcmp(MD5(password1),password2))
				return true;
			else
			{
	     			printf("\n密码错误!");
		      		return false;
			}
		
		}
		temp=temp->next;
		x++;
	}
	printf("不存在此用户名!");
	return false;
}


int read_file_order_tea()
{
	int i;
	int fno,fsize;
	if((fp_order_tea=fopen("order_tea.txt","rt"))==NULL) 
	{
		printf("\n库文件不存在!\n");
		return 0;
	}
	rewind(fp_order_tea);                            //使文件内部指针移动到文件的开始位置 
	fno=fileno(fp_order_tea);              //获取文件描述字                       
	fsize=filelength(fno);      //计算文件大小,以字节为单位 
	num_order_tea=fsize/sizeof(Node_order_tea);     //计算文件包含的学生信息数目 
	iend_order_tea=inew_order_tea=(ORDER_TEA *)malloc(sizeof(ORDER_TEA));//申请动态空间 
	fread(inew_order_tea,sizeof(Node_order_tea),1,fp_order_tea);   //以Node(结构体)的空间大小读数据 
	for(i=1;i<=num_order_tea;i++)   //利用for循环创建链表,并把数据储存到其中 
	{
	    if(i==1)          //第一个节点的创建 
		{
			inew_order_tea->next=head_order_tea;
			inew_order_tea->last=NULL; //双向链表 
		    iend_order_tea=inew_order_tea;
		    head_order_tea=inew_order_tea;
		}
	    else
		{
			inew_order_tea->next=NULL;
			inew_order_tea->last=iend_order_tea;
		    iend_order_tea->next=inew_order_tea;
		    iend_order_tea      =inew_order_tea;
		}
		inew_order_tea=(ORDER_TEA *)malloc(sizeof(ORDER_TEA));
		fread(inew_order_tea,sizeof(Node_order_tea),1,fp_order_tea);
	}
    free(inew_order_tea);//释放最后一个没有储存数据的节点 
    fclose(fp_order_tea);//关闭文件 
    return num_order_tea;
}



MD5.cpp

/*************************************************************************
	> File Name: md5_1.cpp
	> Author:chudongfang 
	> Mail:[email protected] 
	> Created Time: 2016年06月22日 星期三 16时12分30秒
 ************************************************************************/
 #include"head.h"
//第一位1 其后若干个0,用于MD5Final函数时的补足

/************************
 * 函数功能:初始化一个MD5 text
 * 函数参数:MD5 text 指针
 * ***********************/
//初始化
void MD5Init(MD5_CTX *context)  
{  
    context->count[0] = 0;  
    context->count[1] = 0;   
    //分别赋固定值  
    context->state[0] = 0x67452301;
    context->state[1] = 0xEFCDAB89;  
    context->state[2] = 0x98BADCFE;  
    context->state[3] = 0x10325476;  
}  


/************************************************
 * 函数功能:对一个MD5 text,把输入的数据进行分组,并进行加密
 * 未用到的数据把其储存在MD5 text中。
 *
 * 参数分析:
 * MD5_CTX *context       :一个MD5 text   
 * unsigned char *input   :新添加的数据  
 * unsigned int inputlen  :新添加数据的长度(字节)
 *
 ***********************************************/

void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)  
{  
    unsigned int i = 0,index = 0,partlen = 0;  
    
    //index:当前状态的位数对64取余,其单位是字节
    //也可以写作:  index=(context->count[0]/8)%64
    index = (context->count[0] >> 3) & 0x3F;  
    
    //partlen:可以补齐64字节的字节数
    partlen = 64 - index;  
    
    //下面代码是解决一个unsignde int 无法储存极大数据导致溢出的问题
    //当前位数加上新添加的位数,由于inputlen是以字节为单位,所以其转换为位数
    //相当于context->count[0] += inputlen*8;  
    context->count[0] += inputlen << 3;  
   
    //当其出现溢出的情况时,通过以下操作把两个16位的数连在一块,生成一个
    //32位的二进制数串,从而扩大其储存范围
    if(context->count[0] < (inputlen << 3))  
        context->count[1]++;
    
    //该语句可替换为 context->count[1]+=(inputlen<<3)>>32;
    //便于理解
    context->count[1] += inputlen >> 29;  
    
    //当其输入字节数的大于其可以补足64字节的字节数,进行补足
    if(inputlen >= partlen)  
    {  
        //向buffer中补足partlen个字节,使其到达64字节
        memcpy(&context->buffer[index],input,partlen);
        
        //buffer达到64字节512位,则把其作为一组进行运算
        MD5Transform(context->state,context->buffer);  
        
        //如果输入的数据还可以组成多个64字节,则把其可以组成
        //的作为若干组进行运算
        for(i = partlen;i+64 <= inputlen;i+=64)  

以上是关于自写信息管理系统——C实现的主要内容,如果未能解决你的问题,请参考以下文章

转:VisualSVN Server提交前必须写信息(备注)

C#VS快捷键

C#VS快捷键

C#VS快捷键

C#VS快捷键

用python编写的一个学生成绩管理系统