版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计1.赫夫曼编码器设计一个利用赫夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。要求:1)将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中)2)初始化:键盘输入字符集大小26、26个字符和26个权值(统计一篇英文文章中26个字母),建立哈夫曼树;3)编码:利用建好的哈夫曼树生成哈夫曼编码;4)输出编码(首先实现屏幕输出,然后实现文件输出);5)界面优化设计。代码如下:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#defineN200typedefstructHTNode//结构体{ intWeight; charch; intParent,Lchild,Rchild;}HTNode;typedefchar**HCode;voidSave(intn,HTNode*HT)//把权值保存到文件{ FILE*fp; inti; if((fp=fopen("data.txt","wb"))==NULL) { printf("cannotopenfile\n"); return; } for(i=0;i<n;i++) if(fwrite(&HT[i].Weight,sizeof(structHTNode),1,fp)!=1) printf("filewriteerror\n"); fclose(fp); system("cls"); printf("保存成功!");}voidCreate_H(intn,intm,HTNode*HT)//建立赫夫曼树,进行编码{ intw,k,j; charc; for(k=1;k<=m;k++) { if(k<=n) { printf("\n请输入权值和字符(用空格隔开):"); scanf("%d",&w); scanf("%c",&c); HT[k].ch=c; HT[k].Weight=w; } elseHT[k].Weight=0; HT[k].Parent=HT[k].Lchild=HT[k].Rchild=0; } intp1,p2,w1,w2; for(k=n+1;k<=m;k++) { p1=0;p2=0; w1=32767;w2=32767; for(j=1;j<=k-1;j++) { if(HT[j].Parent==0) { if(HT[j].Weight<w1)//寻找最小权值 { w2=w1;p2=p1; w1=HT[j].Weight; p1=j; } elseif(HT[j].Weight<w2) { w2=HT[j].Weight; p2=j; } } } HT[k].Lchild=p1;HT[k].Rchild=p2; HT[k].Weight=HT[p1].Weight+HT[p2].Weight; HT[p1].Parent=k;HT[p2].Parent=k; } printf("输入成功!");}voidCoding_H(intn,HTNode*HT)//对结点进行译码{ intk,sp,fp,p; char*cd; HCodeHC;HC=(HCode)malloc((n+1)*sizeof(char*)); cd=(char*)malloc(n*sizeof(char)); cd[n-1]='\0'; printf("************************\n"); printf("CharCoding\n"); for(k=1;k<=n;k++) { sp=n-1;p=k;fp=HT[k].Parent; for(;fp!=0;p=fp,fp=HT[fp].Parent) if(HT[fp].Lchild==p) cd[--sp]='0'; else cd[--sp]='1'; HC[k]=(char*)malloc((n-sp)*sizeof(char)); strcpy(HC[k],&cd[sp]); printf("%c%s\n",HT[k].ch,HC[k]); } printf("************************\n"); free(cd);}voidRead(intn,HTNode*HT)//从文件中读出数据{ inti; FILE*fp; if((fp=fopen("data.txt","rb"))==NULL) { printf("cannotopenfile\n"); exit(0); } for(i=0;i<n;i++) {fread(&HT[i].Weight,sizeof(structHTNode),1,fp); // printf("%d\n",HT[i].Weight); } Coding_H(n,HT); fclose(fp);}voidPrint_H(intm,HTNode*HT)//输出赫夫曼造树过程{ intk; printf("************************\n"); printf("NumWeightParLChRCh\n"); for(k=1;k<=m;k++) { printf("%d",k); printf("%d",HT[k].Weight); printf("%d",HT[k].Parent); printf("%d",HT[k].Lchild); printf("%d\n",HT[k].Rchild); } printf("************************\n");}voidDecode(intm,HTNode*HT)//对输入的电文进行译码{ inti,j=0; chara[10]; charendflag='2'; i=m; printf("输入发送的编码,以‘2’结束:"); scanf("%s",&a); printf("译码后的字符:"); while(a[j]!='2') { if(a[j]=='0') i=HT[i].Lchild; elsei=HT[i].Rchild; if(HT[i].Lchild==0)//HT[i]是叶结点 { printf("%c",HT[i].ch); i=m;//回到根结点 } j++; } printf("\n"); if(HT[i].Lchild!=0&&a[j]!='2') printf("ERROR");}intmain()//主函数{ intn,m,c; HTNodeHT[N]; do { system("color2f");//运行环境背景颜色. printf("\n\n\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n\t\t"); printf("\n\t\t\t赫夫曼编译码系统\t\t\t"); printf("\n\n\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n\t\t"); printf("\n\t\t\t1.输入权值、字母\n\t\t\t2.把数据写入文件\n\t\t\t3.输出赫夫曼编码表\n\t\t\t"); printf("4.输出赫夫曼译码表\n\t\t\t5.输入编码并译码.\n\t\t\t6.从文件中读出数据\n\t\t\t7.退出"); printf("\n\n\t\t\t请选择:"); scanf("%d",&c); switch(c) { case1:system("cls");printf("输入多少结点:"); scanf("%d",&n);m=2*n-1;Create_H(n,m,HT);break; case2:system("cls");Save(n,HT);break; case3:system("cls");Print_H(m,HT);break; case4:system("cls");Coding_H(n,HT);break; case5:system("cls");Decode(m,HT);break; case6:system("cls");Read(n,HT);break; case7:system("cls");exit(0); } }while(1); return0;}运行界面如下:2.学生成绩管理(链表实现)要求:实现如下功能:增加、查找、删除、输出、退出。代码如下:#include<stdio.h>#include<string.h>#include<stdlib.h>typedefstructscore//定义成绩信息结构体{ charNumber[20]; charName[20]; charChinese[20]; charEnglish[20]; charMath[20];}score;typedefstructnode_score//定义成绩信息链表结点,包括数据域和指针域{ scoredata; structnode_score*next;}node_score,*p_node_score;p_node_scoreheadScore;//定义链表的头指针为全局变量voidPrintScore(scores)//输出信息函数{ printf("%10s",s.Number); printf("|%-6s",s.Name); printf("|%-3s",s.Chinese); printf("|%-3s",s.English);printf("|%-3s\n",s.Math);}voidView()//输出函数{p_node_scorepNodeScore;pNodeScore=headScore; printf("学号|姓名|语文成绩|英语成绩|高数成绩\n"); while(pNodeScore!=NULL) { PrintScore(pNodeScore->data);//输出学生信息和成绩信息 pNodeScore=pNodeScore->next; }}voidAdd(){p_node_scorepNodeScore;//定义一个节点 pNodeScore=(p_node_score)malloc(sizeof(node_score));//为节点分配存储空间 printf("请输入学号:"); scanf("%s",pNodeScore->data.Number); printf("请输入姓名:"); scanf("%s",pNodeScore->data.Name); printf("请输入语文成绩:"); scanf("%s",pNodeScore->data.Chinese); printf("请输入英语成绩:"); scanf("%s",pNodeScore->data.English); printf("请输入高数成绩:"); scanf("%s",pNodeScore->data.Math); if(headScore==NULL) {//如果头结点为空 headScore=pNodeScore; pNodeScore->next=NULL; } else {//如果头结点不为空 pNodeScore->next=headScore; headScore=pNodeScore;//将头结点新结点 }}voidInput(){ intn,i; printf("输入几个学生的数据:"); scanf("%d",&n); for(i=0;i<n;i++) Add(); printf("输入成功!");}intDelete(){ p_node_scorepNodeScore,p1;//p1为pNodeScore的前驱p1=headScore; if(p1==NULL) { printf("成绩表中没有数据!请先添加数据!\n"); return0; } charDeleteNumber[20];printf("请数入要删除的学生学号:"); scanf("%s",DeleteNumber); if(strcmp(p1->data.Number,DeleteNumber)==0) {//如果要删除的结点在第一个 headScore=p1->next;pNodeScore=p1; printf("学号为%s的学生信息已经删除!\n",DeleteNumber); return0; } else { pNodeScore=p1->next;while(pNodeScore!=NULL) { if(strcmp(pNodeScore->data.Number,DeleteNumber)==0) { p1->next=pNodeScore->next; printf("学号为%s的学生信息已经删除!\n",DeleteNumber); return0; } else {//否则,结点向下一个,p1仍为pNodeScore的前驱 p1=pNodeScore; pNodeScore=pNodeScore->next; } } } printf("没有此学号的学生!");}intChange(){p_node_scorepNodeScore;pNodeScore=headScore; if(pNodeScore==NULL) { printf("成绩表中没有数据!请先添加数据!\n"); return0; } charEditNumber[20]; printf("请输入你要修改的学生学号:"); scanf("%s",EditNumber); while(pNodeScore!=NULL) { if(strcmp(pNodeScore->data.Number,EditNumber)==0) {//用strcmp比较两字符串是否相等,相等则返回0 printf("原来的学生成绩信息如下:\n");//输出原来的成绩信息printf("学号|姓名|语文成绩|英语成绩|高数成绩\n"); PrintScore(pNodeScore->data); printf("语文新成绩:");scanf("%s",pNodeScore->data.Chinese);printf("英语新成绩:");scanf("%s",pNodeScore->data.English); printf("高数新成绩:");scanf("%s",pNodeScore->data.Math); printf("成绩已经修改!"); return0; } pNodeScore=pNodeScore->next;//如果不相等,pNodeScore则指向下一个结点 } printf("没有此学号的学生!\n");//如果找到最后都没有,则输出没有此学号的学生 }intFind(){p_node_scorepNodeScore;pNodeScore=headScore; if(pNodeScore==NULL) { printf("成绩表中没有数据!请先添加数据!\n"); return0; } charFindNumber[20]; printf("请输入你要查找的学生学号:"); scanf("%s",FindNumber); while(pNodeScore!=NULL) { if(strcmp(pNodeScore->data.Number,FindNumber)==0) { printf("你要查找的学生成绩信息如下:\n");printf("学号|姓名|语文成绩|英语成绩|高数成绩\n"); PrintScore(pNodeScore->data); return0; } pNodeScore=p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《肺细胞病理学》课件
- 《用图表展示数据》课件
- 广东省汕尾市海丰县2023-2024学年八年级上学期期末考试数学试卷
- 《胃造瘘护理》课件
- 养老院老人健康监测人员激励制度
- 拆除太阳能热水器的协议书(2篇)
- 2024年塔吊租赁合同及施工安全协议3篇
- 2025年郑州货车从业资格考试题库
- 2025年黑河货运从业资格证考试
- 《HELLP综合征与HUS》课件
- GB/T 6403.3-2008滚花
- GB/T 36195-2018畜禽粪便无害化处理技术规范
- GB/T 19504-2008地理标志产品贺兰山东麓葡萄酒
- GB/T 1934.2-2009木材湿胀性测定方法
- GB/T 19068.2-2017小型风力发电机组第2部分:试验方法
- GB 14866-2006个人用眼护具技术要求
- 红色中国风春节习俗传统文化小年PPT模板
- 死婴死胎无害化处置委托协议
- 2021-2022学年湖北省武汉市汉阳区部编版三年级上册期末质量监测语文试卷(原卷版)
- 广东新高考选科选科解读课件
- 项目总工岗位职责及考核细则
评论
0/150
提交评论