【数据结构】线性表的应用之一元多项式的加法运算(C语言实现)

程序代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#define LEN sizeof(Lnode)

typedef struct{

    float p; //系数

    int e;   //指数

}Polynomial;

typedef struct Lnode{

    Polynomial data;

    struct Lnode *next;

}Lnode,*LinkList;

LinkList InitList(){

    LinkList L=(LinkList)malloc(LEN);

    if(L==NULL){

         printf("动态空间分配失败!\n");

         exit(1);

    }

    L->next=NULL;

    return(L);

}

void Insert(LinkList L,int i,int e,float p){

    Lnode *pointer=L;

    Lnode *newpointer=(Lnode*)malloc (LEN);

    int count=0;

    if(i<1){

         printf("插入位置非法!\n");

    }

    while(pointer!=NULL&&count<i-1){

         pointer=pointer->next;

         count++;

    }

    if(pointer==NULL){

         printf("表长小于%d",i-1);

    }

    newpointer->next=pointer->next;

    newpointer->data.e=e;

    newpointer->data.p=p;

    pointer->next=newpointer;

}

void Input(int num,LinkList L){

    printf("下面按指数升序输入各项\n");

    for(int i=1;i<=num;i++){

         int e;

         float p;

         printf("请输入第%d项的指数:",i);

         scanf_s("%d",&e);

         printf("请输入第%d项的系数:",i);

         scanf_s("%f",&p);

         Insert(L,i,e,p);

    }

}

void Add(LinkList L1,LinkList L2){

    Lnode *p1=L1->next;

    Lnode *p2=L2->next;

    Lnode *newp=L1;

    while((p1!=NULL)&&(p2!=NULL)){

    if((p1->data.e)==(p2->data.e)){

         (p1->data.p)=(p1->data.p)+(p2->data.p);

         if(p1->data.p==0){

             p1=p1->next;

             p2=p2->next;

         }else{

         newp->next=p1;

         newp=p1;

         p1=p1->next;

         p2=p2->next;

         continue;

         }

    }else if((p1->data.e)<(p2->data.e)){

         newp->next=p1;

         newp=p1;

         p1=p1->next;

         continue;

    }else if((p2->data.e)<(p1->data.e)){

         newp->next=p2;

         newp=p2;

         p2=p2->next;

         continue;

    }

    }

    if(p1==NULL){newp->next=p2;}

    if(p2==NULL){newp->next=p1;}

}

void Traverse(LinkList L){

    Lnode *p=L->next;

    while(p){

         printf("%7.2fx^%d\n",p->data.p,p->data.e);

         p=p->next;

    }

}

int main(){

    int m,n;

    LinkList L1=InitList();

    printf("下面开始输入多项式Pn(X),首先请输入n:\n");

    scanf("%d",&n);

    Input(n,L1);

    LinkList L2=InitList();

    printf("下面开始输入多项式Qm(X),首先请输入m:\n");

    scanf("%d",&m);

    Input(m,L2);

    printf("Pn(x)\n");

    Traverse(L1);

    printf("Qm(x)\n");

    Traverse(L2);

    printf("Result:\n");

    Add(L1,L2);

    Traverse(L1);

}

运行截图:

 

实验小结

将实现操作的过程拆分成若干函数

本次实验是线性表的应用,相比前两次实验,该实验更具体、更贴近生活,但也意味着更为复杂。最开始编写程序时,我便从主程序开始写,但是写着写着,就出现了思维混乱、代码重复的错误。于是我开始复盘编写流程。发现在开始编写之前画一个流程图可能会使我对这个程序更加清晰。于是我将该程序划分为输入、计算、输出三个流程,进一步将输入细化为Pn(x)与Qn(x)的输入。并将计算流程用图形表示。最终对程序运行过程较为明朗。

区分continue和break

语句作用不同:在分支结构程序设计中用break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句;break语句可以用来从循环体内中途跳出循环体,即提前结束循环操作,接着执行循环下面的语句。continue语句是跳过循环体中剩余的语句而强制执行下一次循环操作。其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。 

用法不同:在循环语句中,break语句一般都是与if语句一起使用;break语句不能用于循环语句和switch语句之外的任何其它语句中。continue语句只能用在循环语句中。一般都是与if语句一起使用。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头鸭鸭鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值