题目:
p1为m项多项式,p2为n项多项式,求p3=p1+p2。
要求:
1.使用单向链表;
2.化简;
例:
结构体:
typedef struct node{
int coef; //系数
int expon; // 指数
struct node *next;
}PolyList_t;
模块代码:
1.创建表头:
/*****************************
*创建链表
*
******************************/
PolyList_t *PolyList_create() //创建链表
{
PolyList_t *head = (PolyList_t *)malloc(sizeof(PolyList_t)); //开辟一个内存空间
if(head == NULL) //如果开辟空间失败,报错
{
perror("malloc!\n");
return NULL;
}
head->next = NULL;
return head; //返回表头
}
2.向链表插入数据,在表尾插入数据
/*****************************
*插入数据
*
******************************/
void PolyList_insert(PolyList_t *head, int c,int e)
{
if(head == NULL)
{
perror("head is NULL!\n");
return ;
}
PolyList_t *p = head; //指针指向表头
PolyList_t *news =(PolyList_t *)malloc(sizeof(PolyList_t)); //为新添加的结构体数据开辟空间
if(news==NULL)
{
perror("new!\n");
return ;
}
news->coef = c;
news->expon = e;
news->next = NULL;
while( p->next!= NULL ) //循环遍历,指针指向表尾
{
if(p->next->expon == e)
{
p->next->coef += c;
return ;
}
p = p->next;
}
p->next = news; //表尾的next指向需要添加数据的地址
return ;
}
3.展示链表,分指数的几种情况,展示多项式。
void displayPloy(PolyList_t *head)
{
if(head == NULL)
{
perror("head is NULL!\n");
return ;
}
PolyList_t *p=head->next;
while( p!=NULL )
{
if(p->coef != 0 )
{
if(p->coef == 1)
printf("x^%d",p->expon);
else
if(p->expon!=0)
printf("%d*x^%d",p->coef,p->expon);
else
printf("%d",p->coef);
if(p->next != NULL)
printf(" + ");
}
p = p->next;
}
printf("\n");
return ;
}
4.链表排序,将多显示按照系数大小排序。
/*****************************
*排序算法
*冒泡排序
******************************/
void PolyList_paixu(PolyList_t *head)
{
if(head == NULL) //如果开辟空间失败,报错
{
perror("malloc!\n");
return ;
}
int c,e;
PolyList_t *p = head->next;
PolyList_t *q = head->next;
while(p!=NULL)
{
while(q->next!=NULL)
{
if( q->expon > q->next->expon)
{
e = q->expon;
q->expon = q->next->expon;
q->next->expon =e;
c = q->coef;
q->coef = q->next->coef;
q->next->coef = c;
}
q = q->next;
}
q = head->next;
p = p->next;
}
return ;
}
5.链表相加,p1、p2相加得p3。
//比较函数
int cmp(int a,int b){
if(a>b)
return 1;
else if(a==b)
return 0;
else
return -1;
}
void AddPoly(PolyList_t *pa, PolyList_t *pb, PolyList_t *pc) //多项式加法
{
PolyList_t *q1,*q2;
q1=pa->next;
q2=pb->next;
while(q1!=NULL || q2!=NULL)
{
if(q1 != NULL && q2 == NULL )
{
while(q1!=NULL)
{
PolyList_insert(pc, q1->coef,q1->expon);
q1=q1->next;
}
}
else
if(q1 == NULL && q2 != NULL)
{
while(q2!=NULL)
{
PolyList_insert(pc, q2->coef,q2->expon);
q2=q2->next;
}
}
else
{
switch(cmp(q1->expon,q2->expon))
{
case -1: //q1<q2
{
PolyList_insert(pc, q1->coef,q1->expon);
q1=q1->next;
break;
}
case 0: //q1=q2
{
PolyList_insert(pc,(q1->coef+q2->coef),q1->expon);
q1=q1->next;
q2=q2->next;
break;
}
case 1: //q1>q2
{
PolyList_insert(pc, q2->coef,q2->expon);
q2=q2->next;
break;
}
}
}
}
return ;
}
链表的主要运用为链表的创建、删除,链表的数据的增、删、改、查,将几个功能掌握后就能完成。
以下时全部代码,若有不懂的,可私信我。
总代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node{
int coef; //系数
int expon; // 指数
struct node *next;
}PolyList_t;
PolyList_t *PolyList_create(); //创建一个链表表头
void PolyList_insert(PolyList_t *head, int c,int e); //插入数据
void displayPloy(PolyList_t *p); //显示数据
void PolyList_paixu(PolyList_t *head);
void AddPoly(PolyList_t *pa, PolyList_t *pb, PolyList_t *pc); //相加
int main(){
PolyList_t *p1,*p2,*p3;
int i;
int c1,e1,n1; //多项式1的系数和指数,项数
int c2,e2,n2; //多项式2的系数和指数,项数
p1 = PolyList_create(); //创建多项式1的表头
printf("请输入多项式pl的项数:");
scanf("%d",&n1);
printf("输入系数和指数(以空格隔开,回车结束):\n");
for(i=0;i<n1;i++)
{
scanf("%d %d",&c1,&e1);
getchar();
PolyList_insert(p1,c1,e1);
}
printf("第一个多项式内容:");
displayPloy(p1);
//printf("排序:");
PolyList_paixu(p1);
//displayPloy(p1);
p2 = PolyList_create(); //创建多项式2的表头
printf("请输入多项式p2的项数:");
scanf("%d",&n2);
printf("输入系数和指数(以空格隔开,回车结束):\n");
for(i=0;i<n2;i++)
{
scanf("%d %d",&c2,&e2);
getchar();
PolyList_insert(p2,c2,e2);
}
printf("第二个多项式内容:");
displayPloy(p2);
PolyList_paixu(p2);
p3 = PolyList_create();
if(p3 == NULL)
{
perror("p3!\n");
}
AddPoly(p1,p2,p3); //加法操作
printf("多项式p1和p2相加后的结果是:");
displayPloy(p3);
return 0;
}
/*****************************
*排序算法
*
******************************/
void PolyList_paixu(PolyList_t *head)
{
if(head == NULL) //如果开辟空间失败,报错
{
perror("malloc!\n");
return ;
}
int c,e;
PolyList_t *p = head->next;
PolyList_t *q = head->next;
while(p!=NULL)
{
while(q->next!=NULL)
{
if( q->expon > q->next->expon)
{
e = q->expon;
q->expon = q->next->expon;
q->next->expon =e;
c = q->coef;
q->coef = q->next->coef;
q->next->coef = c;
}
q = q->next;
}
q = head->next;
p = p->next;
}
return ;
}
/*****************************
*创建链表
*
******************************/
PolyList_t *PolyList_create() //创建链表
{
PolyList_t *head = (PolyList_t *)malloc(sizeof(PolyList_t)); //开辟一个内存空间
if(head == NULL) //如果开辟空间失败,报错
{
perror("malloc!\n");
return NULL;
}
head->next = NULL;
return head;
}
/*****************************
*插入数据
*
******************************/
void PolyList_insert(PolyList_t *head, int c,int e)
{
if(head == NULL)
{
perror("head is NULL!\n");
return ;
}
PolyList_t *p = head; //指针指向表头
PolyList_t *news =(PolyList_t *)malloc(sizeof(PolyList_t)); //为新添加的结构体数据开辟空间
if(news==NULL)
{
perror("new!\n");
return ;
}
news->coef = c;
news->expon = e;
news->next = NULL;
while( p->next!= NULL ) //循环遍历,指针指向表尾
{
if(p->next->expon == e)
{
p->next->coef += c;
return ;
}
p = p->next;
}
p->next = news; //表尾的next指向需要添加的结构体的地址
return ;
}
int cmp(int a,int b){
if(a>b)
return 1;
else if(a==b)
return 0;
else
return -1;
}
void AddPoly(PolyList_t *pa, PolyList_t *pb, PolyList_t *pc) //多项式加法
{
PolyList_t *q1,*q2;
q1=pa->next;
q2=pb->next;
while(q1!=NULL || q2!=NULL)
{
if(q1 != NULL && q2 == NULL )
{
while(q1!=NULL)
{
PolyList_insert(pc, q1->coef,q1->expon);
q1=q1->next;
}
}
else
if(q1 == NULL && q2 != NULL)
{
while(q2!=NULL)
{
PolyList_insert(pc, q2->coef,q2->expon);
q2=q2->next;
}
}
else
{
switch(cmp(q1->expon,q2->expon))
{
case -1: //q1<q2
{
PolyList_insert(pc, q1->coef,q1->expon);
q1=q1->next;
break;
}
case 0: //q1=q2
{
PolyList_insert(pc,(q1->coef+q2->coef),q1->expon);
q1=q1->next;
q2=q2->next;
break;
}
case 1: //q1>q2
{
PolyList_insert(pc, q2->coef,q2->expon);
q2=q2->next;
break;
}
}
}
}
return ;
}
void displayPloy(PolyList_t *head)
{
if(head == NULL)
{
perror("head is NULL!\n");
return ;
}
PolyList_t *p=head->next;
while( p!=NULL )
{
if(p->coef != 0 )
{
if(p->coef == 1)
printf("x^%d",p->expon);
else
if(p->expon!=0)
printf("%d*x^%d",p->coef,p->expon);
else
printf("%d",p->coef);
if(p->next != NULL)
printf(" + ");
}
p = p->next;
}
printf("\n");
return ;
}