数据结构课程设计奥运会奖牌管理程序文档格式.docx
《数据结构课程设计奥运会奖牌管理程序文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计奥运会奖牌管理程序文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
#include<
stdio.h>
stdlib.h>
string.h>
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineEQ(a,b)((a)==(b))
#defineLT(a,b)((a)<
(b))
typedefintStatus;
typedefstructLNode1{/*存储国家、金牌数、奖牌数*/
structdata1{/*数据域*/
charcountry[50][50];
/*存储国家的二维数组*/
intgolden[50];
/*金牌数*/
intmedal[50];
/*奖牌数*/
}data1;
structLNode1*next;
}LNode1,*LinkList1;
StatusStorage_Sort_Search(LinkList1L1)/*输入存储(Storage),同时插入排序
{(Sort),查找(Search)*/
inti,j,n,k,m,z,l,low,high,mid;
intM[50];
/*将存储的金牌存入此数组*/
intN[50];
/*将存储的奖牌存入此数组*/
intG[50];
intH[50];
intQ[50];
intZ[50];
intF[50];
charW[50][50];
L1=(LNode1*)malloc(sizeof(LNode1));
L1->
next=NULL;
printf("
(1).存储(国家、金牌数、奖牌数)\n\n"
);
请输入要存储的国家个数n\n"
scanf("
%d"
&
n);
请依次输入%d个国家的名字\n"
n);
for(i=0;
i<
n;
i++)/*用一个循环,依次存储国家*/
%s"
L1->
data1.country[i]);
请依次输入%d个国家的金牌数\n"
i++)/*用一个循环,依次存储金牌数,同时将golden[0……n-1]中
{的数存入M[1……n]中*/
scanf("
(L1->
data1.golden[i]));
M[i+1]=L1->
data1.golden[i];
}
请依次输入%d个国家的奖牌数\n"
i++)/*用一个循环,依次存储奖牌数,同时将
{medal[0……n-1]中的数存入N[1……n]中*/
Q[i]);
while(Q[i]<
M[i+1])/*此部分为判断输入的奖牌值是否有错,若所输入的
{奖牌值小于对应国家的金牌数值,则需重新输入*/
您刚才输入的奖牌数小于金牌数!
!
请重新输入奖牌数值\n"
}
N[i+1]=L1->
data1.medal[i]=Q[i];
\n\n
(2).排序(金牌榜)\n\n"
/*直接插入排序*/
for(i=2;
=n;
++i)/*在数组M中按照插入排序从小到大排列金牌数*/
if(M[i]<
M[i-1])/*若<
则需要把M[i]插入到有序子表中*/
{
M[0]=M[i];
/*M[[i]中的值放到M[0]中作为监视哨*/
M[i]=M[i-1];
for(j=i-2;
M[0]<
M[j];
--j)/*除后两个外依次与监视哨比较,若<
M[j+1]=M[j];
则记录后移*/
M[j+1]=M[0];
/*插入到正确位置*/
\n\n下面是金牌排序显示:
\n\n"
for(i=1;
i++)
printf("
%d"
M[i]);
i++)/*给数组G,H全部赋值为50*/
G[i]=50;
H[i]=50;
}
\n\n\n金牌榜\n\n\n"
国家金牌奖牌\n\n"
for(i=n;
i>
=1;
i--)/*用两个for循环找到金牌数由多到少的国家在原来存储中for(j=0;
j<
j++)的位置,主要根据原来金牌的位置找国家和奖牌*/
if((G[j]!
=j)&
&
(M[i]==(L1->
data1.golden[j])))
{
\t%s\t%d\t%d\n"
data1.country[j],L1->
data1.golden[j],L1->
data1.medal[j]);
G[j]=j;
/*j值放于数组G中相应的位置,使j在
}下一次循环时不能等于以前找过的值*/
\n\n排序(奖牌榜)\n\n"
/*折半插入排序*/
++i)
N[0]=N[i];
/*放于N[0]中起监视作用*/
low=1;
high=i-1;
while(low<
=high)/*在N[low……high]中,折半查找有序插
{入位置*/
mid=(low+high)/2;
/*折半*/
if(LT(N[0],N[mid]))/*插入点在低半区*/
high=mid-1;
elselow=mid+1;
/*插入点在高半区*/
for(j=i-1;
j>
=high+1;
--j)/*记录后移*/
N[j+1]=N[j];
N[high+1]=N[0];
/*插入*/
\n\n下面是奖牌排序显示:
N[i]);
\n\n\n奖牌榜\n\n\n"
i--)/*用两个for循环找到奖牌数由多到少的国家在原来存储中
for(j=0;
j++)的位置,主要根据原来奖牌的位置找国家和金牌*/if((H[j]!
(N[i]==(L1->
data1.medal[j])))
{
printf("
H[j]=j;
/*j值放于数组H中相应的位置,使j在}下一次循环时不能等于以前找过的值*/
\n\n(3).查找(国家—>
金牌数)\n\n"
请输入要查找的国家个数k\n"
k);
while(k>
n)/*此部分为判断要查找的国家数目是否
{超出范围,若超出,需要重新输入*/
您要查找的国家个数大于存储个数,请重新输入\n"
scanf("
请依次输入这个%d国家的名字\n"
k);
k;
l=0;
W[i]);
j++)/*for循环依次在存储的n个国家中与W[i]中的字符串比if(!
strcmp(W[i],L1->
data1.country[j]))较,找到国家对应的位置*/
\n此国家的金牌数为%d,奖牌数为%d\n\n"
l=1;
}
while(l==0)/*若j循环一趟没有找到与W[i]相同的
{值,则运行while*/
\n没有查找到您要找的这个国家,请重新输入\n\n"
j++)
if(!
data1.country[j]))
{
/*给l赋值1,保证只要输错就一直进行}while循环*/
}
\n\n查找(金牌数—>
国家)\n\n"
/*有序数组M中二分法查找金牌的过printf("
请输入您要查找的次数\n"
程*/
scanf("
m);
请连续%d次输入金牌数\n"
m);
m;
{
F[i]);
high=n;
=high)
if(EQ(F[i],M[mid]))
{
for(j=0;
j++)
if(M[mid]==(L1->
data1.golden[j]))
/*由有序组中的金牌找到其在原来存储中的位置*/
\n此金牌数对应的国家为%s,奖牌数为%d\n\n"
l=1;
break;
/*若在M中找到了相应的金牌数,在输}出后要跳出if,不然为死循环*/
else
if(LT(F[i],M[mid]))
high=mid-1;
elselow=mid+1;
while(l==0)
\n没有找到该奖牌数所对应的国家,请重新输入\n\n"
low=1;
high=n;
while(low<
=high)
mid=(low+high)/2;
if(EQ(F[i],M[mid]))
for(j=0;
if(M[mid]==(L1->
l=1;
break;
else
if(LT(F[i],M[mid]))
high=mid-1;
elselow=mid+1;
\n\n查找(奖牌—>
/*直接查找过程*/
z);
请连续%d次输入奖牌数\n"
z);
z;
Z[i]);
j++)/*for循环依次在存储的n个奖牌值中与Z[i]中的
if(Z[i]==L1->
data1.medal[j])数值比较,找到奖牌对应的位置*/
\n此奖牌数对应的国家为%s,金牌数为%d\n\n"
data1.golden[j]);
\n没有存储你输入的奖牌数,请重新输入\n\n"
data1.medal[j])
}
typedefstructLNode2{/*存储获得金牌的运动员姓名、国籍、获奖时间*/
structdata2{/*数据域*/
charathlete[50][50];
/*存储运动员的二维数组*/
/*存储国籍的二维数组*/
chartime[50][50];
/*存储时间的二维数组*/
charproject[50][50];
/*存储项目的二维数组*/
}data2;
structLNode2*next;
}LNode2,*LinkList2;
StatusStorage_Search(LinkList2L2)/*存储(Storage),查找(Search)*/
{
inti,j,m,k,l;
charF[50][50];
charG[50][50];
charH[50][50];
charK[50][50];
L2=(LNode2*)malloc(sizeof(LNode2));
L2->
\n\n
(1).存储(获金牌的运动员及其国籍、获奖时间、所参加的项目)\n\n"
请输入要存储的获金牌的运动员的人数m\n"
请依次输入这%d个运动员的姓名\n"
i++)/*用一个循环,依次输入获金牌的运动员的姓名*/
L2->
data2.athlete[i]);
请依次输入这%d个运动员的国籍\n"
i++)/*用一个循环,依次输入获金牌的运动员的国籍*/
data2.country[i]);
请依次输入这%d个运动员的获奖时间\n"
i++)/*用一个循环,依次输入获金牌的运动员的获奖时间*/
data2.time[i]);
请依次输入这%d个运动员所参加的项目\n"
i++)/*用一个循环,依次输入获金牌的运动员的项目名称*/
data2.project[i]);
\n\n
(2).查找(运动员—>
项目+国籍+时间)\n\n"
请输入你要查找的运动员的人数k\n"
F[i]);
j++)/*for循环依次在存储的m个运动员中与F[i]中的字符串
strcmp(F[i],L2->
data2.athlete[j]))比较,找到对应的位置*/
\n这名运动员国籍是%s,获金牌时间是%s,所参加的项目是%s\n\n"
data2.country[j],L2->
data2.time[j],L2->
data2.project[j]);
\n没有查找到您要找的这个运动员,请重新输入\n\n"
data2.athlete[j]))
\n这名运动员国籍是%s,获金牌时间是%s,所参加项目是%s\n\n"
}
\n\n查找(国家—>
获金牌运动员+时间+项目)\n\n"
请连续%d次输入国家的名字\n"
l=0;
G[i]);
j++)/*for循环依次在存储的m个国家中与G[i]中的字符串
strcmp(G[i],L2->
data2.country[j]))比较,找到对应的位置*/
\n此国家获得金牌的运动员有%s,所参加的项目间是%s\n\n"
data2.athlete[j],L2->
data2.project[j],L2->
data2.time[j]);
\n没有存储您要查找的国家,请重新输入\n\n"
data2.country[j]))
{printf("
\n此国家获得金牌的运动员有%s,所参加的项目是%s,获奖时间是%s\n\n"
\n\n查找(时间—>
获金牌的运动员+国籍+项目)\n\n"
请连续%d次输入获奖时间\n"
H[i]);
j++)/*for循环依次在存储的m个时间中与H[i]中的字符串
strcmp(H[i],L2->
data2.time[j]))比较,找到时间对应的位置*/
\n这天获金牌的运动员有%s,国籍为%s,所参加的项目是%s\n\n"
\n没有存储您输入的时间,请重新输入\n\n"
data2.time[j]))
\n这天获金牌的运动员有%s,国籍为%s,所参加的项目%s\n\n"
\n\n查找(项目—>
获金牌的运动员+国籍+时间)\n\n"
请连续%d次输入项目名称\n"
l=0;
K[i]);
j++)/*for循环依次在存储的m个项目中与K[i]中的字符串比
strcmp(K[i],L2-