一元多项式的表示及相加

#include"stdlib.h"
#include"string.h"
typedef struct listnode{
int xishu;
int zhishu;
struct listnode* next;
}listnode;

listnode* init()
{
listnode* head = (listnode*)malloc(sizeof(listnode));
if (head == NULL){ return ; }
head->xishu = 0;
head->zhishu = -1;
head->next = NULL;
return head;
}

listnode* createnode(int a, int b)
{
listnode* tmp = (listnode*)malloc(sizeof(listnode));
if (tmp == NULL){ return; }
tmp->xishu = a;
tmp->zhishu = b;
tmp->next = NULL;
return tmp;
}
//尾插,返回插入之后的长度
int appenditem(listnode* list, int a, int b)
{
listnode* addnode = createnode(a, b);
listnode* tmp = list;
int i = 0;
for(; tmp->next != NULL; i++)
{
tmp = tmp->next;
}
tmp->next = addnode;
return i + 1;
}
//打印表达式
void printlist(listnode* list)
{
char buffer[20];
char s[200]="";
if (list == NULL){ return; }
listnode* tmp = list;
for (; tmp->next != NULL;)
{
tmp = tmp->next;
if (tmp->next == NULL){
sprintf_s(buffer, sizeof(buffer), “%d%c%d”, tmp->xishu, ‘X’, tmp->zhishu);
}
else{
sprintf_s(buffer,sizeof(buffer),"%d%c%d%c",tmp->xishu,‘X’,tmp->zhishu,’+’);
}
strcat_s(s,200,buffer);
}
printf("%s\n",s);
}
//对两个一元多项式进行加法
listnode* addlist(listnode* list1, listnode* list2)
{
if (list1 == NULL || list2 == NULL){ return NULL; }
listnode* sum = init();
listnode* tmp = NULL;
list1 = list1->next;
list2 = list2->next;
while(list1!=NULL&&list2!=NULL)
{
if (list1->zhishu < list2->zhishu)
{
tmp = list1;
list1 = list1->next;
}
if (list1->zhishu>list2->zhishu)
{
tmp = list2;
list2 = list2->next;
}
else
{
tmp = createnode((list1->xishu)+(list2->xishu),list1->zhishu);
list1 = list1->next;
list2 = list2->next;
}
appenditem(sum,tmp->xishu,tmp->zhishu);
}
if (list1== NULL)
{
while (list2!= NULL)
{
appenditem(sum,list2->xishu,list2->zhishu);
list2 = list2->next;
}
}
else
{
while (list1 != NULL)
{
appenditem(sum, list1->xishu, list1->zhishu);
list1 = list1->next;
}
}
return sum;
}
//手动创建一元多项式表达式
void createlist(listnode* list)
{
int i = 1;
int a;
int b;
//char* c=NULL;为什么这里用指针,scanf接收的时候会出错呢,用字符数组接收不出错呢
char c[10];
do{
printf(“请输入第%d个项\n”,i);
scanf("%d%d", &a,&b);
appenditem(list,a,b);
printf(“你已经输入了%d个项,是否继续输入,回答是或否\n”,i);
scanf("%s",c);
i++;
} while (strcmp(c,“是”)==0);
}

void main()
{
listnode* A = init();
createlist(A);
puts(“第一个表达式:”);
printlist(A);
listnode* B = init();
createlist(B);
puts(“第二个表达式:”);
printlist(B);
listnode* sum=addlist(A,B);
puts(“两个表达式之和:”);
printlist(sum);
system(“pause”);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值