西南大学数据结构课程设计代码.docx

上传人:b****6 文档编号:6118673 上传时间:2023-01-03 格式:DOCX 页数:18 大小:19.90KB
下载 相关 举报
西南大学数据结构课程设计代码.docx_第1页
第1页 / 共18页
西南大学数据结构课程设计代码.docx_第2页
第2页 / 共18页
西南大学数据结构课程设计代码.docx_第3页
第3页 / 共18页
西南大学数据结构课程设计代码.docx_第4页
第4页 / 共18页
西南大学数据结构课程设计代码.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

西南大学数据结构课程设计代码.docx

《西南大学数据结构课程设计代码.docx》由会员分享,可在线阅读,更多相关《西南大学数据结构课程设计代码.docx(18页珍藏版)》请在冰豆网上搜索。

西南大学数据结构课程设计代码.docx

西南大学数据结构课程设计代码

哈夫曼的应用

#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;j

if(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;j

if(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;i

PreCity[p_start]=-2;

while(PreCity[p_end]==-1)

{

min=-1;

for(i=0;i

if(PreCity[i]!

=-1)//i为起始站

{

for(j=0;j

if(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;i

for(j=0;j

s[i][j]=-1;//设空路径

if(TravelType==0)//判断初始城市和终点城市是否在火车交通路线中

for(i=0;i

for(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;i

for(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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1