利用链表完成多项式操作

来源:互联网 发布:弟子知罪,愿受师父责罚 编辑:程序博客网 时间:2024/05/19 20:22

// test0.cpp : Defines the entry pointfor the console application.

//

 

#include "stdafx.h"

#include <fstream>

#include <string>

#include <iostream>

using namespace std;

 

 

typedef struct lnode{

    intfactor;

    intindex;

}data;

 

typedef struct newlink *ptr;//节点包括数据和一个指针,指针指向自身类型

typedef struct newlink{

    datad;

    ptrnext;

}linkp,*linkpoint;

 

//新建单链表

linkpoint linklist_creat()

{

    linkpointhead = new linkp;

    head->next= NULL;

    returnhead;

}

 

//插入节点

int linklist_insert(linkpoint head, datab)

{

    linkpointp = new linkp;

    p->d= b;

    p->next= NULL;

    if(head->next == NULL)

    {

        head->next= p;

        return1;

    }

    p->next= head->next;//a指向插入位置的前一个节点

    head->next= p;

    return1;

}

 

//删除节点

int linklist_delete(linkpoint a)//删除节点a后面的节点

{

    linkpointp = a->next;

    if(p == NULL)

        return0;

    a->next= p->next;

    free(p);

    return1;

}

 

//链表逆置

int linklist_reverse(linkpoint head)

{

    linkpointheadr = linklist_creat();

    linkpointp = head->next;

    if(p == NULL)

        return1;

    while(p != NULL)

    {

        linklist_insert(headr,p->d);

        p= p->next;

    }

    head->next= headr->next;

    free(headr);

    return1;

}

 

//排序(幂次从高到低)

int linklist_sort(linkpoint head)

{

    linkpointp = head->next;

    if(p == NULL || p->next == NULL)

        return1;

    datatemp=p->d;

    while(p->next != NULL)

    {

        linkpointq = p->next;

        while(q != NULL)

        {

            if(p->d.index < q->d.index)

            {

                temp= p->d;

                p->d= q->d;

                q->d= temp;

            }

            q= q->next;

        }

        p= p->next;

    }

    return1;

}

 

//求导

int linklist_qiudao(linkpoint head)

{

    linklist_sort(head);//先排序

    linkpointp = head->next;

    if(p == NULL)

        return1;

    elseif (p->next == NULL)

    {

        if(p->d.index > 0)

        {

            p->d.factor*= p->d.index;

            p->d.index--;

        }

        else

        {

            linklist_delete(head);

        }//最后一个数据求导(删除)

        return1;

    }

   

    while(p->next->next != NULL)

    {

        p->d.factor*= p->d.index;

        p->d.index--;

        p= p->next;

    }//前n-2个数据求导

 

    if(p->next->d.index > 0)

    {

        p->next->d.factor*= p->d.index;

        p->next->d.index--;

    }

    else

    {

        linklist_delete(p);

    }//最后一个数据求导(删除)

 

    p->d.factor*= p->d.index;

    p->d.index--;//倒数第二个数据求导

    return1;

}

 

 

//相加

linkpoint linklist_add(linkpoint a,linkpoint b)

{

    linkpointp = a->next;

    if(p == NULL)

        returnb;

    while(p->next != NULL)

        p= p->next;

    p->next= b->next;

    free(b);//连接

 

    linklist_sort(a);//排序

 

    linkpointq = a->next;//同幂次相加

    while(q != NULL&&q->next != NULL)

    {

        while(q->next->d.index == q->d.index)

        {

            q->d.factor+= q->next->d.factor;

 

            linkpointx = q->next;//同幂次删除节点

            q->next= x->next;

            free(x);

        }

        q= q->next;

    }

    returna;

}

 

//输出

void linklist_out(linkpoint head)

{

    linkpointp = head->next;

    while(p != NULL)

    {

        cout<< p->d.factor << " " << p->d.index <<"  ";

        p= p->next;

    }

    cout<< endl;

}

 

//文件读取

int initial(linkpoint head,char*filename)

{

    ifstreamf(filename);

    if(!f)

    {

        cout<<"文件打开错误"<<endl;

        return1;

    }

    intnum;

    datad;

    f>>num;

    if(num==0)

    {

        cout<<"多项式不存在"<<endl;

        return1;

    }

    while(num>0)

    {

        num--;

        f>>d.factor;

        f>>d.index;

        linklist_insert(head, d);

    }

    return1;

}

 

int main(int argc, char* argv[])

{

    linkpoints1 = linklist_creat();

    linkpoints2 = linklist_creat();

    datad;

 

    //建立第一个多项式

    initial(s1,"C:\\Users\\user\\Desktop\\1.txt");

//  d.factor= 4; d.index = 0;

//  linklist_insert(s1,d);

//  d.factor= 6; d.index = 5;

//  linklist_insert(s1,d);

//  d.factor= 3; d.index = 2;

//  linklist_insert(s1,d);

 

 

    //建立第二个多项式

    initial(s2,"C:\\Users\\user\\Desktop\\2.txt");

//  d.factor= 4; d.index = 2;

//  linklist_insert(s2,d);

//  d.factor= 5; d.index = 3;

//  linklist_insert(s2,d);

//  d.factor= 8; d.index = 6;

//  linklist_insert(s2,d);

   

    //多项式幂次排序

    linklist_sort(s1);

    linklist_sort(s2);

    linklist_out(s1);

    linklist_out(s2);

 

    //多项式逆置

    linklist_reverse(s1);

    linklist_out(s1);

 

    //多项式求导

    linklist_qiudao(s1);

    linklist_out(s1);

 

    //多项式再逆置

    linklist_reverse(s1);

    linklist_out(s1);

 

    //多项式相加

    linkpoints3 = linklist_add(s1, s2);

    linklist_out(s3);

    return1;  

 

}