/* C语言线性表
采用c语言 malloc realloc free 实现类存分配 */
#include <ctime>
#include <string>
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <windows.h>
#define LS 1000
#define LS_M 100
using namespace std;
/*说明:本程序从0号位置开始存储*/
struct node
{
int *elem; //空间基址
int length; //当前长度
int listsize;//线性表大少
};
/* 基本操作与实现*/
void InitList(node &L)
{//初始化链表
L.elem = (int *)malloc(LS * sizeof(node));
if(!L.elem) {puts("failure");return;}
L.length=0;
L.listsize = LS;
return;
}
void CreateValue(node &L)
{
int val,*p;
Sleep(500);
srand(time(0));
p = L.elem;
int n = L.length= rand() % 15 + 1;
printf("请输入N个整数%d: ", n);
freopen("1.txt","r",stdin);
while(n--)
{
scanf("%d",&val);
*(p++) = val;
}
puts("");
}
bool check(node L)
{
if(L.elem == NULL) return 0;
else return 1;
}
void DestroyList(node &L)
{//销毁链表
if(check(L)) free(L.elem);
else puts("链表不存在");
L.elem = NULL;
return;
}
bool ListEmpty(node &L)
{//判断链表是否为空
if(check(L))
{
if(L.length == 0) return 0;
else return 1;
}
else puts("链表不存在");
return false;
}
void ClearList(node &L)
{//清空链表
if(!check(L))
{
puts("链表不存在");
return;
}
if(L.length != 0) L.length = 0;
else puts("链表为空");
}
int ListLength(node L)
{//获取链表的长度
if(check(L))
{
return L.length;
}
else puts("链表不存在");
return 0;
}
int GetElemsVal(node L,int k)
{//获取链表的k位置的值
return *(L.elem+k);
}
void print(node L)
{
int i;
if(!check(L)) {puts("failure");return;}
for(i=0 ; i<L.length ; i++)
printf("%d " , *(L.elem++));
puts("");
}
void LocateElem(node L ,int i , int &e)
{//获得i位置的值并且保存到e变量中
if(!check(L)) puts("链表不存在");
else e = *(L.elem + i);
return;
}
int PriorElem(node L , int rur_e , int &pre_e)
{//获取rur_e元素前驱的位置并保存到pre_e变量中
if(!check(L)) {puts("failure");return 0;}
int i , *p = L.elem , flag=0;
if(*p==rur_e) flag = 1 ;
for(i=0 ; i<L.length ; i++)
{
if(*(p+1)==rur_e) break;
else p++;
}
if(i >= L.length) flag=1;
if(flag == 1) puts("failure");
else pre_e = i;
return 0;
}
int NextElem(node L , int cur_e , int &next_e)
{//获取rur_e元素后继的位置并保存到next_e变量中
if(!check(L)) {puts("failure");return 0;}
int i, *p = L.elem , flag=0;
for(i=0 ; i<L.length ; i++)
{
if(*(p++)==cur_e) break;
}
if(i>= L.length-1) puts("failure");
else next_e = i+1;
return 0;
}
void ListInsert(node &L , int i , int e)
{//在链表的i位置插入元素e
int j , k , *p=L.elem , *q=L.elem+L.length-1;
if(!check(L)|| i<0 || i>=L.length)
{
puts("failure");
return;
}
if(L.length+1 > L.listsize)
{
int *newbase = (int *)realloc(L.elem,(L.listsize+LS_M)*sizeof(node));
if(newbase==NULL) {puts("failure");return;}
L.elem = newbase;
L.listsize+=LS_M;
//追加空间
}
p=L.elem+i;j=i;
for(k=L.length-1 ; k>=j ; k--)
*(q+1)=*q,q--;
*p = e;L.length+=1;
}
void ListDelete(node &L , int i , int &e)
{//在链表的i位置删除元素并返回删除元素的值e
int j , *p=L.elem ;
if(!check(L)|| i<0 || i>=L.length)
{
puts("failure");
return;
}
p = (p+i) ; e = *p;
for(j=i ; j<L.length ; j++)
{
*p = *(p+1) , p++;
}
L.length-=1;
}
void ListTraverse(node &L)
{//将链表翻转
int temp=0 , len=L.length/2;
int *p=L.elem,*q=L.elem+L.length-1;
for(int i=0 ;i<len ;i++)
{
temp = *p;
*p = *q;
*q = temp;
p+=1;q-=1;
}
}
void T_sort(node &L)
{
node p=L;
int len=L.length;
int i,j,t;
for(i=0 ; i<len ; i++)
{
for(j=0 ; j<=i ; j++)
{
if(p.elem[i]<p.elem[j])
{
t=p.elem[i];
p.elem[i]=p.elem[j];
p.elem[j]=t;
}
}
}
}
void MergeList(node &La , node &Lb , node &Lc)
{//实现La , Lb 两个链表的合并,保存结果与Lc(递增)
T_sort(La);T_sort(Lb);
int *p1 , *p2 , * p3;
int i=0,j=0,k=0,ln=La.length,lm=Lb.length;
p1 = La.elem ; p2 = Lb.elem ; p3=Lc.elem;
if(La.length+Lb.length>Lc.listsize)
{
int *newbase = (int *) realloc(Lc.elem , (Lc.listsize+LS_M)*sizeof(node));
if(!newbase) {puts("failure");return;}
Lc.elem = newbase;
Lc.listsize+=LS_M;
}
while(i<ln && j<lm)
{
if(*p1<*p2)
{
i++;*p3=*p1;
p1++; p3++;
Lc.length++;
}
else if(*p1==*p2)
{
j++;p2++;
}
else
{
j++;*p3=*p2;
p2++; p3++;
Lc.length++;
}
}
if(i<=ln)
{
for(k=i ; k<ln ; k++)
*(p3++) = *(p1++);
Lc.length+=ln-i;
}
if(j<=lm)
{
for(k=j ; k<lm ; k++)
*(p3++) = *(p2++);
Lc.length+=lm-j;
}
}
/* 注释程序从0号位置开始存储值 */
int main ()
{
node La,Lb,Lc;
InitList(La);
InitList(Lb);
InitList(Lc);
CreateValue(La);
CreateValue(Lb);
CreateValue(Lc);
printf("La的长度: %d ",ListLength(La));
printf("Lb的长度: %d ",ListLength(Lb));
printf("Lc的长度: %d\n",ListLength(Lc));
//
int e=0;
ListInsert(La,5,99);
print(La);
ListDelete(La,0,e);
printf("删除的元素值为: %d\n",e);
print(La);
//
int k=1;
printf("La中 %d 号位置的值: %d\n",k,GetElemsVal(La,k));
print(La);
//
int pre_e=-1 , rur_e = 7;
PriorElem(La , rur_e , pre_e);
if(pre_e!=-1)
printf("元素 %d 在La中的前驱的位置为: %d\n",rur_e,pre_e);
int next_e = -1 , cur_e = 4;
NextElem(La , cur_e , next_e);
if(next_e!=-1)
printf("元素 %d 在La中的后继的位置为: %d\n",cur_e,next_e);
//
if(ListEmpty(Lc))
{
printf("Lc: ");print(Lc);
ClearList(Lc);
}
T_sort(La);
T_sort(Lb);
printf("La: ");print(La);
printf("Lb: ");print(Lb);
MergeList(La,Lb,Lc);
print(Lc);
//
DestroyList(La);
DestroyList(Lb);
DestroyList(Lc);
return 0;
}
/* 输入式子都是标准形式 */
#include <vector>
#include <string>
#include <cstdio>
#include <iostream>
using namespace std;
struct node
{
int coef; //指数
char c; //变量
double exp; //系数
}p,q;
vector <node> v1,v2,v3;
void mergelist(int te , int tc)
{
int i , flag=0;
for(i=0 ; i<v3.size() ; i++)
{
if(tc == v3[i].coef)
{
v3[i].exp+=te;
flag=1;
}
}
q.c = 'x' ; q.coef=tc ; q.exp = te;
if(!flag) v3.push_back(q);
}
void mutiply(node p)
{
int i , tc , te;
for(i=0 ; i<v2.size() ; i++)
{
te = p.exp * v2[i].exp;
tc = p.coef + v2[i].coef;
mergelist(te , tc);
}
}
void Print()
{
int i;
for(i=0 ; i<v3.size() ; i++)
{
if(i!=0 && v3[i].exp>0) cout<<'+';
if(i!=0 && v3[i].exp==0) continue;
if(v3[i].exp == 1 || v3[i].exp == -1)
{
if(v3[i].exp == -1)
cout<<'-';
}
else cout<<v3[i].exp;
cout<<v3[i].c<<'^'<<v3[i].coef;
}
cout<<endl;
}
int main ()
{
int i , n , m;
freopen("2.txt","r",stdin);
while(cin>>n>>m && n||m)
{ //n m 分别代表表达式 1 2 的项数
v1.clear();
v2.clear();
v3.clear();
for(i=0 ; i<n ; i++)
{
cin>>p.c>>p.coef>>p.exp;
v1.push_back(p);
}
for(i=0 ; i<m ; i++)
{
cin>>p.c>>p.coef>>p.exp;
v2.push_back(p);
}
//
for(i=0 ; i<v1.size() ; i++)
{
p=v1[i];
mutiply(p);
}
Print();
}
return 0;
}
/* 思路用vector实现不考虑式子本身的复杂情形
1 输入范例 (x + x^2 + x^3)* (x^4 + x^5)
3 2
x 1 1
x 2 1
x 3 1
x 4 1
x 5 1
0 0
*/