当前位置:文档之家› 数据结构-实验一-一元多项式相加精品

数据结构-实验一-一元多项式相加精品

数据结构-实验一-一元多项式相加精品
数据结构-实验一-一元多项式相加精品

【关键字】情况、空间、运行、继续、掌握、信心、工程、能力、结构、坚持、巩固、实现、核心、耐心

数据结构实验报告

实验一:一元多项式相加

姓名:周成

学号:

专业:软件工程

任课教师:马慧珠

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

#include

#include

#include

#define NULL 0

typedef struct NODE

{

float coef; //系|ì数oy

int expn; //指?数oy

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

/*创???建?§链¢??表à¨a*/

NODE *Creat(int n)

{

NODE *current, *previous, *head;

int i;

head = (NODE *)malloc(sizeof(NODE)); /*创???建?§头a?¤结¨¢点ì?*/

previous = head;

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

{

current = (NODE *)malloc(sizeof(NODE));

printf("请?输o?入¨?系|ì数oy和¨a指?数oy : ");

scanf("%f%d", ¤t->coef, ¤t->expn);

previous->next = current;

previous = current;

}

previous->next = NULL;

return head;

}

/*一°?元a多¨¤项?式o?的ì?想?加¨?,ê?总á¨1体??考?虑?,ê?可¨|分¤?qa的ì?指?数oy比ਨqb小?,ê?或¨°等쨨于?¨2pb(如¨?果?系|ì数oy相¨¤加¨?等쨨于?¨20和¨a不?等쨨于?¨20),或¨°大?¨?于?¨2pb

里¤?面?由?¨|InsertBefore和¨aDelfirst两¢?个?小?模?ê块¨|组á¨|成¨|一°?部?分¤?*/ NODE *AddPolyn(NODE *head1, NODE *head2)

{

NODE *ha, *hb, *qa, *qb;

int a, b;

float sum;

ha = head1; /*ha和¨ahb指?向¨°头a?¤结¨¢点ì?*/

hb = head2;

qa = ha->next; /*qa和¨aqb指?向¨°头a?¤结¨¢点ì?的ì?下?一°?个?结¨¢点ì?*/

qb = hb->next;

while(qa && qb) /*qa和¨aqb均¨′非¤?空?*/

{

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; /*系|ì数oy的ì?和¨a*/

if(sum != 0.0) { /*如¨?果?不?是o?0.0*/

qa->coef = sum; /*改?变à?系|ì数oy*/

ha = qa;

}else

{

free(Delfirst(ha, qa));

}

free(Delfirst(hb, qb));

qa = ha->next;

qb = hb->next; /*qb释o¨a放¤?后¨?要°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; /*插?入¨?剩o?ê余?¨¤的ì?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和¨ap1之?间?*/ 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("请?输o?入¨?你?需¨¨要°a的ì?多¨¤项?式o?的ì?项?数oy n1 : ");

scanf("%d", &n1);

head1 = Creat(n1);

printf("第ì¨2一°?个?多¨¤项?式o?的ì?显?示o? : \n");

print(head1);

printf("\n请?输o?入¨?你?需¨¨要°a的ì?多¨¤项?式o?的ì?项?数oy n2 : ");

scanf("%d", &n2);

head2 = Creat(n2);

printf("\n第ì¨2二t个?多¨¤项?式o?的ì?显?示o? : \n");

print(head2);

head3 = AddPolyn(head1, head2);

printf("\n合?并?é后¨?的ì?多¨¤项?式o?的ì?显?示o? : \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.实验总结

本来我对编程很没有信心,做这样一个课程设计感觉有点吃力,虽然有些人觉得很简单,但是我还是坚持做下来了,我不断的看书,翻阅资料,询问同学,上网搜索,总算有模有样地把这个程序编的能运行了。

其次,这次编程是我更多地理解掌握了线性链表的逻辑机构和物理特性。对

学过的知识有了很好的巩固。困难还是很多的,比如初次运行的时候,好几十个错误,当时真的感到非常崩溃。幸亏我没有放弃,才最终完成。长舒一口气。

最后,通过这次编程,不仅仅考察了我对知识的掌握,更重要的是锻炼了我的思维能力和耐心,在最困难的时候没有放弃,今天才能如此舒心。

相关主题
文本预览
相关文档 最新文档