内容:
多项式相加:完成两个多项式的相加操作。要求使用链式存储结构实现
多项式相减:完成两个多项式的相减操作。要求使用链式存储结构实现以单链表示集合,假设集合A用单链表LA表示,集合B用单链表LB表示,设计算法求两个集合的差,既A-B。
算法分析:
多项式相加:利用以下的四个函数具体完成两个多项式的相加操作:
1.函数Init( )用来初始化一个空链表;
2.函数CreateFromTail()用来创建一个链表;
3.函数Polyadd()用来实现两个多项式相加算法;
4.函数Print()用来输出多项式。
两个多项式相加算法的实现,首先是将两个多项式分别用链表进行存放。可以设置两个指针分别从多项式的首结点移动。
多项式相减:利用以下的四个函数具体完成两个多项式的相加操作:
1.函数Init( )用来初始化一个空链表;
2.函数CreateFromTail()用来创建一个链表;
3.函数Polysub()用来实现两个多项式相加算法;
4.函数Print()用来输出多项式。
两个多项式相减算法的实现,首先是将两个多项式分别用链表进行存放。可以设置两个指针分别从多项式的首结点移动。
集合的差A-B中包含所有属于集合A而不属于集合B的元素,对于集合A中的每个元素e,在集合B的链表LB上进行查找,若存在相同元素,则从LA中删除。
流程图:
多项式相加:
多项式相减:
集合加减:
代码如下:
多项式相加:
/*author:雷桂艺
time:2021年12月6日15:05
version:1.0
description:利用以下的四个函数具体完成两个多项式的相加操作:
1.函数Init( )用来初始化一个空链表;
2.函数CreateFromTail()用来创建一个链表;
3.函数Polyadd()用来实现两个多项式相加算法;
4.函数Print()用来输出多项式。
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct poly {
int exp; //指数幂
int coef; //系数
struct poly* next; //指针域
}PNode, *PLinklist;
int Init(PLinklist* head) //链表初始化
{
*head = (PLinklist)malloc(sizeof(PNode));
if (*head) {
(*head)->next = NULL;
return 1;
}
else
return 0;
}
int CreateFormTail(PLinklist* head) //尾插法创造链表
{
PNode* pTemp, *pHead;
int c; //存放系数
int exp; //存放指数
int i = 1; //计数器提示用户输入第几项
pHead = *head;
scanf_s("%d,%d", &c, &exp);
while (c != 0) //系数为0表示结束输入
{
pTemp = (PLinklist)malloc(sizeof(PNode));
if (pTemp)
{
pTemp->exp = exp; //接收指数
pTemp->coef = c; //接收系数
pTemp->next = NULL;
pHead->next = pTemp;
pHead = pTemp;
scanf_s("%d,%d", &c, &exp);
}
else
return 0;
}
return 1;
}
void Polyadd(PLinklist LA, PLinklist LB) //两个多项式相加,该方法中两个表都是按指数顺序增长
{ //对指数进行对比分三类情况:A<B时将A链到LA后,A==B时比较系数,A>B时将B链到表中
PNode* LA1 = LA->next; //用于在LA中移动
PNode* LB1 = LB->next; //用于在LB中移动
//*LA与*LB在充当LA1与LB1的前驱
PNode* temp; //保存要删除的节点
int sum = 0; //存放系数的和
while (LA1 && LB1)
{
if (LA1->exp < LB1->exp)
{
LA->next = LA1; //LA的前结点可能是LB1或LA1
LA = LA->next;
LA1 = LA1->next;
}
else if (LA1->exp == LB1->exp) //指数相等系数相加
{
sum = LA1->coef + LB1->coef;
if (sum) //系数不为0,结果存入LA1中,同时删除LB1
{
LA->coef = sum;
LA->next = LA1;
LA = LA->next;
LA1 = LA1->next;
temp = LB1;
LB1 = LB1->next;
free(temp);
}
else //系数为0的条件下删除两个结点
{
temp = LA1;
LA1 = LA1->next;
free(temp);
temp = LB1;
LB1 = LB1->next;
free(temp);
}
}
else
{
LA->next = LB1;
LA = LA->next;
LB1 = LB1->next;
}
}
if (LA1) //将剩余结点链入链表
LA->next = LA1;
else
LA->next = LB1;
}
void Print(PLinklist head)//输出多项式
{
head = head->next;
while (head)
{
if (head->exp)
printf("%dx^%d", head->coef, head->exp);
else
printf("%d", head->coef);
if (head->next)
printf("+");
else
break;
head = head->next;
}
}
int main()
{
PLinklist LA; //多项式列表LA
PLinklist LB; //多项式列表LB
Init(&LA);
Init(&LB);
printf("输入第一个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
CreateFormTail(&LA);
printf("输入第二个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
CreateFormTail(&LB);
Print(LA);
printf("\n");
Print(LB);
printf("\n");
Polyadd(LA, LB);
printf("两个多项式相加的结果:\n");
Print(LA); //相加后结果保存到LA中,打印LA
printf("\n");
}
多项式相减:
/*author:雷桂艺
time:2021年12月6日15:05
version:1.0
description:利用以下的四个函数具体完成两个多项式的相减操作:
1.函数Init( )用来初始化一个空链表;
2.函数CreateFromTail()用来创建一个链表;
3.函数Polysub()用来实现两个多项式相加算法;
4.函数Print()用来输出多项式。
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct poly {
int exp; //指数幂
int coef; //系数
struct poly* next; //指针域
}PNode, *PLinklist;
int Init(PLinklist* head) //链表初始化
{
*head = (PLinklist)malloc(sizeof(PNode));
if (*head) {
(*head)->next = NULL;
return 1;
}
else
return 0;
}
int CreateFormTail(PLinklist* head) //尾插法创造链表
{
PNode* pTemp, *pHead;
int c; //存放系数
int exp; //存放指数
int i = 1; //计数器提示用户输入第几项
pHead = *head;
scanf_s("%d,%d", &c, &exp);
while (c != 0) //系数为0表示结束输入
{
pTemp = (PLinklist)malloc(sizeof(PNode));
if (pTemp)
{
pTemp->exp = exp; //接收指数
pTemp->coef = c; //接收系数
pTemp->next = NULL;
pHead->next = pTemp;
pHead = pTemp;
scanf_s("%d,%d", &c, &exp);
}
else
return 0;
}
return 1;
}
void Polysub(PLinklist LA, PLinklist LB) //两个多项式相减,该方法中两个表都是按指数顺序增长
{ //对指数进行对比分三类情况:A<B时将A链到LA后,A==B时比较系数,A>B时将B链到表中
PNode* LA1 = LA->next; //用于在LA中移动
PNode* LB1 = LB->next; //用于在LB中移动
//*LA与*LB在充当LA1与LB1的前驱
PNode* temp; //保存要删除的节点
int differ = 0; //存放系数的差
while (LA1 && LB1)
{
if (LA1->exp < LB1->exp)
{
LA->next = LA1; //LA的前结点可能是LB1或LA1
LA = LA->next;
LA1 = LA1->next;
}
else if (LA1->exp == LB1->exp) //指数相等系数相减
{
differ = LA1->coef - LB1->coef;
if (differ) //系数不为0,结果存入LA1中,同时删除LB1
{
LA->coef = differ;
LA->next = LA1;
LA = LA->next;
LA1 = LA1->next;
temp = LB1;
LB1 = LB1->next;
free(temp);
}
else //系数为0的条件下删除两个结点
{
temp = LA1;
LA1 = LA1->next;
free(temp);
temp = LB1;
LB1 = LB1->next;
free(temp);
}
}
else
{
LA->next = LB1;
LA = LA->next;
LB1 = LB1->next;
}
}
if (LA1) //将剩余结点链入链表
LA->next = LA1;
else
LA->next = LB1;
}
void Print(PLinklist head)//输出多项式
{
head = head->next;
while (head)
{
if (head->exp)
printf("%dx^%d", head->coef, head->exp);
else
printf("%d", head->coef);
if (head->next)
printf("+");
else
break;
head = head->next;
}
}
int main()
{
PLinklist LA; //多项式列表LA
PLinklist LB; //多项式列表LB
Init(&LA);
Init(&LB);
printf("输入第一个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
CreateFormTail(&LA);
printf("输入第二个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
CreateFormTail(&LB);
Print(LA);
printf("\n");
Print(LB);
printf("\n");
Polysub(LA, LB);
printf("两个多项式相减的结果:\n");
Print(LA); //相减后结果保存到LA中,打印LA
printf("\n");
}
题目2-6:
/*author:雷桂艺
time:2021年12月6日11:45
version:1.0
description:由题意可知,集合的差A-B中包含所有属于集合A而不属于集合B的元素,对于集合A中的每个元素e,在集合B的链表LB上进行查找,若存在相同元素,则从LA中删除。
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
typedef int ElemType;
typedef struct node
{
int data;//数据域
struct node *next;//指针域
} LNode, *LinkList;
//生成随机单链表:
void CreatListHead(LinkList *L, int n)
{
LinkList p;
int i;
srand(time(0));
*L = (LinkList)malloc(sizeof(node));
(*L)->next = NULL;
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(node));
p->data = rand() % 20 + 1;
p->next = (*L)->next;
(*L)->next = p;
}
}
void Difference(LinkList LA, LinkList LB)
//此算法求两个集合的差集
{
LinkList pre, p, r,q;
pre = LA; p = LA->next;//p指向LA表中的某一节点,而pre始终指向p的前驱
while (p != NULL)
{
q = LB->next;
while (q!= NULL&&q->data != p->data)
{
q = q->next;
}
if (q != NULL)
{
r = p;
pre->next = p->next;
p = p->next;
free(r);
}
else
{
pre = p;
p = p->next;
}
}//while(p!=NULL)
}
//输出单链表
void Showlist(LinkList L)
{
LinkList p;
p = L->next;
while (p != NULL)
{
printf("%d,", p->data);
p = p->next;
}
}
void main()
{
LinkList LA;
LinkList LB;
CreatListHead(&LA, 15);
CreatListHead(&LB, 10);
printf("集合A的元素:\n");
Showlist(LA);
printf("\n");
printf("集合B的元素:\n");
Showlist(LB);
printf("\n");
printf("集合A-B的元素:\n");
Difference(LA, LB);
Showlist(LA);
printf("\n");
}