第1个回答 推荐于2017-09-29
以前学习链表的时候写的, 你自己改改用吧。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int Status;
typedef struct lnode
{
int data;
struct lnode *next;
}LNode,*Linklist;
typedef struct polyn
{
int data1;
int data2;
struct polyn *next;
}POlyn,*node;
void about()
{
printf("单链表及多项式的操作(化羽制作)\n");
}
void Inimenu()
{
printf("----------欢迎使用------------\n");
printf("* 1.单链表的操作\n");
printf("* 2.多项式的操作\n");
printf("* 3.结束退出\n");
printf("请输入你要选择的功能:\n");
}
void Listmenu()
{
printf("---------链表的功能---------\n");
printf("* 1.输出单链表的全部数据\n");
printf("* 2.查找链表元素 \n");
printf("* 3.链表插入元素 \n");
printf("* 4.链表删除元素 \n");
printf("* 5.结束\n");
printf("请输入要选择的功能:\n");
}
void Promenu()
{
printf("--------多项式的功能---------\n");
printf("* 1.多项式的加法\n");
printf("* 2.多项式的减法\n");
printf("* 3.多项式的乘法\n");
printf("请输入要选择的功能:\n");
}
void print_list(Linklist L)
{
Linklist p;
printf("你输入的数据是:\n");
p=L->next;
while (p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void print_proy(node L)
{
node p;
printf("你输入的数据是:\n");
p=L->next;
while (p!=NULL)
{
printf("%dx^%d ",p->data1,p->data2);
p=p->next;
}
printf("\n");
}
void creat_list(Linklist &L,int n)
{
Linklist p,tail;
int i;
L=(LNode *)malloc(sizeof(LNode));
tail=L;
L->next=NULL;
printf("请逆序输入n个数,建立带头节点的链表:\n");
for (i=0;i<n ;i++)
{
p=(LNode *)malloc(sizeof(LNode));
scanf("%d",&(p->data));
tail->next=p;
tail=tail->next;
p->next=NULL;
}
}
void creat_proy(node &L,int n)
{
node p,tail;
int i;
L=(node)malloc(sizeof(POlyn));
tail=L;
L->next=NULL;
printf("请输入n个数,建立带头节点的链表:\n");
for (i=0;i<n ;i++)
{
p=(node)malloc(sizeof(POlyn));
scanf("%d%d",&(p->data1),&(p->data2));
tail->next=p;
tail=tail->next;
p->next=NULL;
}
}
Status Getelem(LNode *L,int i,int &e)
{
int j;
Linklist p;
p=L->next;
j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if (!p||j>i)
{
printf("没有这个数\n");
return 0;
}
e=p->data;
return 1;
}
Status ListInsert_L(Linklist L,int i,int e)
{
int j=0;
LNode *s,*p;
p=L;
s=(Linklist)malloc(sizeof(LNode));
if(s==NULL) return 0;
s->data=e;
while (p&&j<i-1)
{
p=p->next;
j++;
}
if (!p||j>i-1)
{
return 0;
}
s->next=p->next;
p->next=s;
return 1;
}
Status ListDelete_L(Linklist L, int i, int &e)
{
Linklist p,q;
int j;
p = L; j = 0;
while (p->next && j < i-1)
{ p = p->next; ++j; }
if (!(p->next) || j > i-1)
return 0;
q = p->next; p->next = q->next;
e = q->data; free(q);
return 1;
}
void addproy(node pa,node pb)
{
POlyn *p,*q,*temp,*pre;
int sum;
p=pa->next;
q=pb->next;
pre=pa;
while (p&&q)
{
if (p->data2<q->data2)
{
pre->next=p;
pre=pre->next;
p=p->next;
}
else if(p->data2==q->data2)
{
sum=p->data1+q->data1;
if (sum)
{
p->data1=sum;
pre->next=p;
pre=pre->next;
p=p->next;
temp=q;
q=q->next;
free(temp);
}
else
{
temp=p->next;free(p);p=temp;
temp=q->next;free(q);q=temp;
}
}
else
{
pre->next=q;
pre=pre->next;
q=q->next;
}
}
if (p)
pre->next=p;
else
pre->next=q;
}
void subproy(node pa,node pb)
{
int i;
node q;
q=pb->next;
while (q)
{
i=-(q->data1);
q->data1=i;
q=q->next;
}
addproy(pa,pb);
}
//实现多项式的乘法
void mulproy(node pa,node pb)
{
node p,q,s,h;
int i=0;
node pc,pd;
pc=(node)malloc(sizeof(POlyn));
pd=(node)malloc(sizeof(POlyn));
pc->next=NULL;
pd->next=NULL;
p=pa->next;
q=pb->next;
s=pc;
while (q)
{
p=pa->next;
if(i>=1)
s=pd;
while (p)
{
h=(node)malloc(sizeof(POlyn));
h->next=NULL;
h->data1=(p->data1)*(q->data1);
printf("%d ",h->data1);
h->data2=p->data2+q->data2;
s->next=h;
s=h;
p=p->next;
}
printf("第一步成功\n");
q=q->next;
i++;
if (i>=2)
{
addproy(pc,pd);
}
}
printf("多项式相乘的结果是:");
print_proy(pc);
}
void opera_list()
{
Linklist L;
int n,choice,i;
Status e;
printf("请输入要输入链表中元素的个数:");
scanf("%d",&n);
creat_list(L,n);
Listmenu();
scanf("%d",&choice);
while(choice!=5)
{
switch (choice)
{
case 1:print_list(L);
break;
case 2:printf("请输入你要查找的元素的位置:\n");
scanf("%d",&i);
if(!Getelem(L,i,e))
break;
printf("第%d个元素的值是%d\n",i,e);
break;
case 3:printf("请输入要插入元素的位置i:\n");
scanf("%d",&i);
printf("请输入要插入元素的值e:\n");
scanf("%d",&e);
ListInsert_L(L,i,e);
break;
case 4:printf("请输入你要删除元素的位置\n");
scanf("%d",&i);
ListDelete_L(L, i, e) ;
break;
default:
printf("输入错误\n");
}
printf("请输入功能号:\n");
scanf("%d",&choice);
}
}
void oper_proy()
{
node pa,pb,L;
int n1,n2,choice,i;
printf("请输入你要建立第一个多项式的系数个数:");
scanf("%d",&n1);
creat_proy(pa,n1);
printf("请输入你要建立第二个多项式的系数个数:");
scanf("%d",&n2);
creat_proy(pb,n2);
Promenu();
scanf("%d",&choice);
while(choice!=4)
{
switch (choice)
{
case 1:addproy(pa,pb);
printf("相加的结果是:");
print_proy(pa);
break;
case 2:subproy(pa,pb);
printf("相减的结果是:");
print_proy(pa);
break;
case 3:mulproy(pa,pb);
break;
default:
printf("输入错误\n");
break;
}
printf("按任意键将回到上一菜单重新选择!\n");
system("pause");
break;
}
}
int main()
{
node L;
node *pa,*pb;
int i,a,n;
about();
Inimenu();
scanf("%d",&a);
while (a!=3)
{
switch (a)
{
case 1:
opera_list();
break;
case 2:
oper_proy();
break;
default:
break;
}
Inimenu();
scanf("%d",&a);
}
}
第2个回答 2010-01-13
多项式相加,也就是合并同类项。
#include <iostream>
using namespace std;
struct list
{
int coef;//系数
int exp;//指数
list *next;
};
list *Creat()//创建带头结点的链表
{
list *h,*r,*s;//h是头结点,存放项的个数,指向第一项
r=h=new list;
h->next=NULL;
while(1)
{
s=new list;
cin>>s->coef>>s->exp;
if(s->coef==0)
break;
if(h->next==NULL)
{
r=s;//r=h->next
h->next=r;
}
else
{
r->next=s;
r=s;
}
}
r->next=NULL;
return h;
}
void Display(list *h)//输出链表
{
list *p;
p=h->next;
cout<<"f(x)=";
while(p)
{
if(p->next!=NULL)
cout<<p->coef<<"X^"<<p->exp<<"+";
else
cout<<p->coef<<"X^"<<p->exp;
p=p->next;
}
cout<<endl;
}
list *Huajian(list *h1)//合并同类项
{
list *p1,*q1,*q2;
for(p1=h1->next;p1;p1=p1->next)
for(q1=p1,q2=q1->next;q2;q1=q2,q2=q2->next)
if(p1->exp==q2->exp)
{
p1->coef+=q2->coef;
q1->next=q2->next;
delete q2;
q2=q1;//q2=q1->next;
}
return h1;
}
list *Multiply(list *h1,list *h2)//实现两个链表相乘
{
list *p1,*p2,*q1;
int c,e;
p1=h1->next;
p2=p1->next;
q1=h2->next;
do
{
c=p1->coef;
e=p1->exp;
while(q1)
{
p1->coef=c*q1->coef;
p1->exp=e+q1->exp;
if(q1->next!=NULL)
{
p1->next=new list;
p1=p1->next;
}
q1=q1->next;
}
q1=h2->next;
p1->next=p2;
p1=p2;
if(p2->next!=NULL)
p2=p2->next;
}while(p2);
h1=Huajian(h1);
return h1;
}
main()
{
list *h1,*h2;
h1=Creat();
Display(h1);
h2=Creat();
Display(h2);
h1=Multiply(h1,h2);
Display(h1);
return 0;
}本回答被提问者采纳