数据结构课程设计报告.docx

上传人:b****6 文档编号:5879831 上传时间:2023-01-01 格式:DOCX 页数:27 大小:147.27KB
下载 相关 举报
数据结构课程设计报告.docx_第1页
第1页 / 共27页
数据结构课程设计报告.docx_第2页
第2页 / 共27页
数据结构课程设计报告.docx_第3页
第3页 / 共27页
数据结构课程设计报告.docx_第4页
第4页 / 共27页
数据结构课程设计报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告.docx

《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(27页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告.docx

数据结构课程设计报告

西安郵電學院

数据结构课程设计报告

 

题目:

多项式相乘与魔王语言

系部名称

专业名称

班级

学号

学生姓名

指导教师

时间

2010年12月6日至2010年12月15日

一、 课程设计目的

通过对数据结构这门课一学期的学习,运用所学知识完成课程设计,进而掌握并巩固所学知识点,将所学真正与实际问题结合起来。

二、课程设计内容

1.多项式相乘

以动态单链表为存储结构,使用排序等操作实现多项式的乘法运算。

2.魔王语言

以栈和队列为数据结构,使用文件读写查找等操作,完成对魔王语言的解释。

三、需求分析(对所开发系统功能、性能的描述,想要实现的目标)

1.多项式相乘

应用该系统可以进行系数任意,指数任意的多项式相乘,在输入过程中还可以进行多项式相同指数项的合并,输出时按降幂排列。

2.魔王语言

应用该系统可以对魔王所说的话进行翻译,事先要建立好rule与mean文件,用来存放转换规则与对应意思,输入模块可任意输入魔王的语言,再通过转换与翻译模块将其语言翻译为人类语言。

四、概要设计

1.多项式相乘

主函数

 

合并函数

乘法运算函数

创建函数

打印函数

排序函数

 

创建函数:

用来创建多项式。

乘法运算函数:

用来进行多项是相乘的运算。

合并函数:

用来将相乘后所得多项式合并同类项。

排序函数:

将合并后的多项式暗降幂排列。

打印函数:

将最初输入的多项式与最终输出的多项式打印出来。

2.魔王语言

主函数

 

字母转换函数

翻译函数

主体函数

打印规则2函数

打印规则1函数

去括号函数

写入函数

读规则2函数

读规则1函数

 

读规则1函数:

读取规则1。

读规则2函数:

读取规则2。

写入函数:

将魔王所说的话写入文件并保存。

去括号函数:

将魔王所说话中的括号按要求去掉。

翻译函数:

将魔王所说的话翻译为人类语言。

字母转换函数:

将大写字母转换为小写字母。

打印规则1函数:

将规则1打印出来。

打印规则2函数:

将规则2打印出来。

主体函数:

与主函数共同调用模块。

五、详细设计及运行结果(流程图,函数之间相互调用的图示,程序设计及编码,运行结果)

1.多项式相乘

/*乘法运算函数*/

开始

 

L=head

 

p=polya->next;

 

p!

=NULL;

q=polyb->next;

q!

=NULL

 

r=(Polylist)malloc(sizeof(Polynode));

r->coef=p->coef*q->coef;r->exp=p->exp+q->exp;

L->next=r;L=r;

 

q=q->next;

 

p=p->next;

 

L->next=NULL;

 

结束

 

/*合并函数*/

开始

 

r=L

 

r->next!

=NULL;

a=r->next->exp;p=r->next;

 

p->next!

=NULL;

b=p->next->exp;

a==b

temp1=(Polylist)malloc(sizeof(Polynode));

r->next->coef=r->next->coef+p->next->coef;temp1=p->next;p->next=temp1->next;free(temp1);

 

p=p->next;

 

r->next->coef==0

temp2=(Polylist)malloc(sizeof(Polynode));

temp2=r->next;r->next=temp2->next;

free(temp2);

 

r=r->next

 

结束

 

/*排序函数*/

 

开始

 

r=L->next;

 

r!

=NULL;

 

p=r->next;

 

p!

=NULL;

 

(r->exp)<(p->exp)

 

a=r->exp;r->exp=p->exp;

p->exp=a;b2=p->coef;

p->coef=r->coef;r->coef=b2;

结束

r=r->next

p=p->next

 

运行结果:

 

2.魔王语言

/*去括号函数*/

开始

 

i=0;

 

i

a[i]==')'

PoP(S1,&e);

 

S1->next->data!

='('

 

EnterQueue(Q,e);PoP(S1,&e);

 

c=e;PoP(S1,&k);

Q->rear!

=Q->front

Push(S1,c);DeleteQueue(Q,&e);Push(S1,e);

Push(S1,c);

 

Push(S1,a[i]);

 

i++

结束

 

开始

/*大小写转换函数*/

S1->next!

=NULL

PoP(S1,&x);

x>='a'&&x<='z'

Push(S,x);

 

x>='A'&&x<='Z'

是i=0

i<26;

x==P[i]->next->element

是r=P[i]->next->next

r!

=NULL;

r=r->next

r->element>='a'&&r->element<='z'

 

Push(S3,r->element);

r->element>='A'&&r->element<='Z'

break;

i++

结束

 

/*翻译*/

开始

 

S2->next!

=NULL

PoP(S2,&e);mn[i]=e;i++;

 

save(mn,S);

i=0

i

r=S->next;

 

r!

=NULL

r->element==mn[i]

 

printf("%s",r->chinese);break;

 

r=r->next;

 

i++

 

结束

 

运行结果:

六、调试情况,设计技巧及体会

1.在本次课程设计中,虽然可以按照要求完成,但在某些设计上较为繁琐,可以加以修改,让其更加精简完善。

2.此次课程设计,不仅是对所学数据结构知识的加以巩固,更是对自己动手能力的锻炼,将理论与实际真正结合起来,对以后要学习的专业知识也做好了一定的铺垫,对自己有一个较大的提升。

七、参考文献

《C语言程序设计》谭浩强清华大学出版社

《C语言程序设计》王曙燕等科学出版社

《数据结构——使用C语言》陈一华等电子科技大学出版社

《数据结构题集》严蔚敏吴伟民清华大学出版社

八、附录:

源代码

1.多项式相乘

#include"stdio.h"

#include"stdlib.h"

#include"math.h"

typedefstructPolynode

{

intcoef;/*系数*/

intexp;/*指数*/

structPolynode*next;

}Polynode,*Polylist;

/*创建函数*/

voidpolycreate(Polylisthead)

{

Polylistrear,s;

intc,e;

rear=head;/*rear始终指向但链表的尾,便于尾插法进行建表*/

printf("请输入每一项的系数和指数:

\n");

scanf("%d,%d",&c,&e);

while(c!

=0)

{

s=(Polylist)malloc(sizeof(Polynode));

s->next=NULL;

s->coef=c;

s->exp=e;

rear->next=s;/*尾插法进行创建*/

rear=s;

scanf("%d,%d",&c,&e);

}

printf("建立结束!

\n");

}

/*乘法运算函数*/

voidcheng(Polylistpolya,Polylistpolyb,Polylisthead)

{

Polylistp,q,r,L;

L=head;

for(p=polya->next;p!

=NULL;p=p->next)

for(q=polyb->next;q!

=NULL;q=q->next)

{

r=(Polylist)malloc(sizeof(Polynode));

r->coef=p->coef*q->coef;

r->exp=p->exp+q->exp;

L->next=r;L=r;

}

L->next=NULL;

}

/*合并函数*/

voidcombine(PolylistL)

{

Polylistr,p,temp1,temp2;

inta,b;

for(r=L;r->next!

=NULL;r=r->next)

{

a=r->next->exp;p=r->next;/*r指向第一个元素的指数*/

while(p->next!

=NULL)

{

b=p->next->exp;/*指向第二个元素的指数*/

if(a==b)

{

temp1=(Polylist)malloc(sizeof(Polynode));

r->next->coef=r->next->coef+p->next->coef;

temp1=p->next;/*合并后删掉后面一项*/

p->next=temp1->next;free(temp1);/*指针后移*/

}

elsep=p->next;

}

if(r->next->coef==0)/*若系数为0,则删除该结点*/

{

temp2=(Polylist)malloc(sizeof(Polynode));

temp2=r->next;r->next=temp2->next;free(temp2);

}

}

}

/*排序函数*/

voidorder(PolylistL)/*合并后的多项式中指数只存在大于和小于的关系*/

{

Polylistr,p;

inta;floatb2;

r=(Polylist)malloc(sizeof(Polynode));

p=(Polylist)malloc(sizeof(Polynode));

for(r=L->next;r!

=NULL;r=r->next)

for(p=r->next;p!

=NULL;p=p->next)/*按从大到小的顺序排列*/

if((r->exp)<(p->exp))

{

a=r->exp;

r->exp=p->exp;/*交换指数*/

p->exp=a;

b2=p->coef;/*交换系数*/

p->coef=r->coef;

r->coef=b2;

}

}

/*打印函数*/

voidprintf1(PolylistS)

{

Polylistr;

for(r=S->next;r;r=r->next)

{

if(r->coef<0)

printf("%dx^%d",r->coef,r->exp);

else

printf("%dx^%d",r->coef,r->exp);

if(r->next&&r->next->coef>0)printf("+");

}

}

/*主函数*/

voidmain()

{

charflag='a';

Polylisthead,polya,polyb;

head=(Polylist)malloc(sizeof(Polynode));head->next=NULL;

polya=(Polylist)malloc(sizeof(Polynode));polya->next=NULL;

polyb=(Polylist)malloc(sizeof(Polynode));polyb->next=NULL;

while(flag=='a')

{

printf("\n创建第一个多项式\n");

polycreate(polya);

order(polya);

combine(polya);

printf1(polya);

printf("\n创建第二个多项式\n");

polycreate(polyb);

order(polyb);

combine(polyb);

printf1(polyb);

printf("\n");

printf("\n输出多项式相乘\n");

printf("(");printf1(polya);printf(")");

printf("*");printf("(");order(polyb);printf1(polyb);printf(")");

printf("=");cheng(polya,polyb,head);

combine(head);order(head);printf1(head);

flushall();

printf("\n需要继续进行多项式相乘运算吗?

需要请按a键,否则任意其他键退出\n");

scanf("%c",&flag);

}

}

2.魔王语言

#include"stdio.h"

#include"string.h"

#include"stdlib.h"

#include"conio.h"

#defineMAX100

typedefstructnode

{

chardata;

structnode*next;

}LinkStackNode,*LinkStack;

typedefstructNode

{

chardata;

structNode*next;

}LinkQueueNode;

typedefstruct

{

LinkQueueNode*front;

LinkQueueNode*rear;

}LinkQueue;

structpers

{

charelement;

charchinese[50];

structpers*next;

};

voidPush(LinkStacktop,charx)/*头插法*/

{

LinkStacktemp;

temp=(LinkStack)malloc(sizeof(LinkStackNode));

temp->data=x;

temp->next=top->next;

top->next=temp;

}

voidPoP(LinkStacktop,char*x)

{

LinkStacktemp;

temp=top->next;

top->next=temp->next;

*x=temp->data;

free(temp);

}

voidEnterQueue(LinkQueue*Q,charx)/*尾插法*/

{

LinkQueueNode*NewNode;/*队列的结点*/

NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));

if(NewNode!

=NULL)

{

NewNode->data=x;

NewNode->next=NULL;

Q->rear->next=NewNode;

Q->rear=NewNode;

}

}

voidDeleteQueue(LinkQueue*Q,char*x)

{

LinkQueueNode*p;

p=Q->front->next;

Q->front->next=p->next;

if(Q->rear==p)Q->rear=Q->front;

*x=p->data;

free(p);

}

/*读规则1函数*/

voidread1(structpers*P[26])

{

FILE*fp;

inti;

charx;

if((fp=fopen("H:

\\课程设计\\quying\\rule.txt","rt"))==NULL)

{

printf("\n\n****读规则文件出错,按任意键返回!

****");

getchar();

exit

(1);

}

while(!

feof(fp))

{

for(i=0;i<26;i++)

{

structpers*r,*p;

P[i]=(structpers*)malloc(sizeof(structpers));

p=P[i];

fscanf(fp,"%c",&x);

while(x!

='#')

{

r=(structpers*)malloc(sizeof(structpers));

r->element=x;

p->next=r;

p=r;

fscanf(fp,"%c",&x);

}

p->next=NULL;

}

}

fclose(fp);

printf("\n\n****文件1中信息已正确读出,按任意键继续!

****\n");

getchar();

}

/*读规则2函数*/

voidread2(structpers*S)

{

FILE*fp;

structpers*r,*head;

inti=0;

head=S;

if((fp=fopen("H:

\\课程设计\\quying\\mean.txt","rt"))==NULL)

{

printf("\n\n****读翻译文件出错,按任意键返回****");

getchar();

exit

(1);

}

while(i<26)/*文件未读取完*/

{

r=(structpers*)malloc(sizeof(structpers));

fscanf(fp,"%c",&r->element);

fscanf(fp,"%s",r->chinese);i++;

head->next=r;

head=r;

}

head->next=NULL;

fclose(fp);

printf("\n\n****文件2中信息已正确读出,按任意键继续!

****\n");

getchar();

}

/*写入函数*/

voidsave(charch[MAX],structpers*S)

{

FILE*fp;

structpers*r;

inti=0,l;

if((fp=fopen("H:

\\课程设计\\quying\\results.txt","at+"))==NULL)/*可追加读入*/

{

printf("写文件出错,按任意键返回");

getchar();

exit

(1);

}

l=strlen(ch);

for(i=0;i

fprintf(fp,"%c",ch[i]);

for(i=0;i

{

r=S->next;

while(r!

=NULL)

if(r->element==ch[i])/*找到该字母的汉语意思,输出*/

{

fprintf(fp,"%s",r->chinese);

break;

}

elser=r->next;

}

printf("恭喜您保存成功,按任意键继续!

\n");

getchar();

fclose(fp);

}

/*去括号函数*/

voidchange(chara[50],LinkStackS1,LinkQueue*Q,intl)

{

inti;

charc,e,k;

for(i=0;i

if(a[i]==')')/*遇到右括号出栈*/

{

PoP(S1,&e);

while(S1->next->data!

='(')/*S1有头指针*/

{

EnterQueue(Q,e);

PoP(S1,&e);

}

c=e;/*标记首字母*/

PoP(S1,&k);/*去掉左括号*/

while(Q->rear!

=Q->front)

{

Push(S1,c);

DeleteQueue(Q,&e);

Push(S1,e);

}

Push(S1,c);

}

elsePush(S1,a[i]);

}

/*利用递归进行大小写代换*/

voidexchange(charx,structpers*P[26],LinkStackS3)

{

inti;

structpers*r;

r=(structpers*)malloc(sizeof(structpers));r->next=NULL;

for(i=0;i<26;i++)

if(x==P[i]->next->element)

{

for(r=P[i]->next->next;r!

=NULL;r=r->next)

if(r->element>='a'&&r->element<='z')

Push(S3,r->element);

elseif(r->element>='A'&&r->element<='Z')

exchange(r->element,P,S3);

break;

}

}

/*大小写代换,大写字母调用exchange函数*/

voidtranslate(LinkStackS1,LinkStackS,structpers*P[26])

{

charx,m;

LinkStackS3;

S3=(LinkStack)malloc(sizeof(LinkStackNode));S3->next=NULL;

while(S1->next!

=NULL)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1