顺序表实现多项式相加

数据结构学习之路——顺序表

本文思路参考:https://blog.csdn.net/seu_nuaa_zc/article/details/73136455

题目如下:

#include 
#include 
/** =====================存储结构定义 开始======================= */
#define MAX_SIZE 128
/*顺序表中元素的类型,描述多项式中每一项的系数和指数*/
typedef struct _Elem
{
  int coe;  /*系数*/
  int exp;  /*指数*/
} Elem;
typedef struct _SeqMult
{
  Elem data[MAX_SIZE];
  int last;
} SeqMult;
void sm_init(SeqMult *ptr_sm);/*插入成功返回1,插入失败返回0;*/
void sm_create(SeqMult *ptr_sm);
void sm_print(SeqMult *ptr_sm);
void sm_add(SeqMult *ptr_sm1, SeqMult *ptr_sm2, SeqMult *ptr_res);
/****************
 * 多项式相加
 * @param ptr_sm1 第一个多项式
 * @param ptr_sm2 第二个多项式
 * @param ptr_res 相加结果
 ****************************************/
int main()
{
  SeqMult sm1, sm2, sm_res, *ptr_sm1, *ptr_sm2, *ptr_res;
  
  ptr_sm1 = &sm1;
  ptr_sm2 = &sm2;
  ptr_res = &sm_res;
  
  /*初始化空*/
  sm_init(ptr_sm1);
  sm_init(ptr_sm2);
  sm_init(ptr_res);
  
  sm_create(ptr_sm1);/*创建第一个多项式*/
  sm_print(ptr_sm1); 
  
  sm_create(ptr_sm2);/*创建第二个多项式*/
  sm_print(ptr_sm2);/*输出第二个多项式*/
  
  sm_add(ptr_sm1,ptr_sm2, ptr_res);/*相加*/
  sm_print(ptr_res);/*输出结果*/

  return(0);
 }
void sm_init(SeqMult *ptr_sm)
{
  ptr_sm->last = -1;
}
int sm_insert(SeqMult *ptr_sm, int coe, int exp)
{
  /*填写代码,完成多项式插入功能*/
  /*
  注意:
  1. ptr_sm指向当前的多项式顺序表
  2. 当前多项式顺序表按照每一项的的指数递增有序。
  3. 插入后,当前的多项式顺序表依然按照指数递增有序
  */
}
void sm_create(SeqMult *ptr_sm)
{
  int count, i;
  int coe, exp;
  int ok;
  
  scanf("%d", &count);
  ok = 1;
  for(i=0; i<count; i++) 
  {
    scanf("%d(%d)", &coe, &exp);
    ok = sm_insert(ptr_sm, coe, exp);
    if(!ok) {
      break;
    }
  }  
}
void sm_print(SeqMult *ptr_sm)
{
  int i;
  
  for(i=0; i<=ptr_sm->last; i++) {
    if(i != 0) {
      if(ptr_sm->data[i].coe > 0) {
        printf(" + ");
      }
      else if(ptr_sm->data[i].coe < 0) {
        printf(" - "); 
      }
      printf("%d*X^%d", abs(ptr_sm->data[i].coe), ptr_sm->data[i].exp);
    }
    else {
      printf("%d*X^%d", ptr_sm->data[i].coe, ptr_sm->data[i].exp);
    }
  }
  printf("\n");
}
void sm_add(SeqMult *ptr_sm1, SeqMult *ptr_sm2, SeqMult *ptr_res)
{
  /*填写代码,完成多项式相加功能*/
  /*
  注意:
  1. ptr_sm1,ptr_sm2分别指向相加的两个多项式顺序表
  2. ptr_res指向的多项式顺序表将被清空,相加的结果存储到ptr_res指向的顺序表中。
  3. ptr_sm1,ptr_sm2多项式都按照指数递增有序
  */
}

已知大致函数结构,补齐插入函数和多项式相加函数。
思路如下 :
1、插入后,首先有一个排序过程为题目要求,按照指数大小排序,这里我们采用简单的顺序表插入方法+冒泡排序实现。

int sm_insert(SeqMult *ptr_sm, int coe, int exp)
{
	 Elem tmp;
	 int i, j;
	 if (ptr_sm->last == MAX_SIZE - 1)
	 {
	 	 return 0;
	 }
 	 ptr_sm->last++;
	 ptr_sm->data[ptr_sm->last].coe = coe;
 	 ptr_sm->data[ptr_sm->last].exp = exp;
	 for (i = 1; i<=ptr_sm->last; i++)
 	 {
 		 tmp = ptr_sm->data[i];
  		 j = i - 1;
 		 while (j >= 0 && ptr_sm->data[j].exp > tmp.exp)
  		{
   			ptr_sm->data[j + 1] = ptr_sm->data[j];
   			j--;
  		}
  		ptr_sm->data[j + 1] = tmp;
 	}
 	return 1;
}

2、进行多项式相加时,先逐个判断相同项,当有相同项时,进行相加。
3、若无出现相同项,则放到最后进行处理。

void sm_add(SeqMult *ptr_sm1, SeqMult *ptr_sm2, SeqMult *ptr_res)
{
	int i = 0, j = 0, k = 0;
 	float c;
 	while (i < ptr_sm1->last + 1 && j < ptr_sm2->last + 1)
 	{
  		if (ptr_sm1->data[i].exp < ptr_sm2->data[j].exp)
  		{
			ptr_res->data[k].exp = ptr_sm1->data[i].exp;
			ptr_res->data[k].coe = ptr_sm1->data[i].coe;
			i++;
			k++;
		}
  		else if (ptr_sm1->data[i].exp > ptr_sm2->data[j].exp)
    		{
			ptr_res->data[k].exp = ptr_sm2->data[j].exp;
			ptr_res->data[k].coe = ptr_sm2->data[j].coe;
			j++;	
			k++;
   		}
    		else      
    		{
			c = ptr_sm1->data[i].coe + ptr_sm2->data[j].coe;
   			if (c != 0)
   			{
				ptr_res->data[k].exp = ptr_sm1->data[i].exp;
				ptr_res->data[k].coe = c;
				k++;
  			}
			i++;
			j++;
 		}
 	}
	while (i < ptr_sm1->last+1 )
 	{
		ptr_res->data[k].exp = ptr_sm1->data[i].exp;
  		ptr_res->data[k].coe = ptr_sm1->data[i].coe;
  		i++; 
  		k++;
	}
	while (j < ptr_sm2->last+1 )
	{
		ptr_res->data[k].exp = ptr_sm2->data[j].exp;
		ptr_res->data[k].coe = ptr_sm2->data[j].coe;
		j++; 
		k++;
	}
	ptr_res->last = k-1;
}

本文只用于记录学习经验。
代码从华为云复制到这里的过程中可能出现问题,若有问题,请指出,谢谢。

你可能感兴趣的:(C,数据结构,顺序表,多项式相加)