// 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;
}