数据结构 线性表的应用实验报告

实 验 报 告

课程名称 ____数据结构上机实验__________ 实验项目 ______线性表的应用 ____________ 实验仪器 ________PC机___________________

系 别_____电子信息与通信学院___

专 业________ ___

班级/学号______ __ 学生姓名 ______ ___________

实验日期 _______________________

成 绩 _______________________

指导教师 _______________________

实验一. 线性表的应用

1. 实验目的:掌握线性链表的存储、运算及应用。利用链表实现一元多项式计算。

2. 实验内容:

1) 编写函数,实现用链表结构建立多项式;

2) 编写函数,实现多项式的加法运算;

3) 编写函数,实现多项式的显示;

4) 测试:编写主函数,它定义并建立两个多项式,显示两个多项式,然后将它们相加并显示结果。变换测试用的多项式,检查程序的执行结果。

选做内容:修改程序,选择实现以下功能:

5) 多项式求值:编写一个函数,根据给定的x 值计算并返回多项式f(x)的值。测试该函数(从终端输入一个x 的值,调用该函数并显示返回结果)。

6) 多项式相减:编写一个函数,求两个多项式相减的多项式。

7) 多项式相乘:编写一个函数,求两个多项式的乘积多项式。

3. 算法说明:

1) 多项式的建立、显示和相加算法见讲义。可修改显示函数,使输出的多项式更符合表达规范。

2) 多项式减法:同次项的系数相减(缺项的系数是0)。

例如a(x)=-5x+2x+3,b(x)= -4x +3x,则a(x)-b(x) =4x-5x -x+3。提示:a(x)-b(x) = a(x)+(-b(x))。

3) 多项式乘法:两个多项式的相乘是“系数相乘,指数相加”。算法思想是用一个多项式中的各项分别与另一个多项式相乘,形成多个多项式,再将它们累加在一起。例如,a(x)=-5x+2x+3,b(x)=-4x+3x,则

32233223a(x)*b(x) 2= =

= (-4x)*(-5x+2x+3)+(3x)*(-5x+2x+3) (20x-8x -12x )

5432543+ (-15x+6x+9x) 3220x -8x -27x +6x+9x。

4. 实验步骤:

根据实验报告的要求,我对文件夹里的C 文件进行了丰富和修改,步骤如下:

链表结构建立多项式:

typedef struct polynode

{ float coef; //系数

int exp; //指数

struct polynode *next; //下一结点指针

} PNode;

编写函数,实现多项式的加法运算;

PNode * PolyAdd (PNode *f1, PNode *f2) //实现加法功能。 { //实现两多项式(头指针分别为f1和f2)相加,返回和

多项式f3=f1+f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*f3,*q; int exp; float coef; f3=(PNode *)malloc(sizeof(PNode)); //建立头指针 f3->exp=-1; //对头指针初始化

f3->next=f3;

pc=f3; //将pc 指向头指针

while (pa->exp!=-1 || pb->exp!=-1)

出循环

{

if (pa->exp>pb->exp)

{

exp=pa->exp;

coef=pa->coef;

pa=pa->next;

}

else if (pa->expexp)

{

exp=pb->exp;

coef=pb->coef;

pb=pb->next; // 返回头指针时,跳

} else { } exp=pa->exp; coef=pa->coef+pb->coef; pa=pa->next; pb=pb->next; if (coef!=0) { q=(PNode *)malloc(sizeof(PNode)); //建立新的q 指针存放负指数的指针

} } return f3; //返回 } q->exp=exp; q->coef=coef; //将q 插入链表中 q->next=pc->next; pc->next=q; pc=q;

实现多项式的显示;

void ShowPloy(PNode *h)

//用if 语句判断,当指数为0是,只输出系数;当指数为1时,输出系数和X ;当系数为1时,输出X 和指数。

{

h=paixu(h); //整理函数,使之降幂排列

PNode *p=h->next;

if(p==h)

{

printf("表达式为空\n");

return;

}

if(p->coef==1)

printf("x^%d",p->exp); //用if 语句判

断,若输出x^o和x^1值为0和1 直接输出数据。 else if(p->exp==1)

printf("%gx", p->coef);

else if(p->exp==0)

printf("%g", p->coef);

else

printf("%gx^%d", p->coef, p->exp);

p=p->next;

while (p!=h)

{

if(p->coef>0)

printf("+"); //系数为负,不用输出加号

if(p->coef==1)

printf("x^%d",p->exp);

else if(p->exp==1)

printf("%gx", p->coef);

else if(p->exp==0)

printf("%g", p->coef);

else

printf("%gx^%d", p->coef, p->exp);

p=p->next;

}

printf("\n");

}

主函数

void main()

{

PNode *F1,*F2,*F3;

float x;

F1=CreatPoly();

F2=CreatPoly();

printf("\nf1(x)=");ShowPloy(F1);

printf("\nf2(x)=");ShowPloy(F2);

F3=PolyAdd(F1,F2);

F3=paixu(F3);

printf("\nf1+f2=:");

ShowPloy(F3);

F3=PolySub(F1,F2);

printf("\nf1-f2=:");

ShowPloy(F3);

F3=PolyMult(F1,F2);

printf("\nf1*f2=:");

ShowPloy(F3);

printf("\nx的值为: ");

scanf("%f", &x);

printf("\nf1(x=%.3f)=%.3f\n",x,PolyValue(F1,x));

}

多项式求值

double PolyValue(PNode *h, float x) {

//编写算法,求以h 为头指针的多项式在x 点的值并返回该值。

}

多项式相减

PNode * PolySub(PNode *f1,PNode *f2)

{//编写此算法,实现两多项式(头指针分别为f1和f2)相减,返回差多项式f3=f1-f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*f3,*q,*head; f3=(PNode *)malloc(sizeof(PNode)); //建立头指针 f3->exp=-1; //头指针的初始化 f3->next=f3; double f=0.0; //求出f=f(x); PNode *pa; h=paixu(h); pa=h->next; while(pa->exp!=-1) //使用f+=coef*pow,返回f { } return f; f+=(pa->coef)*pow(x,pa->exp); pa=pa->next;

pc=f3; //pc指向头指针, 便于操作。 while(pb->exp!=-1) //返回头指针时,跳出循环。 { q=(PNode *)malloc(sizeof(PNode)); //建立新的q 指针存放负指数的指针

}

多项式相乘

PNode * PolyMult(PNode *f1,PNode *f2)

{//实现两多项式(头指针分别为f1和f2)相乘,返回乘积多项式f3=f1*f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*u,*head; int exp; float coef; } head=PolyAdd(f1,f3); //调用加法函数做减法 return head; //返回头指针 q->coef=pb->coef*(-1); q->exp=pb->exp; //将q 插入链表中 q->next=pc->next; pc->next=q; pc=q; pb=pb->next;

head=(PNode *)malloc(sizeof(PNode)); head->exp=-1; head->next=head; pc=head; while(pa->exp!=-1) //多项式相乘,录入u 指针,查到头指针。

{ } while(pb->exp!=-1) { coef=pa->coef*pb->coef; exp=pa->exp+pb->exp; u=(PNode *)malloc(sizeof(PNode)); u->coef=coef; u->exp=exp; u->next=pc->next; pc->next=u; pc=u; pb=pb->next; } pb=pb->next; pa=pa->next;

} return head; //返回头指针

程序运行截图

测试成功~!

程序完整源代码如下:

#include

#include

#include

typedef struct polynode

{ float coef; //系数

int exp; //指数

struct polynode *next; //下一结点指针

} PNode;

PNode * paixu(PNode *f) //将多项式降幂排列

{

PNode *p,*q,*r,*p0,*q0; p=f->next; q=p->next; p0=f; q0=p; while(p->exp!=-1) //p为q 的前驱,q 与p 指数指数值进行比较,

{ { while(q->exp!=-1) //q为头指针推出循环,q 移动一圈 { if(p->exp>q->exp) //比较,若p 大于q 则q 后移 { } else if(p->expexp) //若p 小于q 则q 插入p 之q0=q; q=q->next;

r=q->next;

q->next=p0->next;

q0->next=r;

p0->next=q;

p=q;

q=r;

}

else if(p->exp==q->exp) //若相等,

的相加,然后删除q 节点,释放q 的空间

{

p->coef+=q->coef;

q0->next=q->next;

q=q->next;

}

}

p0=p;

p=p->next;

q=p->next;

q0=p;

}

return f;

} p 的coef 与q

void ShowPloy(PNode *h)

//用if 语句判断,当指数为0是,只输出系数;当指数为1时,输出系数和X ;当系数为1时,输出X 和指数。 {

h=paixu(h); //整理函数,使之降幂排列

PNode *p=h->next;

if(p==h)

{

printf("表达式为空\n");

return;

}

if(p->coef==1)

printf("x^%d",p->exp); //用if 语句判断,若输出x^o和x^1值为0和1 直接输出数据。

else if(p->exp==1)

printf("%gx", p->coef);

else if(p->exp==0)

printf("%g", p->coef);

else

printf("%gx^%d", p->coef, p->exp);

p=p->next;

}

{ if(p->coef>0) printf("+"); //系数为负,不用输出加 if(p->coef==1) printf("x^%d",p->exp); else if(p->exp==1) printf("%gx", p->coef); else if(p->exp==0) printf("%g", p->coef); else printf("%gx^%d", p->coef, p->exp); p=p->next; } printf("\n");

PNode * CreatPoly() //建立多项式链表,返回头指针 {

PNode * head, *p, *s;

int i,n;

head->exp=-1; p=head; printf("多项式的项数为: "); scanf("%d",&n); for(i=1;i

}

void FreePoly(PNode *h)

{

//编写此算法,将以h 为头指针的多项式的链表结点逐个释放。 } p->next=head; return head; scanf("%g,%d",&s->coef,&s->exp); p->next=s; p=s;

}

p=h->next; while(p->exp)!+-1; { } free(h); return; q=p->next; free(p); p=q;

//Free函数用于销毁链表,最后指向头指针,跳出循环并释放头指针。

PNode * PolyAdd (PNode *f1, PNode *f2) //实现加法功能。 { //实现两多项式(头指针分别为f1和f2)相加,返回和多项式f3=f1+f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*f3,*q; int exp; float coef; f3=(PNode *)malloc(sizeof(PNode)); //建立头指针

f3->exp=-1; //对头指针初始化 f3->next=f3; pc=f3; //将pc 指向头指针 while (pa->exp!=-1 || pb->exp!=-1) // 返回头指针时,跳出循环

{ if (pa->exp>pb->exp) { } else if (pa->expexp) { } else { exp=pa->exp; coef=pa->coef+pb->coef; exp=pb->exp; coef=pb->coef; pb=pb->next; exp=pa->exp; coef=pa->coef; pa=pa->next;

} pa=pa->next; pb=pb->next; if (coef!=0) { q=(PNode *)malloc(sizeof(PNode)); //建立新的q 指针存放负指数的指针

}

PNode * PolySub(PNode *f1,PNode *f2)

{//编写此算法,实现两多项式(头指针分别为f1和f2)相减, } return f3; //返回 } q->exp=exp; q->coef=coef; //将q 插入链表中 q->next=pc->next; pc->next=q; pc=q;

返回差多项式f3=f1-f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*f3,*q,*head; f3=(PNode *)malloc(sizeof(PNode)); //建立头指针 f3->exp=-1; //头指针的初始化

f3->next=f3;

pc=f3; //pc指向头指针, 便于操作。

while(pb->exp!=-1) //返回头指针时,跳出循环。 {

q=(PNode *)malloc(sizeof(PNode)); //建立新的指针存放负指数的指针

q->coef=pb->coef*(-1);

q->exp=pb->exp; //将q 插入链表中

q->next=pc->next;

pc->next=q;

pc=q;

pb=pb->next;

}

head=PolyAdd(f1,f3); //调用加法函数做减法 return head; //返回头指针

}

PNode * PolyMult(PNode *f1,PNode *f2) q

{//实现两多项式(头指针分别为f1和f2)相乘,返回乘积多项式f3=f1*f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*u,*head; int exp; float coef; head=(PNode *)malloc(sizeof(PNode)); head->exp=-1; head->next=head; pc=head; while(pa->exp!=-1) //多项式相乘,录入u 指针,查到头指针。

{ while(pb->exp!=-1) { coef=pa->coef*pb->coef; exp=pa->exp+pb->exp; u=(PNode *)malloc(sizeof(PNode)); u->coef=coef; u->exp=exp; u->next=pc->next; pc->next=u; pc=u;

}

} } pb=pb->next; pa=pa->next; return head; //返回头指针

double PolyValue(PNode *h, float x) //实现多项式求值功能。利用指针求出每一项的值,再用加法加起来。 {

//编写算法,求以h 为头指针的多项式在x 点的值并返回该值。

double f=0.0; //求出f=f(x); PNode *pa; h=paixu(h); pa=h->next; while(pa->exp!=-1) //使用f+=coef*pow,返回f { f+=(pa->coef)*pow(x,pa->exp); pa=pa->next;

}

return f;

void main()

{

PNode *F1,*F2,*F3; float x; F1=CreatPoly(); F2=CreatPoly(); printf("\nf1(x)=");ShowPloy(F1); printf("\nf2(x)=");ShowPloy(F2); F3=PolyAdd(F1,F2); F3=paixu(F3); printf("\nf1+f2=:"); ShowPloy(F3); F3=PolySub(F1,F2); printf("\nf1-f2=:"); ShowPloy(F3); F3=PolyMult(F1,F2); printf("\nf1*f2=:"); ShowPloy(F3);

} printf("\nx的值为: "); scanf("%f", &x); printf("\nf1(x=%.3f)=%.3f\n",x,PolyValue(F1,x));

实验总结:

这次试验提高了我的编程能力,让我认识到了我C 语言的不足之处。也使我了解了线性链表是具有链接存储结构的线性表,它用节点存放线性表中的数据元素,逻辑上相邻的节点不能随机存取,因为这个原因我前期的程序一直出错,以后编程序的时候要牢记。

实 验 报 告

课程名称 ____数据结构上机实验__________ 实验项目 ______线性表的应用 ____________ 实验仪器 ________PC机___________________

系 别_____电子信息与通信学院___

专 业________ ___

班级/学号______ __ 学生姓名 ______ ___________

实验日期 _______________________

成 绩 _______________________

指导教师 _______________________

实验一. 线性表的应用

1. 实验目的:掌握线性链表的存储、运算及应用。利用链表实现一元多项式计算。

2. 实验内容:

1) 编写函数,实现用链表结构建立多项式;

2) 编写函数,实现多项式的加法运算;

3) 编写函数,实现多项式的显示;

4) 测试:编写主函数,它定义并建立两个多项式,显示两个多项式,然后将它们相加并显示结果。变换测试用的多项式,检查程序的执行结果。

选做内容:修改程序,选择实现以下功能:

5) 多项式求值:编写一个函数,根据给定的x 值计算并返回多项式f(x)的值。测试该函数(从终端输入一个x 的值,调用该函数并显示返回结果)。

6) 多项式相减:编写一个函数,求两个多项式相减的多项式。

7) 多项式相乘:编写一个函数,求两个多项式的乘积多项式。

3. 算法说明:

1) 多项式的建立、显示和相加算法见讲义。可修改显示函数,使输出的多项式更符合表达规范。

2) 多项式减法:同次项的系数相减(缺项的系数是0)。

例如a(x)=-5x+2x+3,b(x)= -4x +3x,则a(x)-b(x) =4x-5x -x+3。提示:a(x)-b(x) = a(x)+(-b(x))。

3) 多项式乘法:两个多项式的相乘是“系数相乘,指数相加”。算法思想是用一个多项式中的各项分别与另一个多项式相乘,形成多个多项式,再将它们累加在一起。例如,a(x)=-5x+2x+3,b(x)=-4x+3x,则

32233223a(x)*b(x) 2= =

= (-4x)*(-5x+2x+3)+(3x)*(-5x+2x+3) (20x-8x -12x )

5432543+ (-15x+6x+9x) 3220x -8x -27x +6x+9x。

4. 实验步骤:

根据实验报告的要求,我对文件夹里的C 文件进行了丰富和修改,步骤如下:

链表结构建立多项式:

typedef struct polynode

{ float coef; //系数

int exp; //指数

struct polynode *next; //下一结点指针

} PNode;

编写函数,实现多项式的加法运算;

PNode * PolyAdd (PNode *f1, PNode *f2) //实现加法功能。 { //实现两多项式(头指针分别为f1和f2)相加,返回和

多项式f3=f1+f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*f3,*q; int exp; float coef; f3=(PNode *)malloc(sizeof(PNode)); //建立头指针 f3->exp=-1; //对头指针初始化

f3->next=f3;

pc=f3; //将pc 指向头指针

while (pa->exp!=-1 || pb->exp!=-1)

出循环

{

if (pa->exp>pb->exp)

{

exp=pa->exp;

coef=pa->coef;

pa=pa->next;

}

else if (pa->expexp)

{

exp=pb->exp;

coef=pb->coef;

pb=pb->next; // 返回头指针时,跳

} else { } exp=pa->exp; coef=pa->coef+pb->coef; pa=pa->next; pb=pb->next; if (coef!=0) { q=(PNode *)malloc(sizeof(PNode)); //建立新的q 指针存放负指数的指针

} } return f3; //返回 } q->exp=exp; q->coef=coef; //将q 插入链表中 q->next=pc->next; pc->next=q; pc=q;

实现多项式的显示;

void ShowPloy(PNode *h)

//用if 语句判断,当指数为0是,只输出系数;当指数为1时,输出系数和X ;当系数为1时,输出X 和指数。

{

h=paixu(h); //整理函数,使之降幂排列

PNode *p=h->next;

if(p==h)

{

printf("表达式为空\n");

return;

}

if(p->coef==1)

printf("x^%d",p->exp); //用if 语句判

断,若输出x^o和x^1值为0和1 直接输出数据。 else if(p->exp==1)

printf("%gx", p->coef);

else if(p->exp==0)

printf("%g", p->coef);

else

printf("%gx^%d", p->coef, p->exp);

p=p->next;

while (p!=h)

{

if(p->coef>0)

printf("+"); //系数为负,不用输出加号

if(p->coef==1)

printf("x^%d",p->exp);

else if(p->exp==1)

printf("%gx", p->coef);

else if(p->exp==0)

printf("%g", p->coef);

else

printf("%gx^%d", p->coef, p->exp);

p=p->next;

}

printf("\n");

}

主函数

void main()

{

PNode *F1,*F2,*F3;

float x;

F1=CreatPoly();

F2=CreatPoly();

printf("\nf1(x)=");ShowPloy(F1);

printf("\nf2(x)=");ShowPloy(F2);

F3=PolyAdd(F1,F2);

F3=paixu(F3);

printf("\nf1+f2=:");

ShowPloy(F3);

F3=PolySub(F1,F2);

printf("\nf1-f2=:");

ShowPloy(F3);

F3=PolyMult(F1,F2);

printf("\nf1*f2=:");

ShowPloy(F3);

printf("\nx的值为: ");

scanf("%f", &x);

printf("\nf1(x=%.3f)=%.3f\n",x,PolyValue(F1,x));

}

多项式求值

double PolyValue(PNode *h, float x) {

//编写算法,求以h 为头指针的多项式在x 点的值并返回该值。

}

多项式相减

PNode * PolySub(PNode *f1,PNode *f2)

{//编写此算法,实现两多项式(头指针分别为f1和f2)相减,返回差多项式f3=f1-f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*f3,*q,*head; f3=(PNode *)malloc(sizeof(PNode)); //建立头指针 f3->exp=-1; //头指针的初始化 f3->next=f3; double f=0.0; //求出f=f(x); PNode *pa; h=paixu(h); pa=h->next; while(pa->exp!=-1) //使用f+=coef*pow,返回f { } return f; f+=(pa->coef)*pow(x,pa->exp); pa=pa->next;

pc=f3; //pc指向头指针, 便于操作。 while(pb->exp!=-1) //返回头指针时,跳出循环。 { q=(PNode *)malloc(sizeof(PNode)); //建立新的q 指针存放负指数的指针

}

多项式相乘

PNode * PolyMult(PNode *f1,PNode *f2)

{//实现两多项式(头指针分别为f1和f2)相乘,返回乘积多项式f3=f1*f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*u,*head; int exp; float coef; } head=PolyAdd(f1,f3); //调用加法函数做减法 return head; //返回头指针 q->coef=pb->coef*(-1); q->exp=pb->exp; //将q 插入链表中 q->next=pc->next; pc->next=q; pc=q; pb=pb->next;

head=(PNode *)malloc(sizeof(PNode)); head->exp=-1; head->next=head; pc=head; while(pa->exp!=-1) //多项式相乘,录入u 指针,查到头指针。

{ } while(pb->exp!=-1) { coef=pa->coef*pb->coef; exp=pa->exp+pb->exp; u=(PNode *)malloc(sizeof(PNode)); u->coef=coef; u->exp=exp; u->next=pc->next; pc->next=u; pc=u; pb=pb->next; } pb=pb->next; pa=pa->next;

} return head; //返回头指针

程序运行截图

测试成功~!

程序完整源代码如下:

#include

#include

#include

typedef struct polynode

{ float coef; //系数

int exp; //指数

struct polynode *next; //下一结点指针

} PNode;

PNode * paixu(PNode *f) //将多项式降幂排列

{

PNode *p,*q,*r,*p0,*q0; p=f->next; q=p->next; p0=f; q0=p; while(p->exp!=-1) //p为q 的前驱,q 与p 指数指数值进行比较,

{ { while(q->exp!=-1) //q为头指针推出循环,q 移动一圈 { if(p->exp>q->exp) //比较,若p 大于q 则q 后移 { } else if(p->expexp) //若p 小于q 则q 插入p 之q0=q; q=q->next;

r=q->next;

q->next=p0->next;

q0->next=r;

p0->next=q;

p=q;

q=r;

}

else if(p->exp==q->exp) //若相等,

的相加,然后删除q 节点,释放q 的空间

{

p->coef+=q->coef;

q0->next=q->next;

q=q->next;

}

}

p0=p;

p=p->next;

q=p->next;

q0=p;

}

return f;

} p 的coef 与q

void ShowPloy(PNode *h)

//用if 语句判断,当指数为0是,只输出系数;当指数为1时,输出系数和X ;当系数为1时,输出X 和指数。 {

h=paixu(h); //整理函数,使之降幂排列

PNode *p=h->next;

if(p==h)

{

printf("表达式为空\n");

return;

}

if(p->coef==1)

printf("x^%d",p->exp); //用if 语句判断,若输出x^o和x^1值为0和1 直接输出数据。

else if(p->exp==1)

printf("%gx", p->coef);

else if(p->exp==0)

printf("%g", p->coef);

else

printf("%gx^%d", p->coef, p->exp);

p=p->next;

}

{ if(p->coef>0) printf("+"); //系数为负,不用输出加 if(p->coef==1) printf("x^%d",p->exp); else if(p->exp==1) printf("%gx", p->coef); else if(p->exp==0) printf("%g", p->coef); else printf("%gx^%d", p->coef, p->exp); p=p->next; } printf("\n");

PNode * CreatPoly() //建立多项式链表,返回头指针 {

PNode * head, *p, *s;

int i,n;

head->exp=-1; p=head; printf("多项式的项数为: "); scanf("%d",&n); for(i=1;i

}

void FreePoly(PNode *h)

{

//编写此算法,将以h 为头指针的多项式的链表结点逐个释放。 } p->next=head; return head; scanf("%g,%d",&s->coef,&s->exp); p->next=s; p=s;

}

p=h->next; while(p->exp)!+-1; { } free(h); return; q=p->next; free(p); p=q;

//Free函数用于销毁链表,最后指向头指针,跳出循环并释放头指针。

PNode * PolyAdd (PNode *f1, PNode *f2) //实现加法功能。 { //实现两多项式(头指针分别为f1和f2)相加,返回和多项式f3=f1+f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*f3,*q; int exp; float coef; f3=(PNode *)malloc(sizeof(PNode)); //建立头指针

f3->exp=-1; //对头指针初始化 f3->next=f3; pc=f3; //将pc 指向头指针 while (pa->exp!=-1 || pb->exp!=-1) // 返回头指针时,跳出循环

{ if (pa->exp>pb->exp) { } else if (pa->expexp) { } else { exp=pa->exp; coef=pa->coef+pb->coef; exp=pb->exp; coef=pb->coef; pb=pb->next; exp=pa->exp; coef=pa->coef; pa=pa->next;

} pa=pa->next; pb=pb->next; if (coef!=0) { q=(PNode *)malloc(sizeof(PNode)); //建立新的q 指针存放负指数的指针

}

PNode * PolySub(PNode *f1,PNode *f2)

{//编写此算法,实现两多项式(头指针分别为f1和f2)相减, } return f3; //返回 } q->exp=exp; q->coef=coef; //将q 插入链表中 q->next=pc->next; pc->next=q; pc=q;

返回差多项式f3=f1-f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*f3,*q,*head; f3=(PNode *)malloc(sizeof(PNode)); //建立头指针 f3->exp=-1; //头指针的初始化

f3->next=f3;

pc=f3; //pc指向头指针, 便于操作。

while(pb->exp!=-1) //返回头指针时,跳出循环。 {

q=(PNode *)malloc(sizeof(PNode)); //建立新的指针存放负指数的指针

q->coef=pb->coef*(-1);

q->exp=pb->exp; //将q 插入链表中

q->next=pc->next;

pc->next=q;

pc=q;

pb=pb->next;

}

head=PolyAdd(f1,f3); //调用加法函数做减法 return head; //返回头指针

}

PNode * PolyMult(PNode *f1,PNode *f2) q

{//实现两多项式(头指针分别为f1和f2)相乘,返回乘积多项式f3=f1*f2。

PNode *pa=f1->next,*pb=f2->next,*pc,*u,*head; int exp; float coef; head=(PNode *)malloc(sizeof(PNode)); head->exp=-1; head->next=head; pc=head; while(pa->exp!=-1) //多项式相乘,录入u 指针,查到头指针。

{ while(pb->exp!=-1) { coef=pa->coef*pb->coef; exp=pa->exp+pb->exp; u=(PNode *)malloc(sizeof(PNode)); u->coef=coef; u->exp=exp; u->next=pc->next; pc->next=u; pc=u;

}

} } pb=pb->next; pa=pa->next; return head; //返回头指针

double PolyValue(PNode *h, float x) //实现多项式求值功能。利用指针求出每一项的值,再用加法加起来。 {

//编写算法,求以h 为头指针的多项式在x 点的值并返回该值。

double f=0.0; //求出f=f(x); PNode *pa; h=paixu(h); pa=h->next; while(pa->exp!=-1) //使用f+=coef*pow,返回f { f+=(pa->coef)*pow(x,pa->exp); pa=pa->next;

}

return f;

void main()

{

PNode *F1,*F2,*F3; float x; F1=CreatPoly(); F2=CreatPoly(); printf("\nf1(x)=");ShowPloy(F1); printf("\nf2(x)=");ShowPloy(F2); F3=PolyAdd(F1,F2); F3=paixu(F3); printf("\nf1+f2=:"); ShowPloy(F3); F3=PolySub(F1,F2); printf("\nf1-f2=:"); ShowPloy(F3); F3=PolyMult(F1,F2); printf("\nf1*f2=:"); ShowPloy(F3);

} printf("\nx的值为: "); scanf("%f", &x); printf("\nf1(x=%.3f)=%.3f\n",x,PolyValue(F1,x));

实验总结:

这次试验提高了我的编程能力,让我认识到了我C 语言的不足之处。也使我了解了线性链表是具有链接存储结构的线性表,它用节点存放线性表中的数据元素,逻辑上相邻的节点不能随机存取,因为这个原因我前期的程序一直出错,以后编程序的时候要牢记。


相关内容

  • 东北大学传感器实验报告
  • 实验一 金属箔式应变片――单臂电桥性能实验 一.实验目的:了解金属箔式应变片的应变效应,单臂电桥工作原理和性能. 二.基本原理:电阻丝在外力作用下发生机械变形时,其电阻值发生变化,这就是电阻应变效应, 描述电阻应变效应的关系式为: ΔR /R =K ε 式中:ΔR /R 为电阻丝电阻相对变化,K 为 ...

  • 线性链表的建立与应用实验报告
  • 实 验 报 告 课程名称 数据结构实验 实验名称 线性链表的建立与应用 2 实验类型 设计型 实验地点 实验日期 指导教师 专 业 班 级 学 号 姓 名 成 绩 辽宁石油化工大学计算机与通信工程学院 实验二 一 实验目的: 了解并掌握线性表在采取链式存储时的逻辑关系与物理存储关系的特点和计算特性, ...

  • [经济管理定量分析高级方法]实验指导书
  • <经济管理定量分析高级方法> 实 验 指 导 书 康继军 编 重庆大学经济与工商管理学院 2007 年 7 月 目 录 实验1 非线性回归模型估计„„„„„„„„„„„„„„„„„„„„„(2) 实验2 工具变量估计与虚拟变量应用„„„„„„„„„„„„„„„„„(9) 实验3 模型诊断 ...

  • 应用多元回归分析实验报告1
  • <应用回归分析>实训报告 实训项目:古典回归模型建模实训 班 级: 学 号: 姓 名: [实训目的] 熟悉回归分析的基本步骤,建立普通最小二乘回归模型,并对模型进行检验和应用. [实训要求] 1. 线性回归模型的最小二乘估计: 2. 线性回归模型的显著性检验: 3. 线性回归模型回归系数 ...

  • [成本会计实训]教案
  • <数学实验>教案 实验一:Matlab 基本操作 一.实验基本情况 [实验学时]2学时 [实验形式]实验室小课 [实验重点]Matlab 软件的一些基本操作和常用命令 [实验难点]Matlab 软件的一些基本操作和常用命令 [参考书] 1.张志涌等编,精通MATLAB6.5,北京航空航天 ...

  • 一元线性回归分析实验报告
  • 一元线性回归在公司加班制度中的应用 院(系): 专业班级: 学号姓名: 指导老师: 成 绩: 完成时间: 一元线性回归在公司加班制度中的应用 一.实验目的 掌握一元线性回归分析的基本思想和操作,可以读懂分析结果,并写出回归方程,对回归方程进行方差分析.显著性检验等的各种统计检验 二.实验环境 SPS ...

  • [传感器原理及应用]实验报告
  • <传感器原理及实验> 实验报告 2011-2012学年第1学期 专 业 测控技术及仪器 班 级 姓 名 学 号 指导教师 王慧锋 电子与信息实验教学中心 2011年9月 实验一 金属箔式应变片――单臂电桥性能实验 一.实验目的 了解金属箔式应变片的应变效应,单臂电桥工作原理和性能. 二. ...

  • 戴维南定理实验报告
  • 戴维南定理及其应用实验报告书 戴维南定理及其应用 一.实验目的 1.掌握戴维南定理及其应用方法. 2.验证戴维南定理. 二.实验器材 直流电压源 1个 电压表 1个 电流表 1个 电阻 4个 三.实验原理 在电路理论中等效电路定理具有非常重要的意义,它包括戴维南定理和诺顿定理.戴维南定理可描述为:任 ...

  • SPSS回归分析实验报告
  • 中国计量学院现代科技学院 实 验 报 告 实验课程: 应用统计学 实验名称: 回归分析 班 级: 学 号: 姓 名: 实验日期: 2012.05.23 实验成绩: 指导教师签名: 一.实验目的 一元线性回归简单地说是涉及一个自变量的回归分析,主要功能是处理两个变量之间的线性关系,建立线性数学模型并进 ...

  • 分析方法验证
  • 验证.确认和转移的定义 USP分析方法的验证.确认和转移 一. 分析方法验证.确认和转移的定义 二. 分析方法验证 三. 分析方法确认 四. 分析方法转移 五. 总结 验证: USP:分析方法验证是一个按照已建立的实验室研究来证 明方法的性能参数符合期望的分析应用要求的过程 ICH Q2(R1):分 ...