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 + -
显示快捷键?