一元多项式的线性表和链表

前言:米有难度,这个学期老师布置的数据结构的课程设计,这边记录下

一元多项式线性表实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 99
void get_menu()
{
printf(" -------------------------------------------------------------------\n");
printf(" |================== 一元多项式的运算 =================|\n");
printf(" |================== 1.相加(+) =================|\n");
printf(" |================== 2.相减(-) =================|\n");
printf(" |================== 3.相乘(*) =================|\n");
printf(" -------------------------------------------------------------------\n");
}
int* init_linner_table()
{
int* p_node = (int*)malloc(sizeof(int)*MAX);
memset(p_node,0,sizeof(int)*MAX);
if(p_node!=NULL)return p_node;
return NULL;
}
int get_size(int* p_node)
{
int num=0;
for(int i=0;i<MAX;i++)
if(p_node[i])num++;
return num;
}
void show_table(int* p_node, char* str)
{
printf("%s: ", str);
// int num=get_size(p_node);
// int count=1;
for(int i=0;i<MAX;i++)
if(p_node[i]!=0)printf("%d*x^%d ", p_node[i], i);
printf("\n");
}
void init_value(int* p_node)
{
int coef,exp,size;
printf("input init size: ");
scanf("%d", &size);
if(size<=0)printf("init_value fail...\n");
for(int i=0;i<size;i++)
{
scanf("%d %d", &coef, &exp);
p_node[exp]+=coef;
}
show_table(p_node, (char*)"init_value");
}
void add(int* p_node1, int* p_node2)
{
int* p_node3 = init_linner_table();
memcpy(p_node3, p_node1, sizeof(int)*MAX);
for(int i=0;i<MAX;i++)
if(p_node2[i]!=0||p_node1[i]!=0)p_node3[i]+=p_node2[i];
show_table(p_node3, (char*)"add");
}
void sub(int* p_node1, int* p_node2)
{
int* p_node3 = init_linner_table();
memcpy(p_node3, p_node1, sizeof(int)*MAX);
for(int i=0;i<MAX;i++)
if(p_node2[i]!=0)p_node3[i]-=p_node2[i];
show_table(p_node3, (char*)"sub");
}
void multi(int* p_node1, int* p_node2)
{
int* p_node3 = init_linner_table();
for(int i=0;i<MAX;i++)
for(int j=0;j<MAX;j++)
if(p_node1[i]!=0&&p_node2[j]!=0)p_node3[i+j]+=p_node1[i]*p_node2[j];
show_table(p_node3, (char*)"multi");
if(p_node3==NULL)free(p_node3);
}
int main()
{
get_menu();
int* p_node1 = init_linner_table();
int* p_node2 = init_linner_table();
init_value(p_node1);
init_value(p_node2);
add(p_node1, p_node2);
sub(p_node1, p_node2);
multi(p_node1, p_node2);
if(p_node1!=NULL)free(p_node1);
if(p_node2!=NULL)free(p_node2);
return 0;
}

一元多项式链表实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _node{
int coef; //系数
int exp; //指数
struct _node *next;
}node;
void get_menu()
{
printf(" -------------------------------------------------------------------\n");
printf(" |================== 一元多项式的运算 =================|\n");
printf(" |================== 1.相加(+) =================|\n");
printf(" |================== 2.相减(-) =================|\n");
printf(" |================== 3.相乘(*) =================|\n");
printf(" -------------------------------------------------------------------\n\n");
}
void create_node2(node* p_before_node, int coef, int exp)
{
node* p_current_node = p_before_node->next;
node* p_new_node = NULL;
int i_flag = 1;
while (p_current_node!=NULL)
{
if (p_current_node->exp>exp)
{
p_new_node = (node*)malloc(sizeof(node));
p_new_node->exp = exp;
p_new_node->coef = coef;
p_new_node->next = p_current_node;
p_before_node->next = p_new_node;
i_flag = 0;
break;
}
else if(p_current_node->exp==exp){
p_current_node->coef += coef;
i_flag = 0;
break;
}
p_before_node = p_current_node;
p_current_node = p_current_node->next;
}
if (i_flag)
{
p_before_node->next = (node*)malloc(sizeof(node));
p_before_node->next->coef = coef;
p_before_node->next->exp = exp;
p_before_node->next->next = NULL;
}
}
void init_value(node* p_node)
{
int coef, exp, size;
printf("input init size: ");
scanf("%d", &size);
for (int i = 0; i<size; i++)
{
scanf("%d %d", &coef, &exp);
create_node2(p_node, coef, exp);
}
}
void show_node(node* p_node)
{
if (p_node == NULL)return;
while (p_node != NULL)
{
printf("%d*x^%d ", p_node->coef, p_node->exp);
p_node = p_node->next;
}
printf("\n");
}
void add(node* p_node1, node* p_node2, char* str)
{
int sum = 0;
node* p_node3 = (node*)malloc(sizeof(node));p_node3->coef = 0;p_node3->exp = 0;p_node3->next = NULL;
printf("====%s====\n", str);
while (p_node1!=NULL&&p_node2!=NULL)
{
if (p_node1->exp == p_node2->exp)
{
sum = p_node1->coef + p_node2->coef;
if (sum)create_node2(p_node3, sum, p_node1->exp);
p_node1 = p_node1->next;
p_node2 = p_node2->next;
}else if (p_node1->exp>p_node2->exp)
{
create_node2(p_node3, p_node2->coef, p_node2->exp);
p_node2 = p_node2->next;
}
else if (p_node1->exp<p_node2->exp)
{
create_node2(p_node3, p_node1->coef, p_node1->exp);
p_node1 = p_node1->next;
}
}
while (p_node1 != NULL&&p_node2 == NULL)
{
create_node2(p_node3, p_node1->coef, p_node1->exp);
p_node1 = p_node1->next;
}
while (p_node1==NULL&&p_node2!=NULL)
{
create_node2(p_node3, p_node2->coef, p_node2->exp);
p_node2 = p_node2->next;
}
show_node(p_node3->next);
}
void sub(node* p_node1, node* p_node2, char* str)
{
int sum_coef = 0;
node* p_node3 = (node*)malloc(sizeof(node));
p_node3->coef = 0;
p_node3->exp = 0;
p_node3->next = NULL;
printf("====%s====\n", str);
while (p_node1 != NULL&&p_node2 != NULL)
{
if (p_node1->exp == p_node2->exp)
{
sum_coef = p_node1->coef - p_node2->coef;
if (sum_coef)create_node2(p_node3, sum_coef, p_node1->exp);
p_node1 = p_node1->next;
p_node2 = p_node2->next;
}
else if (p_node1->exp>p_node2->exp)
{
create_node2(p_node3, p_node2->coef, p_node2->exp);
p_node2 = p_node2->next;
}
else if (p_node1->exp<p_node2->exp)
{
create_node2(p_node3, p_node1->coef, p_node1->exp);
p_node1 = p_node1->next;
}
}
while (p_node1 != NULL&&p_node2 == NULL)
{
create_node2(p_node3, p_node1->coef, p_node1->exp);
p_node1 = p_node1->next;
}
while (p_node1 == NULL&&p_node2 != NULL)
{
create_node2(p_node3, -p_node2->coef, p_node2->exp);
p_node2 = p_node2->next;
}
show_node(p_node3->next);
}
void multi(node* p_node1, node* p_node2, char* str)
{
int sum_coef = 0;
node* p_tmp_node = NULL;
node* p_node3 = (node*)malloc(sizeof(node));
p_node3->coef = 0;
p_node3->exp = 0;
p_node3->next = NULL;
printf("====%s====\n", str);
// multi
while (p_node1!=NULL)
{
p_tmp_node = p_node2;
while (p_tmp_node != NULL)
{
create_node2(p_node3, p_tmp_node->coef*p_node1->coef, p_tmp_node->exp+p_node1->exp);
p_tmp_node = p_tmp_node->next;
}
p_node1 = p_node1->next;
}
show_node(p_node3->next);
}
int main()
{
node* p_node1 = (node*)malloc(sizeof(node));
node* p_node2 = (node*)malloc(sizeof(node));
get_menu();
p_node1->coef = 0;
p_node1->exp = 0;
p_node1->next = NULL;
p_node2->coef = 0;
p_node2->exp = 0;
p_node2->next = NULL;
init_value(p_node1);
show_node(p_node1->next);
init_value(p_node2);
show_node(p_node2->next);
add(p_node1->next, p_node2->next, (char*)"add");
sub(p_node1->next, p_node2->next, (char*)"sub");
multi(p_node1->next, p_node2->next, (char*)"multi");
return 0;
}
posted @   zpchcbd  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示