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

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

一元多项式线性表实现

#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 @ 2022-06-08 13:26  zpchcbd  阅读(40)  评论(0)    收藏  举报