zoukankan      html  css  js  c++  java
  • 链表解大数据相加减相乘

    /*
    题意:大数相加减相乘
    单链表的运用
    */
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

    char c;
    int flag;

    typedef struct node
    {
    char data;
    struct node *next;
    } Node;

    Node *a[10];

    Node *create_link()
    {
    Node *head,*p;
    head=p=NULL;
    char m;
    while(1)
    {
    scanf("%c",&m);
    if(m==' '||m=='+'||m=='-'||m=='*')
    {
    if(m=='+')
    c='+';
    else if(m=='-')
    c='-';
    else if(m=='*')
    c='*';
    break;
    }
    p=(Node *)malloc(sizeof(Node));
    p->data=m;
    p->next=NULL;
    if(head==NULL)
    {
    head=p;
    }
    else
    {
    p->next=head;
    head=p;
    }
    }
    return head;
    }

    Node *flash_back(Node *link)
    {
    Node *p=NULL,*head=NULL;
    while(link)
    {
    p=(Node *)malloc(sizeof(Node *));
    p->data=link->data;
    p->next=NULL;
    if(head==NULL)
    {
    head=p;
    }
    else
    {
    p->next=head;
    head=p;
    }
    link=link->next;
    }
    return head;
    }

    void comp(Node *p1,Node *p2)
    {
    while(p1&&p2)
    {
    if(p1->data>p2->data)
    flag=1;
    else if(p1->data<p2->data)
    flag=0;
    p1=p1->next;
    p2=p2->next;
    }
    if(p1)
    flag=1;
    else if(p2)
    flag=0;
    }

    Node *add(Node *p1,Node *p2)
    {
    char s;
    int k=0;
    Node *p,*head;
    p=head=NULL;
    while(p1&&p2)
    {
    s=p1->data+p2->data-'0'+k;
    k=0;
    if(s>'9')
    {
    s=s-10;
    k=1;
    }
    p=(Node *)malloc(sizeof(Node));
    p->data=s;
    p->next=NULL;
    if(head==NULL)
    {
    head=p;
    }
    else
    {
    p->next=head;
    head=p;
    }
    p1=p1->next;
    p2=p2->next;
    }
    while(p1)
    {
    p=(Node *)malloc(sizeof(Node));
    s=k+p1->data;
    k=0;
    if(s>'9')
    {
    s=s-10;
    k=1;
    }
    p->data=s;
    p->next=head;
    head=p;
    p1=p1->next;
    }
    while(p2)
    {
    p=(Node *)malloc(sizeof(Node));
    s=k+p2->data;
    k=0;
    if(s>'9')
    {
    s=s-10;
    k=1;
    }
    p->data=s;
    p->next=head;
    head=p;
    p2=p2->next;
    }
    if(k)
    {
    p=(Node *)malloc(sizeof(Node));
    p->data=k+'0';
    p->next=head;
    head=p;
    }
    return head;
    }


    Node *sub(Node *p1,Node *p2)
    {
    char s;
    int k=0;
    Node *p,*head;
    p=head=NULL;
    while(p1&&p2)
    {
    if(p1->data<p2->data)
    {
    s=p1->data+10-p2->data+'0'-k;
    k=1;
    }
    else
    {
    s=p1->data-p2->data+'0'-k;
    k=0;
    }
    p=(Node *)malloc(sizeof(Node));
    p->data=s;
    p->next=NULL;
    if(head==NULL)
    {
    head=p;
    }
    else
    {
    p->next=head;
    head=p;
    }
    p1=p1->next;
    p2=p2->next;
    }
    while(p1)
    {
    p=(Node *)malloc(sizeof(Node));
    s=p1->data-k;
    k=0;
    p->data=s;
    p->next=head;
    head=p;
    p1=p1->next;
    }
    return head;
    }

    void print_link(Node *p);

    Node *mul(Node *p1,Node *p2)
    {
    int i=0,j=0;
    int s,k;
    Node *head,*head1,*head2,*tail,*p;
    head1=p1;
    while(head1)
    {
    k=0;
    head2=p2;
    head=tail=NULL;
    while(head2)
    {
    s=(head2->data-'0')*(head1->data-'0')+k;
    k=0;
    k=s/10;
    s=s%10;
    p=(Node *)malloc(sizeof(Node *));
    p->data=s+'0';
    p->next=NULL;
    if(head==NULL)
    {
    head=p;
    tail=p;
    }
    else
    {
    tail->next=p;
    tail=p;
    }
    head2=head2->next;
    }
    if(k)
    {
    p=(Node *)malloc(sizeof(Node *));
    p->data=k+'0';
    p->next=NULL;
    tail->next=p;
    tail=p;
    }
    int i1=i;
    while(i1>0)
    {
    p=(Node *)malloc(sizeof(Node *));
    p->data='0';
    p->next=head;
    head=p;
    i1--;
    }
    a[i]=head;
    i++;
    head1=head1->next;
    }
    Node *mu=NULL;
    if(i==1)
    {
    Node *mk=(Node *)malloc(sizeof(Node));
    mk->data='0';
    mk->next=NULL;
    return add(mk,a[0]);
    }
    else if(i==2)
    return add(a[0],a[1]);
    else
    {
    mu=add(a[0],a[1]);
    for(j=2;j<i;j++)
    {
    mu=flash_back(mu);
    mu=add(mu,a[j]);
    }
    return mu;
    }
    }

    void print_link(Node *p)
    {
    Node *head;
    head=p;
    while(p)
    {
    if(head->data=='0'&&p->next)
    {
    head=p->next;
    p=p->next;
    continue;
    }
    printf("%c",p->data);
    p=p->next;
    }
    /* while(p)
    {
    printf("%c",p->data);
    p=p->next;
    }*/
    putchar(' ');
    return ;
    }

    int main(void)
    {
    Node *p1,*p2,*p3;
    int i;
    flag=1;
    for(i=0; i<10; i++)
    a[i]=NULL;
    p1=create_link();
    p2=create_link();
    if(c=='+')
    p3=add(p1,p2);
    else if(c=='-')
    {
    comp(p1,p2);
    if(flag)
    {
    p3=sub(p1,p2);
    }
    else
    {
    putchar('-');
    p3=sub(p2,p1);
    }
    }
    else if(c=='*')
    {
    p3=mul(p1,p2);
    }
    print_link(p3);
    return 0;
    }

  • 相关阅读:
    【转】点集 凸包
    【转】Word中使用Endnote很卡解决方案
    【转】一个程序员的面试经验之谈
    【转】 std list/vector sort 排序
    std::numeric_limits<int>::max() error C2589: '(' : illegal token on right side of '::' 解决办法
    【转】Log4cpp 封装
    【转】 log4cpp 的使用
    遍历目录 删除目录中包含指定字符的文件和文件夹
    mysql主从复制架构
    mysql分区功能详细介绍,以及实例
  • 原文地址:https://www.cnblogs.com/liudehao/p/5193574.html
Copyright © 2011-2022 走看看