数据结构课程设计-散列法的研究大全

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计-散列法的研究大全
第一篇:数据结构课程设计-散列法的研究大全
学院:班级:完成人:姓指导教师:
数据结构课程设计
说明书
信息科学与工程学院计算机科学与技术名:学号:
山东科技大学 2013年12月25日
课程设计任务书
一、课程设计题目:散列法的实验研究
二、课程设计应解决的主要问题:
(1)数据元素的输入和输出(2)线性再散列法建立哈希表(3)二次探测再散列法建立哈希表(4)链地址法建立哈希表(5)线性再散列法进行数据查找(6)二次探测再散列法进行数据查找(7)链地址法进行数据查找(8)退出系统
三、任务发出日期: 2013-10-01 课程设计完成日期: 2013-12-
20
小组分工说明
小组编号 7 题目:散列法的实验研究小组分工情况:一人独立完成所有工作。

组长签字: 2013 年 12 月 31 日
指导教师对课程设计的评价
成绩:
指导教师签字:
年月日
目录
1.需求分析说明
2.概要设计说明
3.详细设计说明
4.调试分析
5.用户使用说明
6.课程设计总结
7.测试结果
8.参考书目
-3-4-5-7-8-10-10-12
需求分析说明
内部排序教学软件的总体功能要求:
散列法中,散列函数构造方法多种多样,同时对于同一散列函数解决冲突的方法也可以不同。

两者是影响查询算法性能的关键因素。

对于几种典型的散列函数构造方法,做实验观察,不同的解决冲突方法对查询性能的影响。

基本功能如下:
(1)界面友好,易与操作。

采用菜单方式进行选择。

(2)实现三种方法进行哈希表的构造。

包括线性再散列法、二次探测再散列法和链地址法。

(3)根据三种构造方法分别进行数据元素的查找,若查找成功,则同时输出探查/冲突次数。

以下是各功能模块的功能描述: 1.主函数模块
本模块的主要功能是初始化图形界面,调用各模块,实现功能。

2.构造哈希表子模块
本模块的主要功能是采用线性再散列法、二次探测再散列法、链地址法三种方法构造哈希表。

3.查找功能及输出子模块
本模块的主要功能是在采用线性再散列法、二次探测再散列法、链地址法三种方法构造哈希表后,采用相应的方法对键入的数据进行查找,并计算探查/冲突次数。

4.输入子模块
本模块的主要功能是从键盘中输入数据元素用于构造哈希表。

5.输出子模块
本模块的主要功能是将数据元素显示在屏幕上。

概要设计说明
模块调用图:
各种构造方法的哈希表数据类型定义为:typedef struct { int key;/*关键字*/ int si;/*插入成功时的次数*/ } HashTable1;/*哈希表线性探测再散列数据类型定义*/
typedef struct Ha { int elem;/*数据项*/ struct Ha *next2;/*指向下一个结点的指针*/ } HashTable2;/*哈希表链地址法数据类型定义*/
typedef struct { int elem[HashSize];/*表中储存数据元素的数组*/ int count;/*表中储存数据元素的个数*/ int size;/*哈希表的尺寸*/ } HashTable3;/*哈希表二次探测再散列法数据类型定义*/
#define HashSize 53 /*哈希表最大长度*/ int num;/*输入数据的个数*/
void GetIn(int *a)/*从键盘输入数据*/ void GetOut(int *a)/*在屏幕上输出数据*/ void CreateHashTable1(HashTable1 *H,int *a,int num)/*线性探测在散列哈希表*/ void SearchHash1(HashTable1 *h,int data)/*线性探测在散列法查找*/ void CreateHashTable2(HashTable2 *H,int *a,int num)/*哈希表链地址*/ int SearchHash2(HashTable2 *h,int data,int num)/*链地址法查找*/ void CreateHash3(HashTable3 *h,int *a,int num)/*二次探索表*/ int Collision(int p,int c)/*二次探测再散列法解决冲突*/ void SearchHash3(HashTable3 *h,int data)/*哈希表二次探索再散列查找*/ int system(const char *string)/*清屏*/
详细设计说明
1.主函数模块
首先构造三种类型的哈希表,并对哈希表进行初始化。

进入循环后在屏幕上输出相应的操作指示,然后通过输入0-8调用所选择的函数进行相应操作。

主函数代码如下:
int main(){ int data,i;HashTable1 hash1[HashSize];HashTable2 hash2[HashSize];HashTable3 * ha;/*定义三种类型的哈希表*/ ha=(HashTable3
*)malloc(sizeof(HashTable3));for(i=0;ielem[i]=0;ha->count=0;ha->size=HashSize;int a[HashSize];a[0]=0;while(1){ printf(“n ┏━━━━━━━━━━━━━━━┓ ”);printf(“n ┃ 欢迎使用本系统┃ ”);printf(“n ┏〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒┓”);printf(“n ┃★ ★ ★ ★ ★ ★散列法的实验研究★ ★ ★ ★ ★┃”);printf(“n ┃ 【1】.添加数据信息┃”);printf(“n ┃ 【2】.数据的输出┃”);printf(“n ┃ 【3】.建立哈希表(线性再散列)┃”);printf(“n ┃ 【4】.建立哈希表(二次探测再散列)┃”);printf(“n ┃ 【5】.建立哈希表(链地址法)┃”);printf(“n ┃ 【6】.线性再散列法查找┃”);printf(“n ┃ 【7】.二次探测再散列法查找┃”);printf(“n ┃ 【8】.链地址法查找┃”);printf(“n ┃ 【0】.退出程序┃”);printf(“n ┗〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒┛”);printf(“n”);printf(“n”);printf(“请输入一个任务选项>>>”);int x;scanf(“%d”,&x);switch(x){ case 1: /*调用输入函数,从键盘键入需要添加的数据*/ GetIn(a);break;case 2: /*若已有数据输入,则调用数据输出函数*/ if(a[0]==0)printf(“您还没有输入任何数据!n”);else GetOut(a);break;case 3: /*调用函数用线性再散列法构造哈希表*/ if(a[0]==0)printf(“您还没有输入任何数据!n”);else CreateHashTable1(hash1,a,num);break;case 4: /*调用函数用二次探测再散列法构造哈希表*/ if(a[0]==0)printf(“您还没有输入任何数据!n”);else CreateHash3(ha,a,num);break;case 5: /*调用函数用链地址法构造哈希表*/ if(a[0]==0)printf(“您还没有输入任何数据!n”);else CreateHashTable2(hash2,a,num);break;case 6: /*调用函数用线性再散列法查找*/ if(a[0]==0)printf(“您还没有输入任何数据!n”);else { printf(“");scanf(”%d“,&data);SearchHash1(hash1,data);} break;case 7: /*调用函数用二次探测再散列法查找*/ if(a[0]==0)printf(”您还没有输入任何数据!n“);else { printf(”“);scanf(”%d“,&data);SearchHash3(ha,data);} break;case 8: /*调用函数用链地址法查找*/ if(a[0]==0)printf(”您还
没有输入任何数据!n“);else {
printf(”“);scanf(”%d“,&data);SearchHash2(hash2,data,n um);} break;case 0: /*退出系统*/ exit(-1);break;
} getchar();printf(”n请按回车键返回n“);getchar();system(”cls“);/*清屏*/ } } 2.查找功能及输出子模块
根据题目要求,可将这个系统分为以下几个模块:
1.线性再散列法建立哈希表:构造哈希函数h(x)=h(key)%HashSize,当冲突发生时,地址增量di依次取1,2,···,HashSize-1自然数列,即di=1,2,···,HashSize-1。

代码如下:
void CreateHashTable1(HashTable1 *H,int *a,int num)//哈希表线性探测再散列 { int i,d,cnt;for(i=0;i
代码如下:
typedef struct { int elem[HashSize];/*表中储存数据元素的数组*/ int count;/*表中储存数据元素的个数*/ int size;/*哈希表的尺寸*/ } HashTable3;
int Collision(int p,int c)/*二次探测再散列法解决冲突*/ { int i,q;i=c/2+1;while(i < HashSize){ if(c%2==0)/*增量为正数时*/ { c++;q=(p+i*i)%HashSize;if(q>=0)return q;else i=c/2+1;} else /*增量为负数时*/ { q=(p-i*i)%HashSize;c++;if(q>=0)return q;else i=c/2+1;} } return(-1);}
void CreateHash3(HashTable3 *h,int *a,int num)//二次探测再散列构造哈希表 { int i,p=-1,c,pp;for(i=0;ielem[pp]!=0)/*发生冲突*/ { pp=Collision(p,c);c++;if(pp<0)/*冲突无法处理*/ { printf(”第%d 个记录无法解决冲突n“,i+1);continue;} } h->elem[pp]=a[i];h->count++;printf(”第%d个记录冲突次数为%dn“,i+1,c);} printf(”nn此哈希表容量为%d,当前表内存储的记录个数%d.n“,num,h->count);}
3.链地址法建立哈希表:将所有关键字为同义词的记录存储在同
一线性链表中。

在链表中插入位置可以为表头或表尾,也可以在中间,以保持同义词在同一线性链表中按关键字有序。

(本程序采用在表尾插入)
代码如下:
typedef struct Ha { int elem;/*数据项*/ struct Ha *next2;/*指向下一个结点的指针*/ } HashTable2;
void CreateHashTable2(HashTable2 *H,int *a,int num)// { int key,i;HashTable2 *q,*qq;q=NULL;for(i=0;ielem=a[i];/*添加到已存在的结点后面*/ q->next2=qq->next2;qq->next2=q;} else { q=(HashTable2*)malloc(sizeof(HashTable2));if(!q){ printf(”申请内存失败!请重新运行程序n“);exit(1);} q->elem=a[i];/*添加到首结点后面*/ q->next2=H[key].next2;H[key].next2=q;} } } printf(”链表探索哈希表已建成!n“);}
4.线性再散列法进行查找:根据线性再散列法的构造方式进行相应查找。

代码如下:
void SearchHash1(HashTable1 *h,int data){ int d,i;d=data%HashSize;/*哈希函数*/ i=d;if(h[d].key==data)/*一次查找成功*/ printf(”数字%d%dn“,h[d].key,h[d].si);else { while(i
5.二次探测再散列法进行查找:根据二次探测再散列法的构造方式进行相应查找。

代码如下:
void SearchHash3(HashTable3 *h,int data)//哈希表二次探索再散列查找{ int c=0,p,pp;p=data%HashSize;pp=p;while((h->elem[pp])!=data
&& pp!=-1){ pp=Collision(p,c);c++;} if((h->elem[pp]!=0)&&(h->elem[pp])==data)printf(”n查找成功!n查找冲突次数为%d.“,c);else printf(”n没有查到此数!n“);}
6.链地址法进行查找:根据链地址法的构造方式进行相应查找。

代码如下:
int SearchHash2(HashTable2 *h,int data,int num){ int
d,cnt=1;HashTable2 *q;d=data%HashSize;/*哈希函数*/ q=&h[d];if(q->elem==0)/*该位置上没有数据元素*/ { printf(”没有找到你要查找的那个数n“);return 0;} while(q!=NULL){ if(q->elem==data){ printf(”数字%d%dn“,data,cnt);return 0;} else if(q->next2!=NULL){ q=q->next2;cnt++;} else { printf(”没有找到你要查找的那个数n“);return 0;} } return 0;}
7.输入函数:从键盘中键入数据。

代码如下:
void GetIn(int *a){ //输入数据函数printf(”“);scanf(”%d“,&num);int i;for(i=0;i
8.输出函数:在屏幕上输出数据。

代码如下:
void GetOut(int *a){ int i;printf(”“);for(i=0;i
调试分析
我遇到的问题:
λ链地址法查找时,原设计在有冲突时表尾插入,写出的程序却是在表头进行插入。

在加入了一个判断语句和移动指针位置的语句后问题得到解决。

λ图形界面下输入数据λ在程序显示结果后无法返回界面0 在结果界面上增加一个按钮Restart,利用goto语句即可返回到界面0。

用户使用说明
运行程序时,首先进入主菜单界面:
根据需要,从0-8选项中选择进入相应模块的操作界面。

测试结果
测试数据:19,14,23,67,68,20,84,27,55,11,10,79 选择1进行数据信息的添加
返回后,选择3用线性再散列法建立哈希表
返回后,选择6进行线性再散列法查找,如查找19
返回后,选择4用线性再散列法建立哈希表
返回后,选择7进行二次探测再散列法查找,如查找67 若查找成功,可得到冲突次数。

返回后,选择5用链地址法建立哈希表
返回后,选择8进行二次探测再散列法查找,如查找67
最后,选择0可退出程序。

课程设计总结
通过这次数据结构课程设计,使我对计算机语言有了更深一层的了解,也使我对算法的运用有了更熟练的掌握,对算法和生活的联系也有了更多的体会。

更进一步了解和熟悉了关于哈希表的创建和运用。

现在,计算机领域只向我展现了冰山一角,以后我会继续探索。

好的算法源于我们不断的思考,思考源于我们对梦想的追寻。

书本上理论性的东西在实际应用中还是有一定的出入的,因此在这次数据结构设计中遇到了很多实际性的问题。

很多问题要不断的更正以前的错误思维。

通过这次设计,我懂得了学习的重要性,了解到理论知识与实践结合的重要意义。

学会了坚持、耐心和努力,这将为自己今后的学习和工作打下牢固的基础。

通过学习,对专业知识了解更多,学会如何把自己平时所学的东西应用到实际中。

一个人要完成所有的工作是非常困难和耗时的。

在以后的学习中我会更加注意各个方面的能力的协调发展,选择一两门技术进行深入研究,成为一个既可以统筹全局,又有一定技术专长的优秀的程序开发人员。

参考书目
[1] 数据结构(C语言版),严蔚敏,清华大学出版社[2] 数据结构题集(C语言版),严蔚敏,清华大学出版社 [3] C语言课程设计案例精编,郭翠英,中国水利出版社
第二篇:2012数据结构课程设计
数据结构
课程设计报告
题目:一元多项式计算专业:信息管理与信息系统班级:2012级普本班学号: 201201011367 姓名:左帅帅指导老师:郝慎学时间:
一、课程设计题目分析
本课程设计要求利用C语言或C++编写,本程序实现了一元多项式的加法、减法、乘法、除法运算等功能。

二、设计思路
本程序采用C语言来完成课程设计。

1、首先,利用顺序存储结构来构造两个存储多项式A(x)和 B(x)的结构。

2、然后把输入,加,减,乘,除运算分成五个主要的模块:实现多项式输入模块、实现加法的模块、实现减法的模块、实现乘法的模块、实现除法的模块。

3、然后各个模块里面还要分成若干种情况来考虑并通过函数的嵌套调用来实现其功能,尽量减少程序运行时错误的出现。

4、最后编写main()主函数以实现对多项式输入输出以及加、减、乘、除,调试程序并将不足的地方加以修改。

三、设计算法分析
1、相关函数说明:
(1)定义数据结构类型为线性表的链式存储结构类型变量
typedef struct Polynomial{}
(2)其他功能函数
插入函数void Insert(Polyn p,Polyn h)
比较函数int compare(Polyn a,Polyn b)
建立一元多项式函数Polyn Create(Polyn head,int m)
求解并建立多项式a+b,Polyn Add(Polyn pa,Polyn pb)
求解并建立多项式a-b,Polyn Subtract(Polyn pa,Polyn pb)2
求解并建立多项式a*b,Polyn Multiply(Polyn pa,Polyn pb)
求解并建立多项式a/b,void Device(Polyn pa,Polyn pb)
输出函数输出多项式,void Print(Polyn P)
销毁多项式函数释放内存,void Destroy(Polyn p)
主函数,void main()
2、主程序的流程基函数调用说明(1)typedef struct Polynomial {
float coef;
int expn;
struct Polynomial *next;} *Polyn,Polynomial;
在这个结构体变量中coef表示每一项前的系数,expn表示每一项的指数,polyn为结点指针类型,属于抽象数据类型通常由用户自行定义,Polynomial表示的是结构体中的数据对象名。

(2)当用户输入两个一元多项式的系数和指数后,建立链表,存储这两个多项式,主要说明如下:
Polyn CreatePolyn(Polyn head,int m)建立一个头指针为head、项数为m的一元多项式
p=head=(Polyn)malloc(sizeof(struct Polynomial));为输入的多项式申请足够的存储空间
p=(Polyn)malloc(sizeof(struct Polynomial));建立新结点以接收数据
Insert(p,head);调用Insert函数插入结点
这就建立一元多项式的关键步骤
(3)由于多项式的系数和指数都是随即输入的,所以根据要求需要对多项式按指数进行降幂排序。

在这个程序模块中,使用链表,根据对指数大小的比较,对各种情况进行处理,此处由于反复使用指针对各个结点进行定位,找到合适的位置再利用void Insert(Polyn p,Polyn h)进行插入操作。

(4)加、减、乘、除、的算法实现:在该程序中,最关键的一步是实现四则运算和输出,由于加减算法原则是一样,减法可通过系数为负的加法实现;对于乘除算法的大致流程都是:首先建立多项式a*b,a/b,然后使用链表存储所求出的乘积,商和余数。

这就实现了多项式计算模块的主要功能。

(5)另一个子函数是输出函数 PrintPolyn();
输出最终的结果,算法是将最后计算合并的链表逐个结点依次输出,便得到整链表,也就是最后的计算式计算结果。

由于考虑各个结点的指数情况不同,分别进行了判断处理。

四、程序新点
通过多次写程序,发现在程序在控制台运行时总是黑色的,本次
写程序就想着改变一下,于是经过查资料利用system(“Color E0”);可以函数解决,这里“E0,”E是控制台背景颜色,0是控制台输出字体颜色。

五、设计中遇到的问题及解决办法
首先是,由于此次课程设计里使用指针使用比较多,自己在指针多的时候易脑子混乱出错,对于此问题我是采取比较笨的办法在稿纸上写明白后开始进行 4
代码编写。

其次是,在写除法模块时比较复杂,自己通过查资料最后成功写出除法模块功能。

最后是,前期分析不足开始急于写代码,中途出现各种问题,算是给自己以后设计时的一个经验吧。

六、测试(程序截图)
1.数据输入及主菜单
2.加法和减法模块
3.乘法和除法模块
七、总结
通过本次应用C语言设计一元多项式基本计算程序,使我更加巩固了C语言程序设计的知识,以前对指针这一点使用是比较模糊,现在通过此次课程设计对指针理解的比较深刻了。

而且对于数据结构的相关算法和函数的调用方面知识的加深。

本次的课程设计,一方面提高了自己独立思考处理问题的能力;另一方面使自己再设计开发程序方面有了一定的小经验和想法,对自己以后学习其他语言程序设计奠定了一定的基础。

八、指导老师评语及成绩
附录:(课程设计代码)
#include #include #include typedef struct Polynomial {
float coef;6
int expn;
struct Polynomial *next;} *Polyn,Polynomial;
//Polyn为结点指针类型 void Insert(Polyn p,Polyn h){
if(p->coef==0)free(p);
//系数为0的话释放结点
else
{
Polyn q1,q2;
q1=h;q2=h->next;
while(q2&&p->expnexpn)//查找插入位置
{
q1=q2;q2=q2->next;}
if(q2&&p->expn==q2->expn)//将指数相同相合并 {
q2->coef+=p->coef;
free(p);
if(!q2->coef)//系数为0的话释放结点
{ q1->next=q2->next;free(q2);}
}
else { p->next=q2;q1->next=p;
}//指数为新时将结点插入
} 7
} //建立一个头指针为head、项数为m的一元多项式Polyn Create(Polyn head,int m){
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i
{
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf(“请输入第%d项的系数与指数:”,i+1);
scanf(“%f %d”,&p->coef,&p->expn);
Insert(p,head);
//调用Insert函数插入结点
}
return head;} //销毁多项式p void Destroy(Polyn p){
Polyn q1,q2;
q1=p->next;8
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;//指针后移
q2=q2->next;
} } //输出多项式p int Print(Polyn P){
Polyn q=P->next;
int flag=1;//项数计数器
if(!q)//若多项式为空,输出0
{
putchar('0');
printf(“n”);
return;
}
while(q)
{
if(q->coef>0&&flag!=1)putchar('+');//系数大于0且不是第一项 9
if(q->coef!=1&&q->coef!=-1)//系数非1或-1的普通情况
{
printf(“%g”,q->coef);
if(q->expn==1)putchar('X');
else if(q->expn)printf(“X^%d”,q->expn);
}
else
{
if(q->coef==1){
if(!q->expn)putchar('1');
else if(q->expn==1)putchar('X');
else printf(“X^%d”,q->expn);}
if(q->coef==-1){
if(!q->expn)printf(“-1”);
else if(q->expn==1)printf(“-X”);
else printf(“-X^%d”,q->expn);}
}
q=q->next;
flag++;
}
printf(“n”);} int compare(Polyn a,Polyn b){
if(a&&b)
{
if(!b||a->expn>b->expn)return 1;
else if(!a||a->expnexpn)return-1;
else return 0;
}
else if(!a&&b)return-1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空 } //求解并建立多项式a+b,返回其头指针 Polyn Add(Polyn pa,Polyn pb){ Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点 11
hc->next=NULL;
headc=hc;
while(qa||qb){
qc=(Polyn)malloc(sizeof(struct Polynomial)); switch(compare(qa,qb))
{
case 1:
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
case 0:
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
case-1:
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;12
}
if(qc->coef!=0)
{
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
else free(qc);//当相加系数为0时,释放该结点
}
return headc;} //求解并建立多项式a-b,返回其头指针Polyn Subtract(Polyn pa,Polyn pb){
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
while(p)//将pb的系数取反
{ p->coef*=-1;p=p->next;}
pd=Add(pa,h);
for(p=h->next;p;p=p->next)
//恢复pb的系数
p->coef*=-1;13
return pd;} //求解并建立多项式a*b,返回其头指针Polyn Multiply(Polyn pa,Polyn pb){
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next)
{
for(qb=pb->next;qb;qb=qb->next)
{
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
return hf;}
//求解并建立多项式a/b,返回其头指针void Device(Polyn pa,Polyn pb){
Polyn hf,pf,temp1,temp2;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储商
hf->next=NULL;
pf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储余数
pf->next=NULL;
temp1=(Polyn)malloc(sizeof(struct Polynomial));
temp1->next=NULL;
temp2=(Polyn)malloc(sizeof(struct Polynomial));
temp2->next=NULL;
temp1=Add(temp1,pa);
while(qa!=NULL&&qa->expn>=qb->expn)
{
temp2->next=(Polyn)malloc(sizeof(struct Polynomial));
temp2->next->coef=(qa->coef)/(qb->coef);
temp2->next->expn=(qa->expn)-(qb->expn);
Insert(temp2->next,hf);
pa=Subtract(pa,Multiply(pb,temp2));15
qa=pa->next;
temp2->next=NULL;
}
pf=Subtract(temp1,Multiply(hf,pb));
pb=temp1;
printf(“商是:”);
Print(hf);
printf(“余数是:”);
Print(pf);} void main(){ int choose=1;int m,n,flag=0;system(“Color E0”);Polyn pa=0,pb=0,pc,pd,pf;//定义各式的头指针,pa与pb在使用前付初值NULL printf(“请输入A(x)的项数:”);scanf(“%d”,&m);printf(“n”);pa=Create(pa,m);//建立多项式A printf(“n”);printf(“请输入B(x)的项数:”);16 scanf(“%d”,&n);printf(“n”);pb=Create(pb,n);//建立多项式B
printf(“n”);printf(“********************************************* *n”);printf(“*
多项式操作菜单
printf(”**********************************************n“);pri ntf(”tt 1.输出操作n“);printf(”tt 2.加法操作n“);printf(”tt 3.减法操作n“);printf(”tt 4.乘法操作n“);printf(”tt 5.除法操作n“);printf(”tt 6.退出操作n“);printf(”**********************************************n“);wh ile(choose){
printf(”执行操作:“);
scanf(”%d“,&flag);
switch(flag)
{
case 1:
printf(”多项式A(x):“);Print(pa);*n”);
printf(“多项式B(x):”);Print(pb);
break;
case 2:
pc=Add(pa,pb);
printf(“多项式A(x)+B(x):”);Print(pc);
Destroy(pc);break;
case 3:
pd=Subtract(pa,pb);
printf(“多项式A(x)-B(x):”);Print(pd);
Destroy(pd);break;
case 4:
pf=Multiply(pa,pb);
printf(“多项式A(x)*B(x):”);
Print(pf);
Destroy(pf);
break;
case 5:
Device(pa,pb);18
break;
case 6:
exit(0);
break;
} }
Destroy(pa);
Destroy(pb);}
第三篇:数据结构课程设计
数据结构课程设计
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<=m;k++){
if(k<=n)
{
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<=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
{
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<=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
%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<=m;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”,);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->d ata.Number);printf(“请输
入姓名:”);scanf(“%s”,pNodeScore->);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;}
运行界面如下:
第四篇:课程设计(数据结构)。

相关文档
最新文档