数据结构-实验一-一元多项式相加精品
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【关键字】情况、空间、运行、继续、掌握、信心、工程、能力、结构、坚持、巩固、实现、核心、耐心
数据结构实验报告
实验一:一元多项式相加
姓名:周成
学号:
专业:软件工程
任课教师:马慧珠
2013年12 月01 日
1.实验名称:
一元多项式相加
2.实验目的:
如何使用C语言实现链表的说明、创建以及结点的插入和删除等操作。
3.实验要求:
对一元多项式能实现输入、输出,以及两个一元多项式相加及结果显示。
4.实验内容:
一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。
它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。
根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。
核心算法PolyAdd是把分别由pa和pb所指的两个多项式相加,结果为pa所指的多项式。
运算规则如下:相加时,首先设两个指针变量qa和qb分别从多项式的首项开始扫描,比较qa和qb所指结点指数域的值,可能出现下列三种情况之一:
(1)qa->exp大于qb->exp,则qa继续向后扫描。
(2)qa->exp等于qb->exp,则将其系数相加。
若相加结果不为零,将结果放入qa->coef中,并删除qb所指结点,否则同时删除qa和qb所指结点。
然后qa、qb继续向后扫描。
(3)qa->exp小于qb->exp,则将qb所指结点插入qa所指结点之前,然后qa、qb继续向后扫描。
扫描过程一直进行到qa或qb有一个为空为止,然后将有剩余结点的链表接在结果表上。
所得pa指向的链表即为两个多项式之和。
5.实验程序代码及运行结果:
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<stdio.h>
#define NULL 0
typedef struct NODE
{
float coef; //系¦Ì数ºy
int expn; //指?数ºy
struct NODE *next;
}NODE;
NODE *Creat(int n);
void print(NODE *head);
NODE *AddPolyn(NODE *head1, NODE *head2);
NODE *Delfirst(NODE *head, NODE *q);
void InsertBefore(NODE *p1, NODE *p2);
int compare(int a, int b);
/*创ä¡ä建¡§链¢¡ä表À¨ª*/
NODE *Creat(int n)
{
NODE *current, *previous, *head;
int i;
head = (NODE *)malloc(sizeof(NODE)); /*创ä¡ä建¡§头ª¡¤结¨¢点Ì?*/
previous = head;
for(i = 0; i < n; i++)
{
current = (NODE *)malloc(sizeof(NODE));
printf("请?输º?入¨?系¦Ì数ºy和¨ª指?数ºy : ");
scanf("%f%d", ¤t->coef, ¤t->expn);
previous->next = current;
previous = current;
}
previous->next = NULL;
return head;
}
/*一°?元a多¨¤项?式º?的Ì?想?加¨®,ê?总Á¨¹体¬?考?虑?,ê?可¨¦分¤?qa的Ì?指?数ºy比À¨¨qb小?,ê?或¨°等̨¨于®¨²pb(如¨?果?系¦Ì数ºy相¨¤加¨®等̨¨于®¨²0和¨ª不?等̨¨于®¨²0),或¨°大䨮于®¨²pb
里¤?面?由®¨¦InsertBefore和¨ªDelfirst两¢?个?小?模¡ê块¨¦组Á¨¦成¨¦一°?部?分¤?*/ NODE *AddPolyn(NODE *head1, NODE *head2)
{
NODE *ha, *hb, *qa, *qb;
int a, b;
float sum;
ha = head1; /*ha和¨ªhb指?向¨°头ª¡¤结¨¢点Ì?*/
hb = head2;
qa = ha->next; /*qa和¨ªqb指?向¨°头ª¡¤结¨¢点Ì?的Ì?下?一°?个?结¨¢点Ì?*/
qb = hb->next;
while(qa && qb) /*qa和¨ªqb均¨´非¤?空?*/
{
a = qa->expn;
b = qb->expn;
switch(compare(a, b)) {
case -1 : /*qa->expn < qb->expn*/
ha = qa;
qa = qa->next;
break;
case 0 :
sum = qa->coef + qb->coef; /*系¦Ì数ºy的Ì?和¨ª*/
if(sum != 0.0) { /*如¨?果?不?是º?0.0*/
qa->coef = sum; /*改?变À?系¦Ì数ºy*/
ha = qa;
}else
{
free(Delfirst(ha, qa));
}
free(Delfirst(hb, qb));
qa = ha->next;
qb = hb->next; /*qb释º¨ª放¤?后¨®要°a重?新?赋3值¦Ì*/ break;
case 1 : /*如¨?果?qa-> expn > qb -> expn*/
Delfirst(hb, qb);
InsertBefore(ha, qb); /*把ã?qb插?入¨?到Ì?ha下?一°?个?结¨¢点Ì?之?前¡ã*/
qb = hb->next;
ha = ha->next;
break;
}
}
if(qb)
ha->next = qb; /*插?入¨?剩º¡ê余®¨¤的Ì?pb*/
free(head2);
return head1;
}
/*比À¨¨较?*/
int compare(int a, int b)
{
if(a < b)
return -1;
else if(a > b)
return 1;
else
return 0;
}
/*删¦?除y结¨¢点Ì?q*/
NODE *Delfirst(NODE *p1, NODE *q)
{
p1 -> next = q -> next;
return (q);
}
/*插?入¨?结¨¢点Ì?,引°y入¨?结¨¢点Ì?p,可¨¦以°?让¨?p插?入¨?到Ì?p2和¨ªp1之?间?*/ void InsertBefore(NODE *p1, NODE *p2)
{
NODE *p;
p = p1->next;
p1->next = p2;
p2->next = p;
}
/*打䨰印®?,为a了¢?美¨¤观?程¨¬序¨°分¤?开a打䨰印®?*/
void print(NODE *head)
{
NODE *current;
current = head->next;
while(current->next != NULL)
{
printf("%0.f * x^%d + ", current->coef, current->expn);
current = current -> next;
}
printf("%0.f * x^%d", current->coef, current->expn);
//system(ꡧ"pause");
}
int main()
{
NODE *head1, *head2, *head3;
int n1, n2;
printf("请?输º?入¨?你?需¨¨要°a的Ì?多¨¤项?式º?的Ì?项?数ºy n1 : ");
scanf("%d", &n1);
head1 = Creat(n1);
printf("第̨²一°?个?多¨¤项?式º?的Ì?显?示º? : \n");
print(head1);
printf("\n请?输º?入¨?你?需¨¨要°a的Ì?多¨¤项?式º?的Ì?项?数ºy n2 : ");
scanf("%d", &n2);
head2 = Creat(n2);
printf("\n第̨²二t个?多¨¤项?式º?的Ì?显?示º? : \n");
print(head2);
head3 = AddPolyn(head1, head2);
printf("\n合?并¡é后¨®的Ì?多¨¤项?式º?的Ì?显?示º? : \n");
print(head3);
printf("\n");
}
运行结果:
实验数据1如图:输入一个四次二项式X^3+2X^4,一个五次二项式X^4+2X^5,输出如图:
实验数据2如图:输入一个五次四项式X^2+X^3+X^4+X^5,还有一个五次五项式1+X+X^3+2X^4+2X^5输出如图所示
实验数据3如图:输入一个七次三项式1+2x^5+3X^7,还有一个五次四项式1+2X^2+3X^4+4X^5,输出如图:
6.实验总结
本来我对编程很没有信心,做这样一个课程设计感觉有点吃力,虽然有些人觉得很简单,但是我还是坚持做下来了,我不断的看书,翻阅资料,询问同学,上网搜索,总算有模有样地把这个程序编的能运行了。
其次,这次编程是我更多地理解掌握了线性链表的逻辑机构和物理特性。
对
学过的知识有了很好的巩固。
困难还是很多的,比如初次运行的时候,好几十个错误,当时真的感到非常崩溃。
幸亏我没有放弃,才最终完成。
长舒一口气。
最后,通过这次编程,不仅仅考察了我对知识的掌握,更重要的是锻炼了我的思维能力和耐心,在最困难的时候没有放弃,今天才能如此舒心。