数据结构课程设计_第1页
数据结构课程设计_第2页
数据结构课程设计_第3页
数据结构课程设计_第4页
数据结构课程设计_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构课程设计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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论