数据结构课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据结构课程设计全”。
数据结构课程设计
1.赫夫曼编码器
设计一个利用赫夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。要求:
1)将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中)
2)初始化:键盘输入字符集大小26、26个字符和26个权值(统计一篇英文文章中26个字母),建立哈夫曼树;
3)编码:利用建好的哈夫曼树生成哈夫曼编码;
4)输出编码(首先实现屏幕输出,然后实现文件输出); 5)界面优化设计。
代码如下:
#include #include #include #include #define N 200
typedef struct HTNode
//结构体 { int Weight;
char ch;int Parent,Lchild,Rchild;}HTNode;typedef char * * HCode;
void Save(int n,HTNode *HT)
//把权值保存到文件 {
FILE * fp;
int i;
if((fp=fopen(“data.txt”,“wb”))==NULL)
{
printf(“cannot open filen”);
return;
}
for(i=0;i
if(fwrite(&HT[i].Weight,sizeof(struct HTNode),1,fp)!=1)
printf(“file write errorn”);
fclose(fp);
system(“cls”);
printf(“保存成功!”);
}
void Create_H(int n,int m,HTNode *HT)
//建立赫夫曼树,进行编码 {
int w,k,j;char c;for(k=1;k
if(k
{
printf(“n请输入权值和字符(用空格隔开): ”);
scanf(“%d”,&w);
scanf(“ %c”,&c);HT[k].ch=c;
HT[k].Weight=w;
}
else HT[k].Weight=0;
HT[k].Parent=HT[k].Lchild=HT[k].Rchild=0;}
int p1,p2,w1,w2;
for(k=n+1;k
p1=0;p2=0;
w1=32767;w2=32767;
for(j=1;j
{
if(HT[j].Parent==0)
{
if(HT[j].Weight
{
w2=w1;p2=p1;
w1=HT[j].Weight;
p1=j;
}
else if(HT[j].Weight
{
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(“输入成功!”);}
void Coding_H(int n,HTNode *HT)
//对结点进行译码 { int k,sp,fp,p;char *cd;HCode HC;
HC=(HCode)malloc((n+1)*sizeof(char *));
cd=(char *)malloc(n*sizeof(char));cd[n-1]=' ';
printf(“************************n”);printf(“Char Codingn”);
for(k=1;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
%sn”,HT[k].ch,HC[k]);
}
printf(“************************n”);free(cd);} void Read(int n,HTNode *HT)
//从文件中读出数据 {
int i;FILE * fp;if((fp=fopen(“data.txt”,“rb”))==NULL){
printf(“cannot open filen”);
exit(0);} for(i=0;i
fread(&HT[i].Weight,sizeof(struct HTNode),1,fp);// printf(“%d n”,HT[i].Weight);
} Coding_H(n,HT);
fclose(fp);}
void Print_H(int m,HTNode *HT)
//输出赫夫曼造树过程 { int k;printf(“************************n”);printf(“Num Weight
Par LCh RCh n”);for(k=1;k
printf(“%d ”,k);
printf(“
%d”,HT[k].Weight);
printf(“
%d”,HT[k].Parent);
printf(“
%d”,HT[k].Lchild);
printf(“
%dn”,HT[k].Rchild);
} printf(“************************n”);}
void Decode(int m,HTNode *HT)
//对输入的电文进行译码 { int i,j=0;char a[10];char endflag='2';i=m;printf(“输入发送的编码,以‘2’结束:”);scanf(“%s”,&a);printf(“译码后的字符:”);while(a[j]!='2'){
if(a[j]=='0')
i=HT[i].Lchild;
else i=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”);}
int main()
//主函数 { int n,m,c;HTNode HT[N];do {
system(“color 2f”);
//运行环境背景颜色.printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);
printf(“nttt 赫夫曼编译码系统 ttt”);
printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);
printf(“nttt1.输入权值、字母nttt2.把数据写入文件nttt3.输出赫夫曼编码表nttt”);
printf(“4.输出赫夫曼译码表nttt5.输入编码并译码.nttt6.从文件中读出数据nttt7.退出”);
printf(“nnttt请选择:”);
scanf(“%d”,&c);
switch(c)
{
case 1:system(“cls”);printf(“输入多少结点:”);
scanf(“%d”,&n);m=2*n-1;Create_H(n,m,HT);break;
case 2:system(“cls”);Save(n,HT);break;
case 3:system(“cls”);Print_H(m,HT);break;
case 4:system(“cls”);Coding_H(n,HT);break;
case 5:system(“cls”);Decode(m,HT);break;
case 6:system(“cls”);Read(n,HT);break;
case 7:system(“cls”);exit(0);
}
}while(1);return 0;}
运行界面如下:
2.学生成绩管理(链表实现)要求:
实现如下功能:增加、查找、删除、输出、退出。
代码如下:
#include #include #include typedef struct score
//定义成绩信息结构体 {
char Number[20];char Name[20];char Chinese[20];char English[20];char Math[20];}score;typedef struct node_score
//定义成绩信息链表结点,包括数据域和指针域 {
score data;struct node_score *next;}node_score,*p_node_score;p_node_score headScore;//定义链表的头指针为全局变量 void PrintScore(score s)//输出信息函数 { printf(“ %10s”,s.Number);printf(“ |
%-6s”,s.Name);printf(“
|
%-3s”,s.Chinese);printf(“
|
%-3s”,s.English);
printf(“ |
%-3sn”,s.Math);} void View()//输出函数 {
p_node_score pNodeScore;
pNodeScore=headScore;printf(“
学号
|
姓名
| 语文成绩
| 英语成绩| 高数成绩n”);while(pNodeScore!= NULL){
PrintScore(pNodeScore->data);//输出学生信息和成绩信息
pNodeScore=pNodeScore->next;} } void Add(){
p_node_score pNodeScore;// 定义一个节点
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;//将头结点新结点
} } void Input(){ int n,i;printf(“输入几个学生的数据:”);scanf(“%d”,&n);for(i=0;i
Add();printf(“输入成功!”);} int Delete(){ p_node_score pNodeScore,p1;//p1为pNodeScore的前驱
p1=headScore;if(p1==NULL){
printf(“成绩表中没有数据!请先添加数据!n”);
return 0;} char DeleteNumber[20];
printf(“请数入要删除的学生学号:”);scanf(“%s”,DeleteNumber);if(strcmp(p1->data.Number,DeleteNumber)==0)
{ //如果要删除的结点在第一个
headScore=p1->next;
pNodeScore=p1;
printf(“学号为%s的学生信息已经删除!n”,DeleteNumber);
return 0;} else
{
pNodeScore=p1->next;
while(pNodeScore!=NULL)
{
if(strcmp(pNodeScore->data.Number,DeleteNumber)==0)
{
p1->next=pNodeScore->next;
printf(“学号为%s的学生信息已经删除!n”,DeleteNumber);
return 0;
}
else
{ //否则,结点向下一个,p1仍为pNodeScore的前驱
p1=pNodeScore;
pNodeScore=pNodeScore->next;
}
} } printf(“没有此学号的学生!”);} int Change(){
p_node_score pNodeScore;
pNodeScore=headScore;if(pNodeScore==NULL){
printf(“成绩表中没有数据!请先添加数据!n”);
return 0;} char EditNumber[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(“成绩已经修改!”);
return 0;
}
pNodeScore=pNodeScore->next;//如果不相等,pNodeScore则指向下一个结点
} printf(“没有此学号的学生!n”);//如果找到最后都没有,则输出没有此学号的学生
} int Find(){
p_node_score pNodeScore;
pNodeScore=headScore;if(pNodeScore==NULL){
printf(“成绩表中没有数据!请先添加数据!n”);
return 0;} char FindNumber[20];printf(“请输入你要查找的学生学号:”);scanf(“%s”,FindNumber);while(pNodeScore!=NULL){
if(strcmp(pNodeScore->data.Number,FindNumber)==0)
{
printf(“你要查找的学生成绩信息如下:n”);
printf(“
学号
|
姓名
| 语文成绩
| 英语成绩| 高数成绩n”);
PrintScore(pNodeScore->data);
return 0;
}
pNodeScore=pNodeScore->next;} printf(“没有此学号的学生!n”);} int main()
//主函数 { int choice=0;headScore=NULL;int c;do {
system(“color 2f”);
//运行环境背景颜色.printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);
printf(“nttt 学生成绩管理系统 ttt”);
printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);
printf(“nttt1.输入成绩信息nttt2.输出成绩信息nttt3.添加成绩信息nttt”);
printf(“4.修改成绩信息nttt5.删除成绩信息nttt6.查询成绩信息nttt7.退出”);
printf(“nnttt请选择:”);
scanf(“%d”,&c);
switch(c)
{
case 1:system(“cls”);Input();break;
case 2:system(“cls”);View();break;
case 3:system(“cls”);Add();break;
case 4:system(“cls”);Change();break;
case 5:system(“cls”);Delete();break;
case 6:system(“cls”);Find();break;
case 7:system(“cls”);exit(0);
}
}while(1);return 0;}
运行界面如下: