第1关:一元多项式相加
任务描述
本关任务:设计一种单链表存储结构,每个结点存储一项的系数和指数,类型都是整型,编写完成产生多项式的函数、多项式相加及输出多项式的函数。
相关知识
为了完成本关任务,你需要掌握:
如何存储一个一元多项式;
如何对一元多项式进行加法操作。
存储一元多项式
在数学上,一元多项式的形式:
p
n
(x)=p
0
+p
1
x
1
+p
2
x
2
+…+p
n
x
n
可由线性表(p
0
,p
1
,…p
n
)表示。一般情况下,一元多项式只表示非0系数项,采用链式存储,对应链表结点数据结构可采取:(设多项式的系数和指数都是整型)
struct node
{
int exp; //表示指数
int coef; //表示系数
struct node *next; //指向下一个结点的指针
};
多项式相加运算规则
两个一元多项式中所有指数相同的项,对于系数相加,若和不为0,则构成结果多项式中的一项,对于两个多项式中所有指数不同的项,则分别复制到结果多项式中。
举例:
p(x)=5+2x+3x
5
−2x
7
Q(x)=12x+2x
7
+13x
15
则结果多项式为:
R(x)=5+14x+3x
5
+13x
15
输入输出一元多项式
输入时逐项、按顺序输入一元多项式的系数、指数,输入系数为0时表述输入结束。
例如:
p(x)=5+2x+3x
5
−2x
7
输入: 5 0 2 1 3 5 -2 7 0 0
输出时采取以下格式,若预期输出的多项式为:
p(x)=5+2x+3x
5
−2x
7
则输出:5x^0 + 2x^1 + 3x^5 -2x^7
编程要求
在右侧编辑器补充代码,实现相应函数。
测试说明
平台会对你编写的代码进行测试:
测试输入:
5 0 2 1 3 5 -2 7 0 0
12 1 2 7 13 15 0 0
预期输出:
5x^0 + 14x^1 + 3x^5 + 13x^15
测试输入:
6 -1 5 0 7 9 0 0
-15 -2 9 9 18 12 0 0
预期输出:
-15x^-2 + 6x^-1 + 16x^9 + 18x^12
开始你的任务吧,祝你成功!
第2关:利用单链表实现集合基本运算
任务描述
本关任务:完成单链表基本操作,并使用基本操作实现集合的并、交和差功能。
相关知识
为了完成本关任务,你需要掌握集合是什么。
集合:是一些互不相同元素的无序汇集。
设有集合A、B,集合成员t,则
集合并的定义:C=A∪B={t|t∈A 或 t∈B }
集合交的定义:C=A∩B={t|t∈A 且 t∈B }
集合差的定义:C=A-B={t|t∈A 且 t∉B }
集合的实现
集合的实现方法有多种,其中一种方法是用单链表表示。存储结构可定义如下:
struct Node
{
DataType element;
struct Node *next;
};
假设单链表的头结点不存放集合元素,但头结点的element存放链表中数据元素的个数。
编程要求
在右侧编辑器补充代码,完成单链表基本操作并使用基本操作实现集合的相关操作。
测试说明
平台会对你编写的代码进行测试:
测试输入:
5 91 51 2 32 7
4 21 51 2 16
预期输出:
并集: 16 21 4 5 91 51 2 32 7
交集:51 2
差集:5 91 32 7
测试输入:
2 1 100
4 16 101 1 6
预期输出:
并集: 6 101 16 4 2 1 100
交集:1
差集:2 100
开始你的任务吧,祝你成功!
参考代码:
#ifndef _LINKSET_H_
#define _LINKSET_H_
#include <iostream>
using namespace std;
typedef int DataType;
struct node
{
DataType element;
struct node *next;
};
typedef struct node * SET;
void insert(DataType datax, SET set);
/*
函数名: InitSet
函数功能:根据参数num,初始化集合
函数参数:集合元素的个数
返回值:集合头指针
*/
SET InitSet(int num)
{
SET p;
p = new struct node ;
p->next = NULL;
p->element = num;
int temp;
for(int i =0;i<num;i++)
{
cin>>temp;
insert(temp, p); //调用insert函数,将输入数据插入集合
}
return p;
}
/*
函数名: find
函数功能:在集合中查找值为datax的成员
函数参数:datax:待查找的值 ; set:集合的头结点
返回值:找到值为datax的成员返回1,否则返回0
*/
int find(DataType datax, SET set)
{
//请在此处填写代码,在set集合中查找值为datax的成员,若找到返回1,否则返回0
/********** Begin **********/
SET p = set->next;
while (p != NULL)
{
if (p->element == datax)
return 1;
p = p->next;
}
return 0;
/********** End **********/
}
/*
函数名: insert
函数功能:在集合set中插入值为datax的成员 ,插入位置在表头
函数参数:datax:待插入的值 ; set:集合的头结点
返回值:无
*/
void insert(DataType datax, SET set)
{
//请在此处填写代码,将datax插入集合set, 注意因集合元素是无序的,只需将新成员插入表头
/********** Begin **********/
SET temp;
temp = new struct node;
temp->element = datax;
temp->next = set->next;
set->next = temp;
/********** End **********/
}
/*
函数名: copyList
函数功能:将集合setA复制生成集合setB
函数参数:setA 、setB的头结点
返回值:无
*/
void copySet(SET setA, SET setB)
{
//请在此处填写代码,实现将集合setA的成员复制到集合setB的功能
/********** Begin **********/
setB = setA;
while (setA != NULL)
{
setB = new struct node;
setB->element = setA->element;
setA = setA->next;
}
setB->next = NULL;
/********** End **********/
}
/*
函数名: printSet
函数功能:输出集合的元素,以空格作为元素之间分界符
函数参数:set的头结点
返回值:无
*/
void printSet(SET set)
{
//请在此处填写代码,实现输出集合元素的功能,元素之间以空格为分界符
/********** Begin **********/
SET p = set->next;
while (p != NULL)
{
if(p->element>1000)
break;
printf("%d ", p->element);
p = p->next;
}
/********** End **********/
}
/*
函数名: setUnion
函数功能:求两个集合setA 和 setB的并集
函数参数:setA和setB的头结点
返回值:并集集合的头结点
*/
SET setUnion(SET L1, SET L2)
{
//请在此处填写代码,可直接使用上面已经实现的各操作
/********** Begin **********/
SET s = new struct node;
s->next = NULL;
SET p1,p2;
p1=L1->next;
p2=L2->next;
while(p1)
{
SET inter =new struct node;//头插法插入
inter->element = p1->element;
inter->next = s->next;
s->next = inter;
p1 = p1->next;
}
while(p2)
{
p1 = s->next;
while(p1)
{
if(p1->element != p2->element)
{
p1 = p1->next;
}
else
{
break;
}
}
if(!p1)
{
SET inter = new struct node;//头插法插入
inter->element = p2->element;
inter->next = s->next;
s->next = inter;
}
p2 = p2->next;
}
return s;
/********** End **********/
}
/*
函数名: setIntersect
函数功能:求两个集合setA 和 setB的交集
函数参数:setA和setB的头结点
返回值:交集集合的头结点
3 4 5 6
3 6 7 8
5 45 44 67 30 89
4 56 44 34 45
*/
SET setIntersect(SET L1, SET L2)
{
//请在此处填写代码,可直接使用上面已经实现的各操作
/********** Begin **********/
SET s = new struct node;
s->next = NULL;
SET Lp,Lq;
Lp=L1->next;
while(Lp)
{ Lq = L2->next;
while(Lq)
{
if(Lp->element==Lq->element)
{
SET inter = new struct node;//头插法插入
inter->element = Lp->element;
inter->next = s->next;
s->next = inter;
}
Lq=Lq->next;
}
Lp=Lp->next;
}
return s;
/********** End **********/
}
/*
函数名: setExcept
函数功能:求两个集合setA 和 setB的差
函数参数:setA和setB的头结点
返回值:结果集合的头结点
*/
SET setExcept(SET L1, SET L2)
{
//请在此处填写代码,可直接使用上面已经实现的各操作
/********** Begin **********/
SET s1,s2,s,p,q;
s1 = L1;
s2 = setIntersect(L1,L2);
p=s1->next;
while(p)
{
q=s2->next;
while(q)
{
if(q->element != p->element)
q=q->next;
else
break;
}
if(!q)
{
SET inter = new struct node;//头插法插入
inter->element = p->element;
inter->next = s->next;
s->next = inter;
}
p=p->next;
}
return s;
/********** End **********/
}
#endif