数据结构-多项式相加

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

数据结构课程设计

2012年12月

班级:XXX

学号:XXX

姓名: XXX

指导教师:XXX

一元稀疏多项式计算器

【问题描述】

设计一个一元稀疏多项式简单计算器

【基本要求】

一元多项式简单计算器的基本功能是:

1,输入并建立多项式;

2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;

3,多项式a和b相加,建立多项式a+b;

4,多项式a和b相减,建立多项式a-b.

【算法设计思想】

①一般情况下的一元n次多项式可写成pn(x)=p1xe1+p2xe2+……+pmxem

其中,p1是指数为ei的项的非零系数,且满足0≦e1

((p1,e1),(p2,e2),……,(pm,em))便可惟一确定多项式pn(x)。

②用两个带表头结点的单链表分别存储两个多项式

③根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;

④只需要将第二个多项式的系数改为其相反数,然后根据一元多项式相加的运算规则便可以得到其相应的“差多项式”

【实现提示】

用带表头结点的单链表存储多项式。

【程序代码】

#include

#include

typedef struct node

{

float coef;

int expn;

struct node *next;

}Lnode, *polynmial;

void create(polynmial &L); //输入并建立多项式L

void display(polynmial L); //显示,输出多项式L

void sort(polynmial &L); //多项式L按指数排序

void reverse(polynmial &L); //逆置

void select(); //用户选择加减操作

void add(polynmial La, polynmial Lb, polynmial &Lc); //多项式La,Lb相加void subtract(polynmial La, polynmial Lb, polynmial &Ld); //多项式La减去Lb,结果给Ld

void create(polynmial &L) //输入并建立多项式L

{

int i, n;

static struct node *p;

scanf("%d", &n);

L = (struct node *)malloc (sizeof(struct node));

L->next = NULL;

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

{

p = (struct node *)malloc(sizeof(struct node));

scanf("%f %d", &p->coef, &p->expn);

p->next = L->next;

L->next = p;

}

}

void display(polynmial L)//显示,输出多项式L

{

struct node *p, *q;

int flag = 0;

int k = 0;

q = L->next;

while(q)

if(q->coef != 0)

k++;

q = q->next;

}

printf("%d, ", k);

p = L->next;

if(p->coef != 0)

{

printf("%.1f,%d, ", p->coef, p->expn);

flag++;

}

for(p = p->next; p; p = p->next)

{

if(p->coef != 0)

{

printf("%.1f,%d, ", p->coef, p->expn);

flag++;

}

}

if(flag == 0)

printf("%d\n", flag);

else

printf("\n");

}

void sort(polynmial &L)//多项式L按指数排序{

polynmial p, q, r, u;

p = L->next;

L->next = NULL;

while(p != NULL)

{

r = L;

q = L->next;

while((q != NULL) && (q->expn <= p->expn)) {

r = q;

q = q->next;

}

u = p->next;

r->next = p;

p->next = q;

p = u;

}

void reverse(polynmial &L)//逆置

{

polynmial H;

static struct node *p, *q, *s;

H = (struct node*)malloc(sizeof(struct node));

H->next = NULL;

p = (struct node*)malloc(sizeof(struct node));

s = L->next;

p->coef = s->coef;

p->expn = s->expn;

p->next = s->next;

while(s)

{

p->coef = s->coef;

p->expn = s->expn;

p->next = s->next;

q = H->next;

H->next = p;

p->next = q;

p = (struct node*)malloc(sizeof(struct node));

s = s->next;

}

p = H->next;

q = L->next;

while(p)

{

q->coef = p->coef;

q->expn = p->expn;

q = q->next;

p = p->next;

}

}

void select() //用户选择加减操作

{

printf("请选择加减操作\n");

printf("1.两个一元多项式相加\n");

printf("2.两个一元多项式相减\n");

}

void add(polynmial La, polynmial Lb, polynmial &Lc)//多项式La,Lb相加{

struct node *pa, *pb;

static struct node *pc;

Lc = (struct node*)malloc(sizeof(struct node));

相关文档
最新文档