西南大学数据结构课程设计代码Word格式文档下载.docx
《西南大学数据结构课程设计代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《西南大学数据结构课程设计代码Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
='
\0'
;
p++){
//统计各种字符的个数
if(*p>
A'
&
*p<
Z'
){
k=*p-64;
temp[k]++;
a'
z'
k=*p-96;
0'
9'
k=*p-47;
//printf("
%c"
*s);
\n"
);
j=0;
i=1;
//str[0]='
1'
%s"
s);
if(*s>
*s<
for(i=1,j=0;
if(temp[i]!
=0){
j++;
//j保存字符的个数
str[j]=i+64;
//送对应的字母到数组str[]中
cnt[j]=temp[i];
//存入对应字母的权值到数组cnt[]中
%c,权值=%d\n"
str[j],cnt[j]);
str[j]=i+47;
}}}
str[j]=i+96;
}}}
returnj;
voidChuffmanTree(HuffmanTreeHT,HuffmanCodeHC,intcnt[],charstr[]){
//构造哈夫曼树
inti,s1,s2;
=2*num-1;
//初始化HT
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].parent=0;
HT[i].weight=0;
=num;
//输入num个叶节点的权值
HT[i].weight=cnt[i];
for(i=num+1;
//在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;
//输入字符集中的字符
HC[i].ch=str[i];
printf("
\n\n"
while(i<
=num){
字符%c,次数为:
%d\n"
HC[i].ch,cnt[i++]);
typedefstruct{
charch;
//待编码的字符
charbits[9];
//存放编码位串(为什么大小设置为9?
)
intlen;
//编码长度
}CodeNode;
typedefCodeNodeHuffmanCode[n+1];
//待编码的n-1个字符
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]='
//最后一位放上串结束符
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)?
'
:
c=p;
strcpy(HC[i].bits,&
cd[start]);
HC[i].len=num-start;
%c:
%s\n"
HC[i].ch,HC[i].bits);
voidcoding(HuffmanCodeHC,char*str){
//对str所代表的字符串进行编码,并写入文件
FILE*fp;
fp=fopen("
codefile.txt"
"
w"
\n\n输入的字符文件编码为:
while(*str){
if(HC[i].ch==*str){
for(j=0;
j
fputc(HC[i].bits[j],fp);
HC[i].bits[j]);
●"
break;
str++;
}
fclose(fp);
char*decode(HuffmanCodeHC){
//代码文件codefile.txt的译码
charstr[254];
//假设原文本文件不超过254个字符
staticcharcd[n+1];
inti,j,k=0,cjs;
r"
while(!
feof(fp)){
cjs=0;
for(i=0;
i
cd[i]='
'
cd[i+1]='
cd[i]=fgetc(fp);
for(j=1;
j<
j++){
if(strcmp(HC[j].bits,cd)==0){
str[k]=HC[j].ch;
k++;
cjs=1;
str[k]='
p=str;
returnp;
voidmain(){
charst[254],*s,str[27];
inti;
intcn[27];
HuffmanTreeHT;
HuffmanCodeHC;
输入需要编码的字符串(假设均为大写字母或者均为数字):
gets(st);
//将字符串存入到st[]里面
st[i]!
//if(st[i]<
||st[i]>
//printf("
请保证输入的字符都是大写字母!
//exit(0);
//}else{
num=jsq(st,cn,str);
//统计字符的种类以及各字符出现的频率
//}
ChuffmanTree(HT,HC,cn,str);
//建立哈夫曼树
\n\n字符对应的哈夫曼编码为:
HuffmanEncoding(HT,HC);
coding(HC,st);
//建立电文哈弗曼编码文件
s=decode(HC);
//读编码文件译码
\n\n译码后的字符串:
%s\n\n"
//输出译码后的字符串
Dijkstra算法应用交通咨询系统
#include"
stdafx.h"
#include<
stdio.h>
string.h>
#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;
//班次
intEndCity;
//火车到达城市的编号
//票价
intFlightNum;
//标记下面Train数组和Flight数组里元素个数
TrafficNodeDatFlight[MAX_TRAFFIC_NUM];
intmain()
switch(Command)
{
case0:
return0;
case1:
Administrators();
//管理员操作界面函数
break;
case2:
User();
//用户操作界面函数
default:
cout<
<
"
\t选择序号错误!
请重新选择!
intInitSystem()
voidUser()
voidAdministrators()
intDelCity(char*Name)//删除城市
{
//删除城市
intcity,i,j;
city=SeekCity(Name);
for(i=city;
CityNum-1;
i++)
{
strcpy(CityName[i],CityName[i+1]);
AdjList[i].FlightNum=AdjList[i+1].FlightNum;
AdjList[i].TrainNum=AdjList[i+1].TrainNum;
for(j=0;
AdjList[i].FlightNum;
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;
CityNum;
if(strcmp(AdjList[i].Flight[j].name,name)==0)
{flag=1;
break;
}//找到要删除的路线,找到跳出for循环
if(flag)
{
for(;
AdjList[i].FlightNum-1;
{
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;
AdjList[i].TrainNum;
if(strcmp(AdjList[i].Train[j].name,name)==0)
flag=1;
break;
if(flag)
for(;
AdjList[i].TrainNum-1;
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--;
}
}return1;
intInsertCity(char*Name)//添加某个城市
//添加城市
strcpy(CityName[CityNum],Name);
AdjList[CityNum].city=CityNum;
//设置城市编号
AdjList[CityNum].FlightNum=0;
AdjList[CityNum].TrainNum=0;
//新增城市火车数和飞机数初始为零
CityNum++;
//城市总数加1
intInsertFlight(char*flight,char*StartCity,char*EndCity,intTime,intcost)//添加某架航班
//添加飞机路线
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++;
intInsertTrain(char*train,char*StartCity,char*EndCity,intTime,intcost)//添加某次列车
//添加火车路线
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++;
voidDijkstra(ints[30][30],intp_start,intp_end,intTravelType)
intPreCity[30];
inti,j,min,pre,pos;
for(i=0;
i++)PreCity[i]=-1;
PreCity[p_start]=-2;
while(PreCity[p_end]==-1)
min=-1;
for(i=0;
if(PreCity[i]!
=-1)//i为起始站
{
for(j=0;
if(PreCity[j]==-1&
s[i][j]>
0&
(min<
0||s[i][j]<
min))
{
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(j=0;
s[i][j]=-1;
//设空路径
if(TravelType==0)//判断初始城市和终点城市是否在火车交通路线中
for(i=0;
{
if(AdjList[i].Train[j].EndCity==StartCity)flag1=1;
if(AdjList[i].Train[j].EndCity==EndCity)flag2=1;
}
elseif(TravelType==1)//判断初始和终点城市是否在飞机交通路线中
for(i=0;
for(j=0;
{
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;
City