xuanke.h

来自「这是一个利用数据结构开发的学生选棵系统,是基于数据结构!」· C头文件 代码 · 共 607 行

H
607
字号
#include "xuanke.hpp"

//***********************************************************************************************
//***************************************构树部分************************************************
//---------------------------------------构造结点------------------------------------------------
status CreatNode(jiedian1 &s1)
{
	int i;
	for(i=0;i<jiluzongshu;i++)
	{
		Q=(CSTree)malloc(sizeof(CSNode));
		Q->data=records[i];
//		printf("先修课号:%-10d",records[i].xianhao);
		printf("%10d",Q->data.xianhao);
		Q->firstchild=NULL;
		Q->nextsibling=NULL;
		s1[i]=Q;
//		printf("%10d",s1[i]->data.xianhao);
	}
	printf("\n");
	return OK;
}


//-----------------------------------------构造树------------------------------------------------
status CreatTree(jiedian2 &s2,jiedian1 s1)
{
	printf("进入\n");
	int i,flag,j,m,n;
	j=1;
	flag=n=0;
	for(i=0;i<jiluzongshu;i++)
	{
		if(s1[i]->data.xianhao==0&&flag!=1)
		{
			s2[j]=s1[i];
			printf("序号%d  先修课号 %10d   %d\n",j,s2[j]->data.xianhao,s2[j]->data.kehao);
			j++;
			flag=1;
		}
	}
	printf("根结点\n");
/*		else if(records[i].xianhao==0&&flag>=1)
		{
			jiedian2[j-1].nextsibling=jiedian2[j];
			j++;
		}
*/
	int a[MAXSIZE];
	for(m=0;m<=jiluzongshu;m++)
	{
		a[m]=-1;
	}
	a[0]=0;
	a[1]=1;
	m=0;
	j--;
A:	flag=0;
	for(i=0;i<jiluzongshu;i++)
	{
		if(s1[i]->data.xianhao==s2[j]->data.kehao&&flag==0)
		{
			a[i]=i;
			j++;
			s2[j]=s1[i];
			s2[j-1]->firstchild=s2[j];		
			flag=1;
			j--;
		}
		else if(s1[i]->data.xianhao==s2[j]->data.kehao&&flag==1)
		{
			a[i]=i;
			j++;
			j++;
			s2[j]=s1[i];
			s2[j-1]->nextsibling=s2[j];
			flag=2;
			j--;
			j--;
		}
		else if(s1[i]->data.xianhao==s2[j]->data.kehao&&flag==2)
		{
			a[i]=i;
			j++;
			j++;
			j++;
			s2[j]=s1[i];
			s2[j-1]->nextsibling=s2[j];			
			flag=3;
			j--;
			j--;
			j--;
		}
	}
//	printf("循环\n");
	for(i=0;i<jiluzongshu;i++)
	{
		if(a[i]==-1)
			n++;						//n为没有创建成树接点的个数
	}
	if(s2[j]->firstchild!=NULL||s2[j]->nextsibling!=NULL)							//j为以创建成树接点的个数
	{
		j++;
		n=0;
		goto A;
	}
	n=1;
	for(i=0;i<jiluzongshu;i++)
	{
		if(a[i]==-1)
		{
			j++;
			s2[j]=s1[i];
			s2[n]->nextsibling=s2[j];
			a[i]=i;
			j++;
			n++;
		}
	}
	printf("退出\n");
	return OK;

	
}
//--------------------------------------先序遍历树-----------------------------------------------
status PreOderTraver(CSTree r,status(* Visit)(jishiben e))
{  
	if(!r) return OK;
	if(r)
    {
		if(Visit(r->data))
			if(PreOderTraver(r->firstchild,Visit))
				if(PreOderTraver(r->nextsibling,Visit))
					return OK;
		return ERROR;
	}else 
		return OK;
   
}
//--------------------------------------------中序遍历-------------------------------------------
status InOderTraver(CSTree r,status(* Visit)(jishiben e))
{
	if(r)
    {
		if(InOderTraver(r->firstchild,Visit))
			if(Visit(r->data))			
				if(InOderTraver(r->nextsibling,Visit))
					return OK;
		return ERROR;
	}
	else
		return OK;

}


//--------------------------------------------后序遍历------------------------------------------
status LaOderTraver(CSTree r,status(* Visit)(jishiben e))
{
	if(r)
    {		
		if(LaOderTraver(r->firstchild,Visit))
				if(LaOderTraver(r->nextsibling,Visit))
					if(Visit(r->data))
					return OK;
		return ERROR;
	}else
		return OK;
	

}
status Visit(jishiben e)
{
	printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	printf("课程名称:%-15s课程编号:%-10d先修课号:%-10d学分:%-10d\n",e.kechengmingcheng,
	    	e.kehao,e.xianhao,e.xuefeng);
	printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	return OK;
}




//***************************************构树部分************************************************
//***********************************************************************************************




//***********************************************************************************************
//***************************************文件部分************************************************



//--------------------------------------新建分类信息--------------------------------------//
void jiluzengjia(void)
{
	char str[5];
	if(jiluzongshu!=0)
	{
		if(savesign==1)
		{
				printf("现在有记录存在\n");
		        printf("是否保存原来的记录?(Y/n)");
		gets(str);
		if(str[0]!='n'&&str[0]!='N')
			cunchujilu();
		}
	}

jiluzongshu=0;
addRecord();
}

//----------------------------------显示所有的分类记录---------------------------------

void jiluducu(void)
{
	int i;
	if(jiluzongshu==0)
	{
	printf("没有可供显示的记录!\n");
	return ;
	}

for(i=0;i<jiluzongshu;i++)
{
	//打印记事本信息
	printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	printf("课程名称:%-15s课程编号:%-10d先修课号:%-10d学分:%-10d\n",records[i].kechengmingcheng,
			records[i].kehao,records[i].xianhao,records[i].xuefeng);
	printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	
/*	//找到5条记录停下来
if(i%5==0&&i!=0)
{
	printf("找到五条记录(输入任一字符后继续...)\n",jiluzongshu);
	getch();
	printf("\n\n");
	
}
*/
}
printf("一共找到%d记录\n",jiluzongshu);
//printf("\007");
}

//-----------------------------------在当前表的末尾增加新的记录--------------------------

void addRecord(void)
{ 
	char str[10];

	
	if(jiluzongshu==0)
		printf("原来没有记录,现在建立新的记录\n");
	else 
		printf("下面在当前表的末尾增加新的信息\n");
	while(1)
	{
		printf("你将添加一组记录,确定吗?(Y/n)");
//		gets(str);
		scanf("%s",&str);
		if(str[0]=='n'||str[0]=='N')//不添加新的记录
			break;
		else
		{
			if(jiluzongshu>=arraySize)//数组空间不足,需申请新的空间
			{		
			records=(jishiben*)realloc(records,(arraySize+ZENGJIA_SIZE) *sizeof(jishiben));
			if(records==NULL)
			{
				printf("存储失败!");
				exit(-1);
			}
			arraySize=arraySize+ZENGJIA_SIZE;
			}
		xin();
		printf("请输入课程编号:");
		scanf("%d",&records[jiluzongshu].kehao);
		printf("请输入先修课号:");
		scanf("%d",&records[jiluzongshu].xianhao);
		printf("请输入学分:");
		scanf("%d",&records[jiluzongshu].xuefeng);
		jiluzongshu++;
		}
	}
	printf("现在一共有%d条信息\n",jiluzongshu);
	savesign=1;
}




//---------------------------------------文件存储操作函数------------------------------
int cunchujilu()
{
	FILE *fp;
	char fname[30];
	if(jiluzongshu==0)
	{
	printf("没有记录可存!");
		return -1;
	}
	printf("请输入要存入的文件名(直接按回车选择文件xuankexitong.txt):");
	gets(fname);
	if(strlen(fname)==0)
		strcpy(fname,"xuankexitong.txt");

	if((fp=fopen(fname,"wb"))==NULL)
	{
		printf("不能存入文件!\n");
		return -1;
	} 
	printf("\n存文件...\n");
//	printf("\007");
	fwrite(records,sizeof(jishiben)*jiluzongshu,1,fp);
	fclose(fp);
	printf("已经有%d条记录存入文件,请继续操作.\n",jiluzongshu);
		savesign=0;//更新是否以保存的标记
       return 0;
}
//--------------------------------------文件读操作------------------------------------//

int loadRecords(void)
{
	FILE *fp;
	char fname[30];
	char str[5];
	if(jiluzongshu!=0&&savesign==0)

	{
	
		printf("请选择您是要覆盖现有的记录(Y),	还是要将");	
		printf("读取的记录添加到现有的记录之后(n)?\n");	
		printf("直接回车则覆盖现有的记录\n");
		gets(str);	
		if(str[0]=='n'||str[0]=='N')	
		{
			//将读取的记录添加到现有的记录之后
		savesign=1;	
		}
	else
	{
		if(savesign==1)
		{//覆盖现有记录
			printf("读取文件将会更改原来的记录,");
			printf("是否保存原来的记录?(Y/n)");
			gets(str);
			if(str[0]!='n' && str[0]!='N')
				cunchujilu();
		}
		jiluzongshu=0;
	}
	}
	printf("请输入要读取的文件名(直接按回车键选择文件xuankexitong.txt):");
	gets(fname);
	if(strlen(fname)==0)
		strcpy(fname,"xuankexitong");
	if((fp=fopen(fname,"rb"))==NULL)
	{
		printf("打不开文件!请重新选择\n");
		return -1;
	}
printf("\n取文件````\n");
//printf("\007");
while(!feof(fp))
{
	//现在的数组空间不足,需要重新申请空间
	if(jiluzongshu>=arraySize)
	{
		records=(jishiben*)realloc(records,(arraySize+ZENGJIA_SIZE) *sizeof(jishiben));
		if(records==NULL)
		{
			printf("储存错误!");
			exit(-1);
		}
		arraySize=arraySize+ZENGJIA_SIZE;
	}
	if(fread(&records[jiluzongshu],sizeof(jishiben),1,fp)!=1) break;
	jiluzongshu++;
}

fclose(fp);
printf("现在共有%d条记录。",jiluzongshu);
return 0;
}





//-----------------------------------------自定分类记事本-----------------------------------------
void zidiyi(void)
{
	char s[2],str[2];
	int cn;
	int i;
	printf("请选择自定义的方式:\n");
	printf("\t\t1.增加新的分类记事本的名称\n\t\t2.更改原有分类记事本的名称\n");
	printf("请选择:");
	gets(str);
	cn=atoi(str);

	if(cn==2)
		{
	printf("请选择要更改的课程名称:\n");
	for(i=0;i<n;i++)
	{
		
		if(i%3==0&&i!=0){printf("\n");}
		printf("\t%3d%-20s",(i+1),array[i]);
	}
	printf("\n");
	printf("请选择:");
	gets(s);
	cn=atoi(s);
	printf("请输入自定义的分类记事本的名称:\n");
	gets(array[cn-1]);
	strcpy(records[jiluzongshu].kechengmingcheng,array[cn-1]);
	printf("修改成功!\n");
	return;
		}
	if(cn==1)
		{
			   printf("请输入分类记事本的名称:");
				gets(records[jiluzongshu].kechengmingcheng);
				strcpy(array[n],records[jiluzongshu].kechengmingcheng);
				n++;
				printf("自定义成功!\n");
		}
	
} 


int xuanzefenleimingchen(void)
{
	char s[2];
	int cn=0;
	int i;
	printf("请选择课程名称:\n");
	for(i=0;i<n;i++)
	{
		//if(i%5==0&&i!=0)
		if(i%3==0&&i!=0){printf("\n");}
		printf("\t%3d%-20s",(i+1),array[i]);
	}
	printf("\n\t  (其它按键自定义)\n");
    
	{
//		gets(s);
		scanf("%s",&s);
		cn=atoi(s);
		if(cn<1||cn>n)  cn=0;
	}
	return cn;
}



void xin(void)
{
	int i=jiluzongshu;

	{
		switch(xuanzefenleimingchen())
		{
			case 0:
				printf("请输入所选课程的名称:");
				scanf("%s",&records[i].kechengmingcheng);
			//	gets(records[i].kechengmingcheng);
				strcpy(array[n],records[i].kechengmingcheng);
				n++;
				
				break;
			case 1:
				strcpy(records[i].kechengmingcheng,array[0]);
				break;
		    case 2:
				strcpy(records[i].kechengmingcheng,array[1]);
				break;
		    case 3:
				strcpy(records[i].kechengmingcheng,array[2]);
				break;
			case 4:
				strcpy(records[i].kechengmingcheng,array[3]);
				break;
			case 5:
				strcpy(records[i].kechengmingcheng,array[4]);
				break;
			case 6:
				strcpy(records[i].kechengmingcheng,array[5]);
				break;
			if(n>6){
            case 7:
				strcpy(records[i].kechengmingcheng,array[6]);
				break;
			if(n>7){
            case 8:
				strcpy(records[i].kechengmingcheng,array[7]);
				break;
			if(n>6){
            case 9:
				strcpy(records[i].kechengmingcheng,array[8]);
				break;}}
			}
		}
	}
}
//***************************************文件部分************************************************
//***********************************************************************************************

//***********************************************************************************************
//***************************************公共部分************************************************
//-------------------------------------菜单选择函数----------------------------------------------
int xuanze_caidan(void)
{
	char s[2];
	int cn=0;
	printf("\n");
	
	printf("********************************************************************************\n");
	printf("\t\t      功能选择:1记录读取\n");
    printf("\t\t\t        2记录增加\n");
    printf("\t\t\t        3保存记录到文件中\n");
	printf("\t\t\t        4从文件中读取记录\n");
	printf("\t\t\t        5构建树\n");
	printf("\t\t\t        6先序遍历树\n");
	printf("\t\t\t        7中序遍历树\n");
	printf("\t\t\t        8后序遍历树\n");
	printf("\t\t\t        9退出系统\n");
   	printf("********************************************************************************\n");
	printf("请选择功能序号:(1,2,3,4,5,6,7,8,9)");

    for( ;  ;  )
	{
	gets(s);
	cn=atoi(s);
	if(cn<1||cn>10) printf("\n输入错误,请重选1-9:");
	else break;
	}
	return cn;
}

//---------------------------------------菜单处理函数---------------------------------------//
void chuli_caidan(void)
{
	for(;;){
		switch(xuanze_caidan())
		{
		    case 1:
				jiluducu();
				break;
		    case 2:
				addRecord();
				break;
			case 3:
				cunchujilu();
				break;
			case 4:
				loadRecords();
				break;
			case 5:
				CreatNode(s1);
				CreatTree(s2,s1);
				printf("创建成功!\n");
				break;
			case 6:
				printf("开始遍历\n");
				r=s2[1];
				PreOderTraver(r,Visit);
				break;
			case 7:
				printf("开始遍历\n");
				r=s2[1];
				InOderTraver(r,Visit);
				break;
			case 8:
				printf("开始遍历\n");
				r=s2[1];
				LaOderTraver(r,Visit);
				break;
			case 9:
				tuichu();

		}
	}
}
//---------------------------------------结束运行,退出程序----------------------------------------

void tuichu(void)
{
	char str[5];
	if(savesign==1)
	{
		printf("是否保存原来的记录?(Y/n)");
		gets(str);
		if(str[0]!='n'&&str[0]!='N')
			cunchujilu();
	}
	free(records);
	printf("欢迎继续使用,再见!");
	exit(0);
}
//***************************************公共部分************************************************
//***********************************************************************************************

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?