西南大学数据结构课程设计代码.docx
《西南大学数据结构课程设计代码.docx》由会员分享,可在线阅读,更多相关《西南大学数据结构课程设计代码.docx(18页珍藏版)》请在冰豆网上搜索。
西南大学数据结构课程设计代码
哈夫曼的应用
#include
#include
#include
#include"nodetype.h"
#include"jlhfms.h"
#include"scbmwj.h"
#include"dwym.h"
#include
#include
#definen100//叶子节点数
#definem2*n-1//哈夫曼树中节点总数(包括新生成的n-1个节点)
voidselect(HuffmanTreeT,intk,int&s1,int&s2){
//在HT[1....k]中选择parent为0且权值最小的两个根节点
//其序号分别为s1和s2
inti,j;
intmin1=101;
for(i=1;i<=k;i++){
if(T[i].weight
j=i;
min1=T[i].weight;
}
}
s1=j;//取得最小权值的编号
min1=32767;
for(i=1;i<=k;i++){
if(T[i].weight
j=i;
min1=T[i].weight;
}
}
s2=j;//取得第二小权值的编号
}
intjsq(char*s,intcnt[],charstr[]){
//统计字符串中各种字母的个数以及字符的种类
char*p;
inti,j,k;
//temp[k]数组巧妙地将字符以及该字符出现的次数成功的映射,
//k映射为字符在26个大写字符中的位置,temp[k]的值表示该字符出现的次数
inttemp[27];
for(i=1;i<=26;i++){
temp[i]=0;
}//初始化
for(p=s;*p!
='\0';p++){
//统计各种字符的个数
if(*p>='A'&&*p<='Z'){
k=*p-64;
temp[k]++;
}
if(*p>='a'&&*p<='z'){
k=*p-96;
temp[k]++;
}
if(*p>='0'&&*p<='9'){
k=*p-47;
temp[k]++;
}
//printf("%c",*s);
//printf("\n");
}
j=0;
i=1;
//str[0]='1';
//printf("%s",s);
if(*s>='A'&&*s<='Z'){
for(i=1,j=0;i<=26;i++){
if(temp[i]!
=0){
j++;//j保存字符的个数
str[j]=i+64;//送对应的字母到数组str[]中
cnt[j]=temp[i];//存入对应字母的权值到数组cnt[]中
}
//printf("%c,权值=%d\n",str[j],cnt[j]);
}
}
if(*s>='0'&&*s<='9'){
for(i=1,j=0;i<=26;i++){
if(temp[i]!
=0){
j++;//j保存字符的个数
str[j]=i+47;//送对应的字母到数组str[]中
cnt[j]=temp[i];//存入对应字母的权值到数组cnt[]中
//printf("%c,权值=%d\n",str[j],cnt[j]);
}}}
if(*s>='a'&&*s<='z'){
for(i=1,j=0;i<=26;i++){
if(temp[i]!
=0){
j++;//j保存字符的个数
str[j]=i+96;//送对应的字母到数组str[]中
cnt[j]=temp[i];//存入对应字母的权值到数组cnt[]中
//printf("%c,权值=%d\n",str[j],cnt[j]);}}}
returnj;}
voidChuffmanTree(HuffmanTreeHT,HuffmanCodeHC,intcnt[],charstr[]){
//构造哈夫曼树
inti,s1,s2;
for(i=1;i<=2*num-1;i++){
//初始化HT
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].parent=0;
HT[i].weight=0;
}
for(i=1;i<=num;i++){
//输入num个叶节点的权值
HT[i].weight=cnt[i];
}
for(i=num+1;i<=2*num-1;i++){
//在HT{1....i-1]中选择parent为0且权值最小的两个根节点
//其序号分别为s1和s2,并依次生成新节点
select(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
for(i=1;i<=num;i++){
//输入字符集中的字符
HC[i].ch=str[i];
}
i=1;
printf("\n\n");
while(i<=num){
printf("字符%c,次数为:
%d\n",HC[i].ch,cnt[i++]);
}
}
typedefstruct{
charch;//待编码的字符
charbits[9];//存放编码位串(为什么大小设置为9?
)
intlen;//编码长度
}CodeNode;
typedefCodeNodeHuffmanCode[n+1];//待编码的n-1个字符
typedefstruct{
intweight;//权值
intlchild,rchild,parent;//左右孩子及双亲指针
}HTNode;//树中节点类型
typedefHTNodeHuffmanTree[m+1];//0号单元不用(共有m个节点,在哈夫曼编码时新生成的节点也对需要编码的字符产生影响)
intnum;//num定义为全局变量,用来存储待编码的字符个数
voidHuffmanEncoding(HuffmanTreeHT,HuffmanCodeHC){
//根据哈夫曼树HT求哈弗曼编码表HC
intc,p,i;//c和p分别指示T中孩子和双亲的位置
charcd[n];//临时存放编码串
intstart;//指示编码在cd中的起始位置
cd[num]='\0';//最后一位放上串结束符
for(i=1;i<=num;i++){
start=num;//初始位置
c=i;//从叶子节点T[i]开始上溯
p=HT[c].parent;
while((p=HT[c].parent)>0){
//直至上溯到HT[c]是树根为止
//若T[c]是T[p]的左孩子,则生成0,否则生成代码1
cd[--start]=(HT[p].lchild==c)?
'0':
'1';
c=p;
}
strcpy(HC[i].bits,&cd[start]);
HC[i].len=num-start;
printf("%c:
%s\n",HC[i].ch,HC[i].bits);
}
}
voidcoding(HuffmanCodeHC,char*str){
//对str所代表的字符串进行编码,并写入文件
inti,j;
FILE*fp;
fp=fopen("codefile.txt","w");
printf("\n\n输入的字符文件编码为:
\n");
while(*str){
for(i=1;i<=num;i++){
if(HC[i].ch==*str){
for(j=0;j
fputc(HC[i].bits[j],fp);
printf("%c",HC[i].bits[j]);}
printf("●");
break;}
}
str++;
}
fclose(fp);
}
char*decode(HuffmanCodeHC){
//代码文件codefile.txt的译码
FILE*fp;
charstr[254];//假设原文本文件不超过254个字符
char*p;
staticcharcd[n+1];
inti,j,k=0,cjs;
fp=fopen("codefile.txt","r");
while(!
feof(fp)){
cjs=0;
for(i=0;i
cd[i]='';
cd[i+1]='\0';
cd[i]=fgetc(fp);
for(j=1;j<=num;j++){
if(strcmp(HC[j].bits,cd)==0){
str[k]=HC[j].ch;
k++;
cjs=1;
break;
}
}
}
}
str[k]='\0';
p=str;
returnp;}
voidmain(){
charst[254],*s,str[27];
inti;
intcn[27];
HuffmanTreeHT;
HuffmanCodeHC;
printf("输入需要编码的字符串(假设均为大写字母或者均为数字):
\n");
gets(st);//将字符串存入到st[]里面
for(i=0;st[i]!
='\0';i++){
//if(st[i]<'A'||st[i]>'Z'){
//printf("请保证输入的字符都是大写字母!
\n");
//exit(0);
//}else{
num=jsq(st,cn,str);//统计字符的种类以及各字符出现的频率
//}
}
ChuffmanTree(HT,HC,cn,str);//建立哈夫曼树
printf("\n\n字符对应的哈夫曼编码为:
\n");
HuffmanEncoding(HT,HC);
coding(HC,st);//建立电文哈弗曼编码文件
s=decode(HC);//读编码文件译码
printf("\n\n译码后的字符串:
\n");
printf("%s\n\n",s);//输出译码后的字符串
}
Dijkstra算法应用交通咨询系统
#include"stdafx.h"
#include
#include
#defineMVNum50
#defineDij_MAXN33
#defineMAX_VERTEX_NUM31
#defineMAX_STRING_NUM10
#defineMAX_TRAFFIC_NUM10
typedefstructTrafficNode
{
charname[MAX_STRING_NUM];
intTime;//
intEndCity//火车到达城市的编号
intCost;//票价
}TrafficNodeDat;
typedefstructVNode
{
CityTypecity;//城市编号
intTrainNum;//标记下面Train数组里元素个数
TrafficNodeDatTrain[MAX_TRAFFIC_NUM];//数组成员为结构体,记录了到达城市、起止时间、票价和班次
}VNodeDat;
typedefstructTrafficNode
{
charname[MAX_STRING_NUM];//班次
intTime;
intEndCity;//火车到达城市的编号
intCost;//票价
}TrafficNodeDat;
typedefstructVNode
{
CityTypecity;//城市编号
intFlightNum;//标记下面Train数组和Flight数组里元素个数
TrafficNodeDatFlight[MAX_TRAFFIC_NUM];
}VNodeDat;
intmain()
switch(Command)
{
case0:
return0;
case1:
Administrators();//管理员操作界面函数
break;
case2:
User();//用户操作界面函数
break;
default:
cout<<"\t选择序号错误!
请重新选择!
\n";
intInitSystem()
voidUser()
voidAdministrators()
intDelCity(char*Name)//删除城市
{
//删除城市
intcity,i,j;
city=SeekCity(Name);
for(i=city;i{
strcpy(CityName[i],CityName[i+1]);
AdjList[i].FlightNum=AdjList[i+1].FlightNum;AdjList[i].TrainNum=AdjList[i+1].TrainNum;
for(j=0;j{
AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost;
AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity;
strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name);
AdjList[i].Flight[j].Time=AdjList[i+1].Flight[j].Time;
}
}
CityNum--;
return1;
}
intDelPath(char*name)//删除路线
{
//删除路线
inti,j,flag=0;
for(i=0;i{
for(j=0;jif(strcmp(AdjList[i].Flight[j].name,name)==0)
{flag=1;break;}//找到要删除的路线,找到跳出for循环
if(flag)
{
for(;j{
AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost;
AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity;
strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name);
AdjList[i].Flight[j].Time=AdjList[i].Flight[j+1].Time;
}
AdjList[i].FlightNum--;//将要删除路线后面的路线全部向前移,并将总数减1
break;
}
for(j=0;jif(strcmp(AdjList[i].Train[j].name,name)==0)
{
flag=1;
break;
}
if(flag)
{
for(;j{
AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost;
AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity;
strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name);
AdjList[i].Train[j].Time=AdjList[i].Train[j+1].Time;
}
AdjList[i].TrainNum--;
break;
}
}return1;
}
intInsertCity(char*Name)//添加某个城市
{
//添加城市
strcpy(CityName[CityNum],Name);
AdjList[CityNum].city=CityNum;//设置城市编号
AdjList[CityNum].FlightNum=0;
AdjList[CityNum].TrainNum=0;//新增城市火车数和飞机数初始为零
CityNum++;//城市总数加1
return1;
}
intInsertFlight(char*flight,char*StartCity,char*EndCity,intTime,intcost)//添加某架航班
{
//添加飞机路线
inti,j;
i=SeekCity(StartCity);j=SeekCity(EndCity);
AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j;
AdjList[i].Flight[AdjList[i].FlightNum].Time=Time;
strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight);
AdjList[i].FlightNum++;
return1;
}
intInsertTrain(char*train,char*StartCity,char*EndCity,intTime,intcost)//添加某次列车
{
//添加火车路线
inti,j;
i=SeekCity(StartCity);j=SeekCity(EndCity);
AdjList[i].Train[AdjList[i].TrainNum].Cost=cost;AdjList[i].Train[AdjList[i].TrainNum].EndCity=j;
AdjList[i].Train[AdjList[i].TrainNum].Time=Time;
strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train);
AdjList[i].TrainNum++;
return1;
}
voidDijkstra(ints[30][30],intp_start,intp_end,intTravelType)
{
intPreCity[30];
inti,j,min,pre,pos;
for(i=0;iPreCity[p_start]=-2;
while(PreCity[p_end]==-1)
{
min=-1;
for(i=0;iif(PreCity[i]!
=-1)//i为起始站
{
for(j=0;jif(PreCity[j]==-1&&s[i][j]>0&&(min<0||s[i][j]{
pre=i;pos=j;//j为起始站中花费最小的到达站的城市编号
min=s[i][j];
}
}
PreCity[pos]=pre;
}
Dijkstra_Output(s,PreCity,p_end,TravelType);
}
intCalcMinCost(intStartCity,intEndCity,intTravelType)
{
//查询最小耗费路线
ints[30][30];
inti,j,min,end,flag1,flag2;
flag1=0;flag2=0;
for(i=0;ifor(j=0;js[i][j]=-1;//设空路径
if(TravelType==0)//判断初始城市和终点城市是否在火车交通路线中
for(i=0;ifor(j=0;j{
if(AdjList[i].Train[j].EndCity==StartCity)flag1=1;
if(AdjList[i].Train[j].EndCity==EndCity)flag2=1;
}
elseif(TravelType==1)//判断初始和终点城市是否在飞机交通路线中
for(i=0;ifor(j=0;j{
if(AdjList[i].Flight[j].EndCity==StartCity)flag1=1;
if(AdjList[i].Flight[j].EndCity==EndCity)flag2=1;
}
if(flag1!
=1&&flag2!
=1)
{printf("\n\t抱歉!
没有您要查找的路线!
");return0;}
if(TravelType==0)
{
for(i=0;i