water b 2017-03-20 10:32 采纳率: 100%
浏览 918
已采纳

数据结构的这个题目我还是不懂

在线等这到数据结构得题目,感觉c语言差了,我不了解结构体的部分,所以关于c语言的数据结构编程,老是不懂为什么只用写算法那一小部分图片

  • 写回答

3条回答 默认 最新

  • 青云不语 2017-03-20 10:56
    关注

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    //链表实现多项式

    typedef struct node
    {
    int coef; //系数
    int expn; //指数
    struct node *next; //指针域
    }Nodetype,*LNode; //定义结点类型

    LNode CreatePolyn(void);
    void PrintPolyn(LNode Head);
    LNode AddPolyn(LNode H1,LNode H2); //表达式相加
    LNode SubstractPolyn(LNode H1,LNode H2); //相减(让系数变负,然后代入加法函数)

    void DerivativePolyn(LNode Head);
    int expnPolyn(int x,int y);
    void eqPolyn(LNode Head);

    void main()
    {
    LNode Head,H1,H2;
    int choice,sign;
    while(1)
    {
    system("cls");
    cout << "\n\n\n\n";
    cout<<"\t\t 1.创建多项式 "< cout cout cout cout cout cout cout cout cin>>choice;
    cout< system("cls");
    switch(choice)
    {
    case 1:
    Head = CreatePolyn();
    system("pause");
    break;
    case 2:
    PrintPolyn(Head);
    system("pause");
    break;
    case 3:
    printf("开始创建第一个多项式:\n");
    H1 = CreatePolyn();
    printf("开始创建第二个多项式:\n");
    H2 = CreatePolyn();
    Head = AddPolyn(H1,H2);
    printf("相加的结果为:\n");
    PrintPolyn(Head);
    system("pause");
    break;
    case 4:
    printf("开始创建第一个多项式:\n");
    H1 = CreatePolyn();
    printf("开始创建第二个多项式:\n");
    H2 = CreatePolyn();
    Head = SubstractPolyn(H1,H2);
    printf("相减的结果为:\n");
    PrintPolyn(Head);
    system("pause");
    break;
    case 5:
    DerivativePolyn(Head);
    system("pause");
    break;
    case 6:
    eqPolyn(Head);
    system("pause");
    break;
    case 0:
    exit(0);
    }
    }
    }
    //创建多项式
    LNode CreatePolyn(void)
    {
    LNode Head,p,pre,pree;
    int x,z;
    Head = (LNode)malloc(sizeof(Nodetype));
    Head->next = NULL;
    printf("当你输入的系数为0时,输入结束。\n");
    printf("请输入第一项系数:");
    scanf("%d",&x);
    if (x==0)
    {
    p=(LNode)malloc(sizeof(LNode));
    p->coef=0;
    p->expn=0;
    Head->next=p;
    p->next=NULL;
    }
    while(x!=0)
    {
    printf("请输入指数:");
    scanf("%d",&z);
    p=(LNode)malloc(sizeof(Nodetype));
    p->coef=x;
    p->expn=z;
    pre=Head;
    while(pre->next&&pre->next->expn>=z) //原有项指数大于插入项
    {
    pree=pre;
    pre=pre->next;

    }
    p->next=pre->next; //插入项
    pre->next=p;
    if(pre->expn==p->expn) //原有项指数等于插入项
    {
    pre->coef+=p->coef;
    pre->next=p->next;
    free(p);
    }
    if(pre->coef==0) //系数为0
    {
    pree->next=pre->next;
    free(pre);
    }
    printf("请输入系数:");
    scanf("%d",&x);
    }
    if(Head->next == NULL) //多项式空
    {
    pre=(LNode)malloc(sizeof(LNode));
    pre->coef=0;
    pre->expn=0;
    pre->next=Head->next;
    Head->next=pre;
    }
    return Head;
    }

    //显示多项式
    void PrintPolyn(LNode Head)
    {
    LNode pre;
    pre=Head->next;
    if(pre->expn==0) //指数为0
    printf("%d",pre->coef);
    else
    {
    if(pre->expn == 1)
    printf("%d*X",pre->coef,pre->expn);
    else
    printf("%d*X^%d",pre->coef,pre->expn);
    }
    pre=pre->next;
    while(pre) //系数不为0
    {
    if(pre->expn==0) //指数为0
    {
    if(pre->coef>0)
    printf("+%d",pre->coef);
    else if (pre->coef printf("%d",pre->coef);
    }
    else //指数不为0
    {
    if(pre->coef>0)
    {
    if(pre->expn == 1)
    printf("+%d*X",pre->coef,pre->expn);
    else
    printf("+%d*X^%d",pre->coef,pre->expn);
    }
    else if (pre->coef {
    if(pre->expn == 1)
    printf("%d*X",pre->coef,pre->expn);
    else
    printf("%d*X^%d",pre->coef,pre->expn);
    }
    }
    pre=pre->next;

    }
    printf("\n");
    }

    LNode AddPolyn(LNode H1,LNode H2) //表达式相加
    {
    LNode H3,p1,p2,p3,pre; //p1为第一个多项式的项,pre为p的前一项
    H3=(LNode)malloc(sizeof(LNode));
    H3->next=NULL;
    p1=H1->next;
    p2=H2->next;
    pre=H3;
    while(p1&&p2)
    {
    if(p1->expn>p2->expn) //第一个多项式的项的指数大于第二个的项的指数
    {
    p3=(LNode)malloc(sizeof(LNode));
    p3->expn=p1->expn;
    p3->coef=p1->coef;
    p3->next=pre->next;
    pre->next=p3;
    pre=p3;
    p1=p1->next;
    }
    else if(p1->expnexpn) //第一个多项式的项的指数小于第二个的项的指数
    {
    p3=(LNode)malloc(sizeof(LNode));
    p3->expn=p2->expn;
    p3->coef=p2->coef;
    p3->next=pre->next;
    pre->next=p3;
    pre=p3;
    p2=p2->next;

    }
    else if(p1->coef+p2->coef!=0) //相加不为0,指数相同系数相加
    {
    p3=(LNode)malloc(sizeof(LNode));
    p3->expn=p1->expn;
    p3->coef=p1->coef+p2->coef;
    p3->next=pre->next;
    pre->next=p3;
    pre=p3;
    p1=p1->next;
    p2=p2->next;
    }
    else //相加为0
    {
    p1=p1->next;
    p2=p2->next;
    }
    }

    while(p2)
    {
        p3=(LNode)malloc(sizeof(LNode));
        p3->expn=p2->expn;
        p3->coef=p2->coef;
        p3->next=pre->next;
        pre->next=p3;
        pre=p3;
        p2=p2->next;
    }
    
    while(p1)
    {
        p3=(LNode)malloc(sizeof(LNode));
        p3->expn=p1->expn;
        p3->coef=p1->coef;
        p3->next=pre->next;
        pre->next=p3;
        pre=p3;
        p1=p1->next;
    }
    return H3;
    

    }

    LNode SubstractPolyn(LNode H1,LNode H2) //相减(让系数变负,然后代入加法函数)
    {
    LNode H3,pre;
    pre=H2->next;
    while(pre)
    {
    pre->coef=-pre->coef;
    pre=pre->next;
    }
    H3=AddPolyn(H1,H2);
    pre=H2->next;
    while(pre)
    {
    pre->coef=-pre->coef;
    pre=pre->next;
    }
    return H3;
    }

    void DerivativePolyn(LNode Head)
    {
    LNode pre;
    pre=Head->next;
    if(pre->expn==0)//指数为0
    {
    }
    else
    {
    if(pre->expn == 1)
    printf("%d",pre->coef);
    else
    {
    if(pre->expn == 2)
    printf("%d*X",pre->coef*pre->expn);
    else
    printf("%d*X^%d",pre->coef*pre->expn,(pre->expn)-1);
    }
    }
    pre=pre->next;
    while(pre) //系数不为0
    {
    if(pre->expn==0) //指数为0
    {
    }
    else //指数不为0
    {
    if(pre->coef>0)
    {
    if(pre->expn == 1)
    printf("+%d",pre->coef);
    else
    {
    if(pre->expn == 2)
    printf("+%d*X",pre->coef*pre->expn);
    else
    printf("+%d*X^%d",pre->coef*pre->expn,(pre->expn)-1);
    }
    }
    else if (pre->coef {
    if(pre->expn == 1)
    printf("%d",pre->coef);
    else
    {
    if(pre->expn == 2)
    printf("%d*X",pre->coef*pre->expn);
    else
    printf("%d*X^%d",pre->coef*pre->expn,(pre->expn)-1);
    }
    }
    }
    pre=pre->next; //遍历每一项
    }
    printf("\n");
    }

    int expnPolyn(int x,int y)
    {
    int k=1;
    int i;
    if (y == 0)
    return 1;
    else if (y == 1)
    return x;
    else
    {
    for (i=1;i<=y;i++)
    k *= x;
    return k;
    }

    }

    void eqPolyn(LNode Head)
    {
    LNode pre;
    long n=0;
    int x;
    pre=Head->next;
    printf("请输入x的值:");
    scanf("%d",&x);
    while(pre) //系数不为0
    {
    n+= pre->coef*expnPolyn(x,pre->expn);
    pre=pre->next; //遍历每一项
    }
    printf("%d",n);
    printf("\n");
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料