求数据结构C++舞伴配对问题程序代码

求数据结构C++舞伴配对问题程序代码,第1张

int main()

{

list<dancer>Mdancer;  //定义dancer类链表,保存男舞者信息

    list<dancer>Fdancer;  //定义dancer类链表,保存女舞者信息

while(m)//输入舞者信息

{

dancer person; //定义临时dancer变量,保存输入信息

personinput(); 

if(personsex!="男"&&personsex!="女")  //判断输入性别是否符合要求

{

cout<<"输入的舞者性别不正确,请重新输入";

continue;

}

else if(personhour<0||personhour>23||personminute<0||personminute>59||personsecond<0||personsecond>59)

{

cout<<"输入的舞者到场时间不正确,请重新输入";

continue;

}

else

{

if(personsex=="男")

Mdancerpush_back(person); //将男舞者信息存入男性链表

else

Fdancerpush_back(person); //将女舞者信息存入女性链表

}

cout<<"\n是否继续录入舞者信息:1为继续录入,0为不再录入!\n";

cin>>m;

}

cout<<"首先为男性舞者排队!\n";

pai_dui(Mdancer);  //对男舞者进行排队

cout<<"然后为女性舞者排队!\n";

    pai_dui(Fdancer);  //对女舞者进行排队

    /cout<<"\n排队后:"<<endl;  //输出排队后所有男舞者信息

for(p=Mdancerbegin();p!=Mdancerend();p++)

cout<<(p)name<<" "<<(p)sex<<" "<<(p)height<<" "<<(p)hour

    <<":"<<(p)minute<<":"<<(p)second<<endl;/

cout<<"请输入跳舞的最大轮数:";

    int k = 0; //跳舞轮数

cin>>k;

for(int i=0; i<k; i++)/舞伴配对/

{

int num1 = Mdancersize();  //男舞者个数

int num2 = Fdancersize();  //女舞者个数

int min = num1<num2  num1:num2;

cout<<"第"<<i+1<<"轮舞伴配对情况:\n";

if(min<=N)  //舞者对数小于等于舞场容纳量,则全部舞者可进入

{

for(int i=0; i<min; i++)  //输出第k轮的舞伴

{

cout<<Mdancerfront()name<<"<-->"<<Fdancerfront()name<<endl;

    Mdancerpush_back(Mdancerfront());  //将配对的舞者重新排在队尾

    Fdancerpush_back(Fdancerfront());

    Mdancerpop_front();  //将配对的舞者从队首删除

    Fdancerpop_front();

}

}

else  //舞者对数大于舞场容纳量

{

for(int i=0; i<N; i++)  //输出第k轮的舞伴

{

cout<<Mdancerfront()name<<"<-->"<<Fdancerfront()name<<endl;

Mdancerpush_back(Mdancerfront());  //将配对的舞者重新排在队尾

Fdancerpush_back(Fdancerfront());

Mdancerpop_front();  //将配对的舞者从队首删除

Fdancerpop_front();

}

}

/每跳完一轮询问是否有舞者要离开/

cout<<"\n是否有舞者要离开,有舞者离开请输入1,否则输入0!\n";

int lev = 0;  //有舞者离开的标志,1为有舞者要离开

cin>>lev;

    /跳完舞的人默认排到了队伍中,若选择离开(还没跳舞的人也可以选择离开)/

if(lev==1)

{

cout<<"请输入要离开的舞者姓名:";

    cin>>leavername;

    cout<<"请输入要离开的舞者性别:";

    cin>>leaversex;

    if(leaversex=="男")

    Mdancerremove_if(leave);  //根据姓名从队列中删除舞者

    else if(leaversex=="女")

    Fdancerremove_if(leave);

cout<<leavername<<"已离开舞场!\n\n";

}

}

return 0;

}

完整文件在附件,你看下是否符合要求,有问题再问!

#define Infinity 1000

#define MaxVertexNum 35

#define MAX 40

#include<stdioh>

#include<stdlibh>

#include<conioh>

#include<stringh>

#include<iostreamh>

typedef struct arcell //边的权值信息

{

int adj; //权值

}arcell,adjmatrix[MaxVertexNum][MaxVertexNum]; //图的邻接矩阵类型

typedef struct vexsinfo //顶点信息

{

int position; //景点的编号

char name[32]; //景点的名称

char introduction[256]; //景点的介绍

}vexsinfo;

typedef struct mgraph //图结构信息

{

vexsinfo vexs[MaxVertexNum]; //顶点向量(数组)

adjmatrix arcs; //邻接矩阵

int vexnum,arcnum; //分别指定顶点数和边数

}mgraph;

//全局变量

int visited[35]; //用于标志是否已经访问过

int d[35]; //用于存放权值或存储路径顶点编号

mgraph campus; //图变量(大学校园)

// (1) 对图初始化

mgraph initgraph()

{

int i=0,j=0;

mgraph c;

cvexnum =28; //顶点个数

carcnum =39; //边的个数

for(i=0;i<cvexnum ;i++) //依次设置顶点编号

cvexs[i]position =i;

//依次输入顶点信息

strcpy(cvexs[0]name ,"小西南门");

strcpy(cvexs[0]introduction ,"离公交站近");

strcpy(cvexs[1]name ,"学校南正门");

strcpy(cvexs[1]introduction ,"学校大门、学校班车进出口");

strcpy(cvexs[2]name ,"语言文化职业学院");

strcpy(cvexs[2]introduction ,"语言文化职业学院办公楼,楼高6层");

strcpy(cvexs[3]name ,"艺术学院");

strcpy(cvexs[3]introduction ,"音乐系、美术系,楼高4层");

strcpy(cvexs[4]name ,"行政楼");

strcpy(cvexs[4]introduction ,"行政办公大楼,楼高5层");

strcpy(cvexs[5]name,"文学院");

strcpy(cvexs[5]introduction ,"文学院,楼高6层");

strcpy(cvexs[6]name ,"体育场");

strcpy(cvexs[6]introduction ,"室外标准田径场");

strcpy(cvexs[7]name,"教育科学学院");

strcpy(cvexs[7]introduction ,"教心系、经管系,楼高5层");

strcpy(cvexs[8]name ,"南区学生宿舍");

strcpy(cvexs[8]introduction ,"离西南门近");

strcpy(cvexs[9]name, "数学与经济管理学院");

strcpy(cvexs[9]introduction , "数学与经济管理学院大楼,楼高4层");

strcpy(cvexs[10]name ,"中区学生宿舍");

strcpy(cvexs[10]introduction ,"若干栋,离学生1、2食堂近");

strcpy(cvexs[11]name ,"职业学院教学大楼");

strcpy(cvexs[11]introduction ,"职业学院教学大楼,楼高5层");

strcpy(cvexs[12]name ,"体育系");

strcpy(cvexs[12]introduction ,"体育系,楼高5层");

strcpy(cvexs[13]name ,"游泳馆");

strcpy(cvexs[13]introduction ,"室内小型游泳馆");

strcpy(cvexs[14]name ,"报告厅、阶梯教室");

strcpy(cvexs[14]introduction ,"可举办中、大型学术会议。有大小报告厅1-6个、阶梯教室1-6个");

strcpy(cvexs[15]name ,"大礼堂、体育馆");

strcpy(cvexs[15]introduction ,"文艺演出所在地、室内运动场");

strcpy(cvexs[16]name ,"1食堂");

strcpy(cvexs[16]introduction ,"教工食堂及学生1食堂在此");

strcpy(cvexs[17]name ,"新图书馆");

strcpy(cvexs[17]introduction ,"建筑面积46000平方米");

strcpy(cvexs[18]name ,"2食堂");

strcpy(cvexs[18]introduction ,"学校东区,学生食堂");

strcpy(cvexs[19]name ,"东区学生宿舍");

strcpy(cvexs[19]introduction ,"离学生2食堂近");

strcpy(cvexs[20]name ,"计算机学院");

strcpy(cvexs[20]introduction ,"计算机学院大楼,楼高5层");

strcpy(cvexs[21]name ,"教工宿舍");

strcpy(cvexs[21]introduction ,"学校青年教职工租住地");

strcpy(cvexs[22]name ,"西区学生宿舍");

strcpy(cvexs[22]introduction ,"离学生3、4食堂近");

strcpy(cvexs[23]name ,"3食堂");

strcpy(cvexs[23]introduction ,"学校西区,学生食堂");

strcpy(cvexs[24]name ,"外国语学院");

strcpy(cvexs[24]introduction ,"外国语学院大楼,楼高5层");

strcpy(cvexs[25]name ,"4食堂");

strcpy(cvexs[25]introduction ,"学校西区,学生食堂,人气较高");

strcpy(cvexs[26]name ,"校医院");

strcpy(cvexs[26]introduction ,"看小病的地方");

strcpy(cvexs[27]name ,"实验楼");

strcpy(cvexs[27]introduction ,"物电学院、化学与生命科学学院、机电系、建材系所在地,机房及多媒体教室若干");

//依次输入边上的权值信息

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

for(j=0;j<cvexnum ;j++)

carcs [i][j]adj =Infinity; //先初始化图的邻接矩阵

//部分弧长

carcs[0][2]adj=50; carcs[0][3]adj=60;

carcs[1][4]adj=90;

carcs[2][3]adj=60; carcs[2][8]adj=40;

carcs[3][4]adj=60; carcs[3][6]adj=40;

carcs[4][5]adj=70; carcs[4][9]adj=70; carcs[4][10]adj=80; carcs[4][17]adj=200;

carcs[5][7]adj=70;

carcs[6][9]adj=40;

carcs[7][18]adj=190;

carcs[8][11]adj=50;

carcs[9][12]adj=40;

carcs[10][18]adj=70;

carcs[11][12]adj=60; carcs[11][14]adj=50; carcs[11][15]adj=50;

carcs[12][16]adj=50;

carcs[13][14]adj=40; carcs[13][22]adj=60;

carcs[14][15]adj=50; carcs[14][20]adj=90;

carcs[15][16]adj=60; carcs[15][21]adj=40;

carcs[16][17]adj=60;

carcs[17][18]adj=80;

carcs[18][19]adj=60;

carcs[20][21]adj=60; carcs[20][24]adj=80;

carcs[22][23]adj=60; carcs[22][25]adj=80;

carcs[23][24]adj=60;

carcs[24][26]adj=100; carcs[24][27]adj=100;

carcs[25][26]adj=90;

carcs[26][27]adj=90;

for(i=0;i<cvexnum ;i++) //邻接矩阵是对称矩阵,对称赋值

for(j=0;j<cvexnum ;j++)

carcs[j][i]adj =carcs[i][j]adj ;

return c;

}//initgraph

// (2) 查找景点在图中的序号

int locatevex(mgraph c,int v)

{

int i;

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

if(v==cvexs[i]position)

return i; //找到,返回顶点序号i

return -1; //否则,返回-1

}

//(3) 、(4) 求两景点间的所有路径

// (3) 打印序号为m,n景点间的长度不超过8个景点的路径

void path(mgraph c, int m,int n,int k)

{

int s,x=0;

int t=k+1; //t 记载路径上下一个中间顶点在d[]数组中的下标

if(d[k]==n && k<8) //d[k]存储路径顶点。若d[k]是终点n且景点个数<=8,则输出该路径

{ //递归出口,找到一条路径

for(s=0;s<k;s++)

printf("%s--->",cvexs[d[s]]name); //输出该路径。s=0 时为起点m

printf("%s",cvexs[d[s]]name); //输出最后一个景点名(即顶点n的名字,此时s==k)

printf("\n\n");

}

else

{

s=0;

while(s<cvexnum) //从第m个顶点,试探至所有顶点是否有路径

{

if((carcs[d[k]][s]adj<Infinity) && (visited[s]==0)) //初态:顶点m到顶点s有边,且未被访问

{

visited[s]=1;

d[k+1]=s; //存储顶点编号s 至d[k+1]中

path(c,m,n,t); //求从下标为t=k+1的第d[t]个顶点开始的路径(递归调用),同时打印出一条m至n的路径

visited[s]=0; //将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径

}

s++; //试探从下一个顶点 s 开始是否有到终点的路径

}//endwhile

}//endelse

}//endpath

//(4) 打印两景点间的景点个数不超过8的所有路径。调用(3)

int allpath(mgraph c)

{

int k,i,j,m,n;

printf("\n\n请输入你要查询的两个景点编号:\n\n");

scanf("%d%d",&i,&j);

printf("\n\n");

m=locatevex(c,i); //调用(2),确定该顶点是否存在。若存在,返回该顶点编号

n=locatevex(c,j);

d[0]=m; //存储路径起点m (int d[]数组是全局变量)

for(k=0;k<cvexnum;k++) //全部顶点访问标志初值设为0

visited[k]=0;

visited[m]=1; //第m个顶点访问标志设置为1

path(c,m,n,0); //调用(3)。k=0,对应起点d[0]==m。k为d[]数组下标

return 1;

}

// (5) 用迪杰斯特拉算法,求出一个景点到其他景点间的最短路径,并打印

void shortestpath_dij(mgraph c)

{

//迪杰斯特拉算法,求从顶点v0到其余顶点的最短路经及其带权长度d[v]

//若p[v][w]为1,则w是从v0到v的最短路经上的顶点

//final[v]类型用于设置访问标志

int v,w,i,min,t=0,x,flag=1,v0; //vo为起始景点的编号

int final[35],d[35],p[35][35];

printf("\n请输入一个起始景点的编号:");

scanf("%d",&v0);

printf("\n\n");

while(v0<0||v0>cvexnum)

{

printf("\n你所输入的景点编号不存在\n");

printf("请重新输入:");

scanf("%d",&v0);

}//while

for(v=0;v<cvexnum ;v++)

{

final[v]=0; //初始化各顶点访问标志

d[v]=carcs[v0][v]adj; //v0 到各顶点 v 的权值赋值给d[v]

for(w=0;w<cvexnum ;w++) //初始化p[][]数组,各顶点间的路径全部设置为空路径0

p[v][w]=0;

if(d[v]<Infinity) //v0 到v 有边相连,修改p[v][v0]的值为1

{

p[v][v0]=1;

p[v][v]=1; //各顶点自己到自己要连通

}

}//for

d[v0]=0; //自己到自己的权值设为0

final[v0]=1; //v0的访问标志设为1,v 属于 s 集

for(i=1;i<cvexnum ;i++) //对其余cvexnum-1个顶点w,依次求 v 到 w 的最短路径

{

min=Infinity;

for(w=0;w<cvexnum ;w++) //在未被访问的顶点中,查找与 v0 最近的顶点v

if(!final[w])

if(d[w]<min) //v0 到 w (有边)的权值<min

{

v=w;

min=d[w];

}//if

final[v]=1; //v 的访问标志设置为1,v 属于s集

for(w=0;w<cvexnum ;w++) //修改v0 到其余各顶点w 的最短路径权值d[w]

if(!final[w]&&(min+carcs[v][w]adj <d[w])) //若w 不属于s,且v 到w 有边相连

{

d[w]=min+carcs[v][w]adj; //修改v0 到w 的权值d[w]

for(x=0;x<cvexnum ;x++) //所有v0 到v 的最短路径上的顶点x,都是v0 到w 的最短路径上的顶点

p[w][x]=p[v][x];

p[w][w]=1;

}//if

}//for

for(v=0;v<cvexnum ;v++) //输出v0 到其它顶点v 的最短路径

{

if(v!=v0)

printf("%s",cvexs[v0]name); //输出景点v0 的景点名

for(w=0;w<cvexnum ;w++) //对图中每个顶点w,试探w 是否是v0 到v 的最短路径上的顶点

{

if(p[v][w] && w!=v0 && w!=v) //若w 是且w 不等于v0,则输出该景点

printf("--->%s",cvexs[w]name);

}

printf("---->%s",cvexs[v]name);

printf("\n总路线长为%d米\n\n",d[v]);

}//for

}//shortestpath

//(6)-(11)修改图的信息。包括建图、更新信息、删除、增加结点和边

//(6) 构造图的邻接矩阵

int creatgragh(mgraph &c) //建图。以图的邻接矩阵存储图

{

int i,j,m,n;

int v0,v1;

int distance;

printf("请输入图的顶点数和边数: \n");

scanf("%d %d",&cvexnum ,&carcnum );

printf("下面请输入景点的信息:\n");

for(i=0;i<cvexnum ;i++) //构造顶点向量(数组)

{

printf("请输入景点的编号:");

scanf("%d",cvexs[i]position );

printf("\n请输入景点的名称:");

scanf("%s",cvexs[i]name );

printf("\n请输入景点的简介:");

scanf("%s",cvexs[i]introduction );

}

for(i=0;i<carcnum ;i++) //初始化邻接矩阵

for(j=0;j<carcnum ;j++)

carcs[i][j]adj =Infinity;

printf("下面请输入图的边的信息:\n");

for(i=1;i<=carcnum ;i++) //构造邻接矩阵

{

printf("\n第%d条边的起点 终点 长度为:",i);//输入一条边的起点、终点及权值

scanf("%d %d %d",&v0,&v1,&distance);

m=locatevex(c,v0);

n=locatevex(c,v1);

if(m>=0 && n>=0)

{

carcs[m][n]adj =distance;

carcs[n][m]adj =carcs[m][n]adj ;

}

}

return 1;

}//creatgragh

// (7) 更新图的部分信息。返回值: 1

int newgraph(mgraph &c)

{

int changenum; //计数。用于记录要修改的对象的个数

int i,m,n,t,distance,v0,v1;

printf("\n下面请输入你要修改的景点的个数:\n");

scanf("%d",&changenum);

while(changenum<0||changenum>cvexnum )

{

printf("\n输入错误!请重新输入");

scanf("%d",&changenum);

}

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

{

printf("\n请输入景点的编号:");

scanf("%d",&m);

t=locatevex(c,m);

printf("\n请输入景点的名称:");

scanf("%s",cvexs[t]name );

printf("\n请输入景点的简介:");

scanf("%s",cvexs[t]introduction );

}

printf("\n下面请输入你要更新的边数");

scanf("%d",&changenum);

while(changenum<0||changenum>carcnum )

{

printf("\n输入错误!请重新输入");

scanf("%d",&changenum);

}

printf("\n下面请输入更新边的信息:\n");

for(i=1;i<=changenum ;i++)

{

printf("\n修改的第%d条边的起点 终点 长度为:",i);

scanf("%d %d %d",&v0,&v1,&distance);

m=locatevex(c,v0);

n=locatevex(c,v1);

if(m>=0&&n>=0)

{

carcs[m][n]adj =distance;

carcs[n][m]adj =carcs[m][n]adj ;

}

}

return 1;

}//newgraph

楼主跟我的C语言程序设计课程要求设计的程序很像,有一点点不同,不过我的程序应该能满足你的要求,代码如下:

#include <stdioh>

#include <conioh>

#include <stringh>

#define N 10

struct student{

char name[20];

int cla;

int point1;

int point2;

int point3;

int sum;

int num;

};

void printf_student(struct student stu[]);

void in_student(struct student stu[]);

void look_student(struct student stu[]);

void main(){

student stu[N];

int choice1;

while(choice1!=5){

printf("请选择您要 *** 作的项目:\n");

printf("1读取数据\n2录入数据\n3分析数据\n4保存数据\n5退出\n");

scanf("%d",&choice1);

switch(choice1){

case 1:

printf_student(stu);

break;

case 2:

in_student(stu);

break;

case 3:

look_student(stu);

break;

}}

}

void printf_student(struct student stu[]){

FILE fout;

int i=0;

int j=0;

fout=fopen("stu1txt","r");

if(fout==NULL){printf("找不到文件");}

else{

while(!feof(fout)){

fscanf(fout,"%s %d %d %d %d",stu[i]name,&stu[i]cla,&stu[i]point1,&stu[i]point2,&stu[i]point3);

i++;

}

printf("已经读取");

printf("\n姓名\t\t班级\t\t成绩1\t\t成绩2\t\t成绩3\n");

for(j=0;j<i;j++){

printf("%s\t\t",stu[j]name);

printf("%d\t\t",stu[j]cla);

printf("%d\t\t",stu[j]point1);

printf("%d\t\t",stu[j]point2);

printf("%d\t\t",stu[j]point3);}

}

fclose(fout);

}

void in_student(struct student stu[]){

FILE fp;

student flag;

char ch[50]={0};

fp=fopen("stu1txt","a+");

int choice=1;

if(fp==0){printf("无法打开文件\n");}

else{

while(choice){

printf("请依次输入姓名,班级,成绩1,成绩2,成绩3\n");

scanf("%s %d %d %d %d",flagname,&flagcla,&flagpoint1,&flagpoint2,&flagpoint3);

sprintf(ch,"%s\t%d\t%d\t%d\t%d",flagname,flagcla,flagpoint1,flagpoint2,flagpoint3);

/fwrite(flagname,20,1,fp);

fwrite("\t",2,sizeof("\t"),fp);

fwrite(&flagcla,sizeof(flagcla),1,fp);

fwrite("\t",sizeof("\t"),1,fp);

fwrite(&flagpoint1,sizeof(flagpoint1),1,fp);

fwrite("\t",2,sizeof("\t"),fp);

fwrite(&flagpoint2,sizeof(flagpoint2),1,fp);

fwrite("\t",2,sizeof("\t"),fp);

fwrite(&flagpoint3,sizeof(flagpoint3),1,fp);/

fwrite(ch,strlen(ch),1,fp);

printf("%s",ch);

printf("若想继续录入,请输入1,若退出,请输入0\n");

scanf("%d",&choice);

}}

fclose(fp);

}

void look_student(struct student stu[]){

FILE fp;

int i=0;

int sum=0;

student flag;

fp=fopen("stu1txt","r");

if(fp==0){printf("无法打开文件\n");}

else{

while(!feof(fp)){

fscanf(fp,"%s %d %d %d %d",stu[i]name,&stu[i]cla,&stu[i]point1,&stu[i]point2,&stu[i]point3);

i++;

}}

for(int j=0;j<i;j++){

sum=stu[j]point1+stu[j]point2+stu[j]point3;

stu[j]sum=sum;

sum=0;

}

int t=0;

for(t=1;t<i;t++){

for(j=0;j<i-t;j++){

if(stu[j]sum<stu[j+1]sum){

strcpy(flagname,stu[j+1]name);

flagcla=stu[j+1]cla;

flagpoint1=stu[j+1]point1;

flagpoint2=stu[j+1]point2;

flagpoint3=stu[j+1]point3;

flagsum=stu[j+1]sum;

strcpy(stu[j+1]name,stu[j]name);

stu[j+1]cla=stu[j]cla;

stu[j+1]point1=stu[j]point1;

stu[j+1]point2=stu[j]point2;

stu[j+1]point3=stu[j]point3;

stu[j+1]sum=stu[j]sum;

strcpy(stu[j]name,flagname);

stu[j]cla=flagcla;

stu[j]point1=flagpoint1;

stu[j]point2=flagpoint2;

stu[j]point3=flagpoint3;

stu[j]sum=flagsum;

}

}

}

for(j=0;j<i;j++){

stu[j]num=j+1;

}

fclose(fp);

FILE creat;

char ch[30]={0};

creat=fopen("stu2txt","w");

for(j=0;j<i;j++){

sprintf(ch,"%s\t%d\t%d\t%d\t%d\t%d\t%d",stu[j]name,stu[j]cla,stu[j]point1,stu[j]point2,stu[j]point3,stu[j]sum,stu[j]num);

fwrite(ch,30,1,creat);

}

printf("姓名\t班级\t成绩1\t成绩2\t成绩3\t总分\t排名\n");

for(j=0;j<i;j++){

printf("%s\t",stu[j]name);

printf("%d\t",stu[j]cla);

printf("%d\t",stu[j]point1);

printf("%d\t",stu[j]point2);

printf("%d\t",stu[j]point3);

printf("%d\t",stu[j]sum);

printf("%d\n",stu[j]num);

}

fclose(creat);

}

注意一下,我创建的文件时stu1txt

写了一个,今天百度被黑了,总是打不开。现在传给你看看那哈。

代码都有注释的,相信你能看明白。后边付有测试数据及测试结果。

有问题Hi我哈:)

#include <stdioh>

#include <stdlibh>

#include <malloch>

#include <stringh>

/ 链表节点结构体 /

typedef struct _Node {

int data;

struct _Node next;

} Node;

/ 创建链表 /

void create_list(Node head)

{

Node newNode = NULL;

Node tempNode = NULL;

int input = 0;

if(NULL == head)

{

printf("参数错误,程序结束!");

exit(0);

}

tempNode = head;

printf("请输入需要创建的链表值(输入0结束)\n");

scanf("%d", &input);

while(input != 0)

{

newNode = malloc(sizeof(Node));

if (newNode == NULL)

{

printf("参数错误,程序结束!");

exit(0);

}

newNode->data = input;

newNode->next = NULL;

tempNode->next = newNode;

tempNode = newNode;

scanf("%d", &input);

}

}

/ 找出最大节点 /

void max_node_search(Node head)

{

int max_value = 0; / 保存节点中的最大值 /

Node tempNode = NULL; / 节点指针,用来遍历链表 /

if(NULL == head)

{

printf("参数错误,程序结束!");

exit(0);

}

tempNode = head->next; / 当前节点初始化 /

max_value = tempNode->data; / 保存当前节点的值 /

/ 顺序遍历链表,找到最大值的节点 /

while(tempNode)

{

/ 最大值与当前节点的值作比较 /

if(max_value < tempNode->data)

{

max_value = tempNode->data; / 保存最大值 /

}

tempNode = tempNode->next; / 当前节点变更 /

}

printf("最大节点的值: %d\n", max_value); / 输出最大节点的值 /

}

/ 偶数、奇数查找,如果当前节点值是偶数,则将其与后继节点交换,

如果当前节点为奇数,则删除其后继节点

/

void list_make_up(Node head)

{

Node tempNode = NULL; / 节点指针,用来遍历链表 /

Node delNode = NULL; / 被删除节点的指针 /

int temp = 0;

if(NULL == head)

{

printf("参数错误,程序结束!");

exit(0);

}

tempNode = head->next;

/ 顺序遍历链表 /

while(tempNode)

{

/ 如果已经是最后一个节点,则退出 /

if (tempNode->next == NULL)

break;

if (tempNode->data%2 == 0) / 偶数判断 /

{

/ 将当前节点与后继节点的值交换 /

temp = tempNode->data;

tempNode->data = tempNode->next->data;

tempNode->next->data = temp;

tempNode = tempNode->next;

continue; / 继续下一个节点 /

}

if (tempNode->data%2 != 0) / 奇数判断 /

{

/ 将后继节点删除 /

delNode = tempNode->next;

tempNode->next = delNode->next;

free(delNode); / 节点被删除,占用内存被释放 /

delNode = NULL;

tempNode = tempNode->next;

continue; / 继续下一个节点 /

}

}

/ 打印整理后的链表值 /

tempNode = head->next;

printf("整理后的链表值: ");

/ 遍历整个链表,输出节点值 /

while(tempNode)

{

printf("%d ", tempNode->data);

tempNode = tempNode->next;

}

printf("\n");

}

/ 测试函数main /

int main()

{

Node head;

Node tempNode = NULL;

Node delNode = NULL;

headdata = 0;

headnext = NULL;

create_list(&head); / 创建链表 /

max_node_search(&head); / 查找最大值 /

list_make_up(&head); / 整理链表 /

/ 释放内存 /

tempNode = headnext;

while(tempNode)

{

delNode = tempNode;

tempNode = delNode->next;

free(delNode);

}

return 0;

}

测试数据

12 4 8 17 76

最大节点值:76

链表:24 8 17 76 12s

12 7 3 8 5

最大节点值:12

链表: 7 3 8 5 12

7 12 34 17 19

最大节点值:34

链表:7 17 19 34

好题,首先根据面向对象思想,应该定义二叉树节点类,然后二叉树类。二叉树节点包含属性有节点值,左指针,右指针。成员函数有获取节点值。设置左孩子,设置右指针,获取左孩子,获取右孩子。二叉树类属性有根结点指针。成员函数有创建二叉树,先序遍历,中序遍历,后序遍历。#include <iostream>#include <queue>#include <limits>using namespace std; int x; // for input data typedef struct node{ int data; node pLeft; node pRight; node(int val = 0) : data(val), pLeft(NULL), pRight(NULL){}}TreeNode, PTree; class BinaryTree{public: explicit BinaryTree(int size = 0); ~BinaryTree(); TreeNode getHead() const; static void preOrder(TreeNode); static void inOrder(TreeNode); static void postOrder(TreeNode); static void levOrder(TreeNode); static int getDepth(TreeNode); int getCount() const; int getLeafCount() const;private: void insertNode(int); PTree treeHead; int count;}; int main(void){ cout << "--------------------BinaryTree--------------------" << endl; // 4 1 7 3 6 8 BinaryTree t1(6); BinaryTree::preOrder(t1getHead()); cout << endl; BinaryTree::inOrder(t1getHead()); cout << endl; BinaryTree::postOrder(t1getHead()); cout << endl; BinaryTree::levOrder(t1getHead()); cout << endl; cout << "Tree's depth is " << BinaryTree::getDepth(t1getHead()) << endl; cout << "Tree's count is " << t1getCount() << endl; cout << "Tree's leafCount is " << t1getLeafCount() << endl; return 0;} TreeNode BinaryTree::getHead() const{ return this->treeHead;} void BinaryTree::insertNode(int data){ if( treeHead == NULL ){ treeHead = new TreeNode(data); return; } TreeNode pre = NULL; TreeNode cur = treeHead; while( cur != NULL ) { pre = cur; if( data < cur->data ){ cur = cur->pLeft; }else{ cur = cur->pRight; } } // create node in current cur = new TreeNode(data); if( data < pre->data ) pre->pLeft = cur; else pre->pRight = cur;} BinaryTree::BinaryTree(int size) : treeHead(NULL), count(size){ if( size <= 0 ){ cout << "Create a empty tree!" << endl; return; } cout << "Input " << size << " data to create BinaryTree: "; for(int i = 0; i < size; ++i){ cin >> x; this->insertNode(x); } // clear input stream cinclear(); cinignore(numeric_limits<streamsize>::max(), '\n');} BinaryTree::~BinaryTree(){ queue<TreeNode> que; quepush(treeHead); while( !queempty() ) { TreeNode curNode = quefront(); if( curNode != NULL ){ if( curNode->pLeft != NULL ) quepush(curNode->pLeft); if( curNode->pRight != NULL ) quepush(curNode->pRight); delete curNode; } quepop(); } } void BinaryTree::preOrder(TreeNode pNode){ if( pNode != NULL ){ cout << pNode->data << " "; BinaryTree::preOrder(pNode->pLeft); BinaryTree::preOrder(pNode->pRight); }} void BinaryTree::inOrder(TreeNode pNode){ if( pNode != NULL ){ BinaryTree::inOrder(pNode->pLeft); cout << pNode->data << " "; BinaryTree::inOrder(pNode->pRight); }} void BinaryTree::postOrder(TreeNode pNode){ if( pNode != NULL ){ BinaryTree::postOrder(pNode->pLeft); BinaryTree::postOrder(pNode->pRight); cout << pNode->data << " "; }} void BinaryTree::levOrder(TreeNode pNode){ queue<TreeNode> que; quepush(pNode); while( !queempty() ) { TreeNode curNode = quefront(); if( curNode != NULL ){ if( curNode->pLeft != NULL ) quepush(curNode->pLeft); if( curNode->pRight != NULL ) quepush(curNode->pRight); cout << curNode->data << " "; } quepop(); }} int BinaryTree::getDepth(TreeNode pNode){ if( pNode == NULL ) return -1; int ld = BinaryTree::getDepth(pNode->pLeft); int rd = BinaryTree::getDepth(pNode->pRight); return (ld>rd ld:rd) + 1;} int BinaryTree::getCount() const{ return this->count;} int BinaryTree::getLeafCount() const{ int leafCount = 0; queue<TreeNode> que; quepush(treeHead); while( !queempty() ) { TreeNode curNode = quefront(); if( curNode != NULL ){ if( curNode->pLeft != NULL ) quepush(curNode->pLeft); if( curNode->pRight != NULL ) quepush(curNode->pRight); if( curNode->pLeft==NULL && curNode->pRight==NULL ) leafCount++; } quepop(); } return leafCount; }

你说的差不多就是个学生管理系统吗

看看下面的代码把

#include<iostream>

#include<iomanip>

#include<fstream>

#include<string>

using namespace std;

#define max 100;

class student

{

public:

student next;

public:

string name;//姓名

long num;//学号

int x,y,z;//数学,语文,英语

int AA;//总分

void play(){cout<<name<<"学生的学号是"<<num<<",数学:"<<x<<",语文:"<<y<<",英语:"<<z<<",总分:"<<AA<<endl;};

student(string sname,long snum,int sx,int sy,int sz)

{

name=sname;

num=snum;

x=sx;

y=sy;

z=sz;

}

};

class cla

{

public:

cla()//构造函数

{

stu=0;

sload();

}

~cla()//析构函数

{

student p;

p=stu;

while(p)

{

p=p->next;

delete stu;

stu=p;

}

stu=0;

}

void sadd(); //添加

void sremove(); //删除

void samend(); //修改

void ssearch(); //查询

void staxis(); //排序

void ssave(); //保存

void sload(); //读取

//排序函数

void pxh();

void psx();

void pyw();

void pyy();

void pAA();

private:

student stu; //头接点

};

void cla::sadd()//添加

{

student q;

string name1;

long num1;

int x1,y1,z1;

system("cls");

cout<<"\n 增加的学生 \n"<<endl;

cout<<"请输入学生的(中间用空格间隔) "<<endl;

cout<<"姓名 学号 数学成绩 语文成绩 英语成绩:"<<endl;

cin>>name1>>num1>>x1>>y1>>z1;

q=new student(name1,num1,x1,y1,z1);

q->next=0;

q->AA=x1+y1+z1;

if(stu)

{

student t;

t=stu;

if(t->num==num1)

{

cout<<"学号已存在,请重新输入"<<endl;

return;

}

while(t->next)

{

if(t->num==num1)

{

cout<<"学号已存在,请重新输入"<<endl;

return;

}

t=t->next;

}

t->next=q;

}

else

{

stu=q;

}

cout<<"输入完毕"<<endl;

}

void cla::sremove()//删除

{

system("cls");

int num1;

cout<<"\n 删除学生信息 \n";

cout<<"请输入想要删除学生的学号:";

cin>>num1;

//查找要删除的结点

student p1,p2;

p1=stu;

while(p1)

{

if(p1->num==num1)

break;

else

{

p2=p1;

p1=p1->next;

}

}

//删除结点

if(p1!=NULL)//若找到结点,则删除

{

p1->play();

cout<<"确定删除吗[Y/N]"<<endl;

char c;cin>>c;

if(toupper(c)!='Y') return;

if(p1==stu) //若要删除的结点是第一个结点

{

stu=p1->next;

delete p1;

}

else //若要删除的结点是后续结点

{

p2->next=p1->next;

delete p1;

}

cout<<"找到学号为"<<num1<<"的学生,并删除\n";

}

else //未找到结点

cout<<"未找到想要删除的学生!\n";

}

void cla::samend()//修改

{

system("cls");

long num1;

cout<<"\n 修改学生信息 \n";

cout<<"输入要修改学生的学号";

cin>>num1;

//查找要修改的结点

student p1,p2;

p1=stu;

while(p1)

{

if(p1->num==num1)

break;

else

{

p2=p1;

p1=p1->next;

}

}

if(p1!=NULL)

{

cout<<"学号是"<<num1<<"的学生的信息"<<endl;

cout<<"姓名 "<<p1->name<<"数学"<<p1->x<<"语文"<<p1->y<<"英语"<<p1->z<<endl;

cout<<"请输入修改后的信息:姓名 数学成绩 语文成绩 英语成绩"<<endl;

cin>>p1->name>>p1->x>>p1->y>>p1->z;

p1->AA=p1->x+p1->y+p1->z;

cout<<"修改成功"<<endl;

}

else //未找到接点

cout<<"未找到!\n";

}

void cla::ssearch()//查询

{

system("cls");

cout<<"\n 查询学生信息 \n"<<endl;

cout<<"请输入查询方式:"<<endl;

cout<<"1按学号查询"<<endl;

cout<<"2按姓名查询"<<endl;

cout<<"3返回"<<endl;

char c; cin>>c;

switch (c)

{

case '1':

{

long num1;

cout<<"要查询的学号"<<endl;

cin>>num1;

//查找要查询的结点

student p1,p2;

p1=stu;

while(p1)

{

if(p1->num==num1)

break;

else

{

p2=p1;

p1=p1->next;

}

}

if(p1!=NULL)

{

cout<<"学号是"<<num1<<"的学生的信息"<<endl;

cout<<"姓名:"<<p1->name<<" 数学:"<<p1->x<<" 语文:"<<p1->y<<" 英语:"<<p1->z<<endl;

cout<<"查询完毕";

}

else //未找到接点

cout<<"未找到!\n";

break;

}

case '2':

{

string name1;

cout<<"要查询的学生姓名"<<endl;

cin>>name1;

//查找要查询的结点

student p1,p2;

p1=stu;

while(p1)

{

if(p1->name==name1)

break;

else

{

p2=p1;

p1=p1->next;

}

}

if(p1!=NULL)

{

cout<<name1<<"的学生的信息"<<endl;

cout<<"学号:"<<p1->num<<" 数学:"<<p1->x<<" 语文:"<<p1->y<<" 英语:"<<p1->z<<endl;

cout<<"查询完毕";

}

else //未找到接点

cout<<"未找到!\n";

break;

}

case '3': return;

}

}

void cla::pxh() //按学号排序

{

student p1,p2;

int n;

p1=stu;

n=1;

while(p1->next)

{ n++; p1=p1->next; }

cout<<"共有"<<n<<"条信息"<<endl;

int i;

p1=stu;

for(i=1;i<n;i++)

{

p1=stu;

if (p1->num>p1->next->num) // 如果头结点大于第二个的

{

p2=p1->next;

p1->next=p1->next->next;

p2->next=p1; //头结点交换

stu=p2;

}

p1=stu;

while(p1->next->next) //中间的交换

{

p2=p1;

p1=p1->next;

if(p1->num>p1->next->num)

{

p2->next=p1->next;

p1->next=p1->next->next;

p2->next->next=p1;

p1=p2->next; //交换

}

}

}

p1=stu;

do

{

p1->play();

p1=p1->next;

}while(p1);

}

void cla::psx()//按数学成绩排序

{

student p1,p2;

int n;

p1=stu;

n=1;

while(p1->next)

{ n++; p1=p1->next; }

cout<<"共有"<<n<<"条信息"<<endl;

int i;

p1=stu;

for(i=1;i<n;i++)

{ p1=stu;

if (p1->x>p1->next->x) // 如果头结点大于第二个的

{ p2=p1->next;

p1->next=p1->next->next;

p2->next=p1; //头结点交换

stu=p2;

}

p1=stu;

while(p1->next->next) //中间的交换

{ p2=p1;

p1=p1->next;

if(p1->x>p1->next->x)

{

p2->next=p1->next;

p1->next=p1->next->next;

p2->next->next=p1;

p1=p2->next; //交换

}

}

}

p1=stu;

do

{ p1->play();

p1=p1->next;

}while(p1);

}

void cla::pyw()//按语文成绩排序

{

student p1,p2;

int n;

p1=stu;

n=1;

while(p1->next)

{ n++; p1=p1->next; }

cout<<"共有"<<n<<"条信息"<<endl;

int i;

p1=stu;

for(i=1;i<n;i++)

{ p1=stu;

if (p1->y>p1->next->y) // 如果头结点大于第二个的

{ p2=p1->next;

p1->next=p1->next->next;

p2->next=p1; //头结点交换

stu=p2;

}

p1=stu;

while(p1->next->next) //中间的交换

{ p2=p1;

p1=p1->next;

if(p1->y>p1->next->y)

{

p2->next=p1->next;

p1->next=p1->next->next;

p2->next->next=p1;

p1=p2->next; //交换

}

}

}

p1=stu;

do

{ p1->play();

p1=p1->next;

}while(p1);

}

void cla::pyy()//按英语成绩排序

{

student p1,p2;

int n;

p1=stu;

n=1;

while(p1->next)

{ n++; p1=p1->next; }

cout<<"共有"<<n<<"条信息"<<endl;

int i;

p1=stu;

for(i=1;i<n;i++)

{ p1=stu;

if (p1->z>p1->next->z) // 如果头结点大于第二个的

{ p2=p1->next;

p1->next=p1->next->next;

p2->next=p1; //头结点交换

stu=p2;

}

p1=stu;

while(p1->next->next) //中间的交换

{ p2=p1;

p1=p1->next;

if(p1->z>p1->next->z)

{

p2->next=p1->next;

p1->next=p1->next->next;

p2->next->next=p1;

p1=p2->next; //交换

}

}

}

p1=stu;

do

{ p1->play();

p1=p1->next;

}while(p1);

}

void cla::pAA()//按总分排序

{

student p1,p2;

int n;

p1=stu;

n=1;

while(p1->next)

{ n++; p1=p1->next; }

cout<<"共有"<<n<<"条信息"<<endl;

int i;

p1=stu;

for(i=1;i<n;i++)

{ p1=stu;

if (p1->AA>p1->next->AA) // 如果头结点大于第二个的

{ p2=p1->next;

p1->next=p1->next->next;

p2->next=p1; //头结点交换

stu=p2;

}

p1=stu;

while(p1->next->next) //中间的交换

{ p2=p1;

p1=p1->next;

if(p1->AA>p1->next->AA)

{

p2->next=p1->next;

p1->next=p1->next->next;

p2->next->next=p1;

p1=p2->next; //交换

}

}

}

p1=stu;

do

{ p1->play();

p1=p1->next;

}while(p1);

}

void cla::staxis()//排序

{

system("cls");

char c;

cout<<"请选择以何种方式排序:"<<endl;

cout<<"1……以学号排序"<<endl;

cout<<"2……以数学成绩排序"<<endl;

cout<<"3……以语文成绩排序"<<endl;

cout<<"4……以英语成绩排序"<<endl;

cout<<"5……以总分排序"<<endl;

cout<<"6……返回"<<endl;

cout<<"请选择(1-6)"<<endl;

cin>>c;

switch (c)

{

case '1':pxh(); break;

case '2':psx(); break;

case '3':pyw(); break;

case '4':pyy(); break;

case '5':pAA(); break;

case '6':return;

}

}

void cla::ssave() //保存到文件

{

system("cls");

char c;

cout<<"\n保存学生信息(将覆盖原文件),是否继续[Y/N]:"; cin>>c;

if(toupper(c)!='Y') return;

ofstream tfile("datetxt",ios_base::binary);

student p=stu;

while(p)// 写入文件

{

tfile<<p->name<<"\t"<<p->num<<"\t"<<p->x<<"\t"<<p->y<<"\t"<<p->z;

tfile<<endl;

p=p->next;

}

tfileclose();

cout<<"保存完毕"<<endl;

}

void cla::sload() //读取

{

student p;

p=stu;

while(p)

{

stu=p->next;

delete p;

p=stu;

}

ifstream tfile("datetxt",ios_base::binary);

string name1;

long num1;

int x1,y1,z1;

tfile>>name1>>num1>>x1>>y1>>z1;

while(tfilegood())

{

//创建学生接点

student s;

s=stu;

s=new student(name1,num1,x1,y1,z1);

s->next=0;

s->AA=x1+y1+z1;

if(stu) //若已经存在结点

{

student p2;

p2=stu;

while(p2->next) //查找尾结点

{

p2=p2->next;

}

p2->next=s; //连接

}

else //若不存在结点(表空)

{

stu=s; //连接

}

tfile>>name1>>num1>>x1>>y1>>z1;

}

tfileclose();

cout<<"\n学生信息已经装入\n";

}

void main()

{

char c;

cla a;

do

{

cout<<"\n 学 生 成 绩 管 理 系 统 \n";

cout<<"\n";

cout<<" 作者:软件工程06110119:zgjxwl \n";

cout<<" 1……增加学生 \n";

cout<<" 2……删除学生 \n";

cout<<" 3……修改学生 \n";

cout<<" 4……查询学生信息 \n";

cout<<" 5……排序 \n";

cout<<" 6……保存信息 \n";

cout<<" 7……读取信息 \n";

cout<<" 8……退出 \n";

cout<<"\n";

cout<<"请选择(1-8):";

cin>>c;

switch(c)

{

case '1': asadd();break;

case '2': asremove();break;

case '3': asamend();break;

case '4': assearch();break;

case '5': astaxis();break;

case '6': assave();break;

case '7': asload();break;

}

}while(c!='8');

}

以上就是关于求数据结构C++舞伴配对问题程序代码全部的内容,包括:求数据结构C++舞伴配对问题程序代码、求用C语言和数据结构中的无向图存储结构编一个校园导游图完全的程序代码、设计一个程序,是C语言数据结构等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10006135.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存