}
}//PrintCartesian_product
//-------------------------------------------------------------
//函数RmvElem
voidRmvElem(Set*set,intelem)
{
for(inti=0;icard;++i)
if(set->elems[i]==elem){
for(;icard-1;++i)
set->elems[i]=set->elems[i+1];
--set->card;
}
}//RmvElem
//-------------------------------------------------------------
//函数Member
boolMember(Set*set,intelem)
{
for(inti=0;icard;++i)
if(set->elems[i]==elem)
returntrue;
returnfalse;
}//Member
//-------------------------------------------------------------
//函数Copy
voidCopy(Set*set,Set*res)
{
for(inti=0;icard;++i)
res->elems[i]=set->elems[i];
res->card=set->card;
}//Copy
//-------------------------------------------------------------
//函数Equal
boolEqual(Set*set1,Set*set2)
{
if(set1->card!
=set2->card)
returnfalse;
for(inti=0;icard;++i)
if(!
Member(set2,set1->elems[i]))
returnfalse;
returntrue;
}//Equal
//-------------------------------------------------------------
//函数Intersect
voidIntersect(Set*set1,Set*set2,Set*res)
{
res->card=0;
for(inti=0;icard;++i)
for(intj=0;jcard;++j)
if(set1->elems[i]==set2->elems[j]){
res->elems[res->card++]=set1->elems[i];
break;
}
}//Intersect
//-------------------------------------------------------------
//函数Union
intUnion(Set*set1,Set*set2,Set*res)
{
Copy(set1,res);
for(inti=0;icard;++i)
if(AddElem(res,set2->elems[i])==overflow)
returnoverflow;
returnnoErr;
}//Union
//-------------------------------------------------------------
//函数Subset
boolSubset(Set*set1,Set*set2)
{
if(set1->card>set2->card)
returnfalse;
for(inti=0;icard;++i){
if(!
Member(set2,set1->elems[i]))
returnfalse;
}
returntrue;
}//Subset
//-------------------------------------------------------------
//函数PSubset
boolPSubset(Set*set1,Set*set2)
{
if(set1->cardcard&&Subset(set1,set2))
returntrue;
}//PSubset
//-------------------------------------------------------------
//函数Cartesian_product
voidCartesian_product(Set*set1,Set*set2,Set_product*res)
{
intk=0;
res->card=set1->card*set2->card;
for(inti=0;icard;++i)
for(intj=0;jcard;++j,++k)
sprintf(res->elems[k],"(%d,%d)",set1->elems[i],set2->elems[j]);
}
实验二:
链表及其应用
问题:
试编一个算法,将一个用单链表表示的稀疏多项式分解两个多项式。
1.这两个多项式中各自仅含奇次项或偶次项;
2.要求利用原链表中的节点空间构成这两个多项式。
C语言程序代码:
#include
#include
typedefstruct{
floatcoef;
intexpnum;
}term,ElemType;//数据包括底数,次数;
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;//声明节点为Lnode型和LinkList的指针;
voidCreateList_L(LinkList&L,intn);
voidDisplay_L(LinkListL);
voidSplit_L(LinkList&plyn,LinkList&odd);
voidReverse_L(LinkListL);
voidmain()
{
intNodeNum=4;
LinkListList,oddList;
CreateList_L(List,NodeNum);
Display_L(List);
Reverse_L(List);
Display_L(List);
Split_L(List,oddList);
Display_L(List);
Display_L(oddList);
}
//输入n个元素的值,利用尾插法建立带表头结点的单链线性表L
voidCreateList_L(LinkList&L,intn)
{
LinkListp,Pre;
inti;
L=(LinkList)malloc(sizeof(LNode));//先建立一个带头节点的线性链表;
Pre=L;
for(i=0;i{
p=(LinkList)malloc(sizeof(LNode));//生成新结点
printf("theexpnumis:
");//输入数据的次数;
scanf("%d",&p->data.expnum);
printf("thecoefis:
");
scanf("%f",&p->data.coef);//输入数据的底数;
Pre->next=p;
Pre=p;//修改尾指针;
}
Pre->next=NULL;
}
voidDisplay_L(LinkListL)//输出次数与底数;
{
L=L->next;
while(L)
{
printf("Theexpnumis:
");//次数;
printf("%d\n",L->data.expnum);
printf("Thecoefis:
");
printf("%.2f\n",L->data.coef);
L=L->next;
}
printf("\n");
}
voidReverse_L(LinkListL)
{
LinkListp=NULL,q,s;
q=L->next;
while(q)
{
s=q->next;
q->next=p;
p=q;
q=s;
}
L->next=p;
}//Reverse_L
voidSplit_L(LinkList&plyn,LinkList&odd)
{
LinkListp,q,s;
odd=(LinkList)malloc(sizeof(LNode));
odd->next=NULL;
q=plyn;
p=plyn->next;
s=odd;
while(p)
{
if(p->data.expnum%2==0)
{
q=p;
p=p->next;
}
else
{
q->next=p->next;//在原表中删除奇次项节点
s->next=p;//将奇次项节点插入到新表中
p=q->next;
s=s->next;
s->next=NULL;
}
}
}//Split_L
实验三:
队列和栈的使用
问题:
试编写一个算法,利用栈将队列逆置;
1.栈和队列的数据元素都使用整型变量;
2.队列用链式存储,栈用动态的顺序存储;
C语言程序代码:
//-------------------------------------------------------------
#include
//#include
#include
//-------------------------------------------------------------
typedefstruct{
floatcoef;
intexpnum;
}term,ElemType;
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
//-------------------------------------------------------------
voidCreateList_L(LinkList&,int);
voidDisplay_L(LinkList);
voidSplit_L(LinkList&,LinkList&);
voidReverse_L(LinkList);
//-------------------------------------------------------------
voidmain()
{
intNodeNum=4;
LinkListList,oddList;
CreateList_L(List,NodeNum);
Display_L(List);
Reverse_L(List);
Display_L(List);
Split_L(List,oddList);
Display_L(List);
Display_L(oddList);
}//main
//--------------------------------------------------------------------------------------------------
voidCreateList_L(LinkList&L,intn){
//逆位序输入n个元素的值,建立带表头结点的单链线性表L
LinkListp;
inti;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//先建立一个带头结点的单链表
for(i=n;i>0;--i){
p=(LinkList)malloc(sizeof(LNode));//生成新结点
cout<<"expnum=?
";cin>>p->data.expnum;
cout<<"coef=?
";cin>>p->data.coef;
p->next=L->next;L->next=p;//插入到表头
}
//cout<<"链表生成."<}//CreateList_L
//-------------------------------------------------------------
voidDisplay_L(LinkListL)
{
L=L->next;
cout<<"{";
while(L)
{
cout<<"("<data.coef<<",";
cout<data.expnum<<")";
L=L->next;
}
cout<<"}\n";
}//Display_L
//------------------------------------------------------------------------------
voidReverse_L(LinkListL)
{
LinkListp=NULL,q,s;
q=L->next;
while(q){
s=q->next;q->next=p;
p=q;q=s;
}
L->next=p;
}//Reverse_L
//------------------------------------------------------------------------------
voidSplit_L(LinkList&plyn,LinkList&odd)
{
LinkListp,q,s;
odd=(LinkList)malloc(sizeof(LNode));
odd->next=NULL;
q=ply