数据结构课程设计_数据结构课程设计全

其他范文 时间:2020-02-28 02:58:54 收藏本文下载本文
【www.daodoc.com - 其他范文】

数据结构课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据结构课程设计全”。

数据结构课程设计

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;}

运行界面如下:

下载数据结构课程设计word格式文档
下载数据结构课程设计.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

    热门文章
      整站推荐
        点击下载本文