数组
两个多项式相加
自定义的结构 结构数组
#include<iostream>
#include<fstream>
using namespace std;
#define MAX_TERMS 10
typedef struct
{
float coef;
int expon;
}polynomial;
polynomial terms[MAX_TERMS];
polynomial termsa[MAX_TERMS];
polynomial termsb[MAX_TERMS];
int avail=0;
int compare(int coef1,int coef2)
{
if(coef1>coef2) return 1;
if(coef1==coef2) return 0;
if(coef1<coef2) return -1;
}
void attach(float coefficient,int exponent)
{
terms[avail].coef = coefficient;
terms[avail++].expon = exponent;
}
void padd(int starta,int finisha,int startb,int finishb,int *startd,int *finishd)
{
float coefficient;
*startd=avail;
while(starta<=finisha&&startb<=finishb)
{
switch(compare(termsa[starta].expon,termsb[startb].expon))
{
case -1 :
attach(termsb[startb].coef ,termsb[startb].expon);
startb++;
break;
case 0:
coefficient=termsa[starta].coef+termsb[startb].coef;
if(coefficient)
attach(coefficient,termsa[starta].expon);
starta++;startb++;
break;
case 1:
attach(termsa[starta].coef ,termsa[starta].expon);
starta++;
break;
}
/*for(;starta<finisha;starta++)
attach(termsa[starta].coef ,termsa[starta].expon );
for(;startb<finishb;startb++)
attach(termsb[startb].coef,termsb[startb].expon );*/
}
*finishd=avail-1;
for(int i=0;i<=*finishd;i++)
cout<<terms[i].coef <<" "<<terms[i].expon<<endl;
}
int main()
{
int a,b,i,startd,finishd;float coefa,coefb; int expona,exponb;
ifstream cin("a.txt");
cin>>a; cin>>b;
for(i=0;i<a;i++)
{
cin>>coefa; termsa[i].coef =coefa;
cin>>expona; termsa[i].expon =expona;
}
for(i=0;i<b;i++)
{
cin>>coefb;termsb[i].coef =coefb;
cin>>exponb;termsb[i].expon =exponb;
}
padd(0,a,0,b,&startd,&finishd);
return 0;
}
------------------------------------------------
用链表
#include<iostream.h>
typedef struct LNode
{
float a; //系数
int b; //指数
struct LNode *next;
}LNode;
LNode *InitList() //建立链表并输入多项式函数
{
LNode *p,*q,*head;
float a;
int n=0;
int i,j;
head=new LNode;
cout<<"最高项次数:"<<endl;cin>>i;
p=head;
cout<<"输入多项式系数:"<<endl;
for( j=0;j<=i;j++)
{
p->next=new LNode;
p=p->next; cin>>a;
p->a=a;
p->b=n++;
}
p->next=NULL;
return head;
}
void display(LNode *head) //多项式输出函数
{
LNode *p;
p=head->next;
while(p!=NULL)
{
if(p->a!=0&&p->b!=0)
cout<<" "<<p->a<<"x"<<p->b;
if(p->a!=0&&p->b==0)
cout<<" "<<p->a;
if(p->a>0&&p->next!=NULL)
cout<<" +";
p=p->next;
}
}
LNode *sum(LNode *head1,LNode *head2) //多项式相加函数
{
LNode *pa,*pb,*pc,*head;
int n=0;
pa=head1->next;pb=head2->next;
head=new LNode;
pc=head;
while(pa!=NULL&&pb!=NULL)
{
pc->next=new LNode;
pc=pc->next;
pc->a=pa->a+pb->a;
pc->b=n++;
pa=pa->next;
pb=pb->next;
}
if(pa==NULL)
pc->next=pb;
if(pb==NULL)
pc->next=pa;
return head;
}
void main()
{
LNode *pa,*pb,*pc;
pa=InitList();
display(pa);
cout<<endl;
pb=InitList();
display(pb);
cout<<endl;
cout<<"输入相加后多项式为:"<<endl;
pc=sum(pa,pb);
cout<<"A(x)=";
display(pc);
cout<<endl;
}
------------------
吴文虎
#include<iostream>
#include<fstream>
using namespace std;
struct Tnode
{
int a,m;
Tnode *next;
};
Tnode *first,*second;
void insert (Tnode*&p,int a,int m)
{
Tnode *d;
d=new(Tnode);d->a=a;d->m=m;d->next=p;p=d;
}
void input_data()
{
int a,m;
cin>>a>>m;
first=0;
while(a!=0||m!=0)
{
insert(first,a,m);
cin>>a>>m;
}
second=0;
cout<<"input 2nd polynomial(end with 0 0)"<<endl;
cin>>a>>m;
while(a!=0||m!=0)
{
insert(second,a,m);
cin>>a>>m;
}
}
void solve()
{
Tnode *r,*p,*q,*s;
r=0;p=first;q=second;
while(q!=0||p!=0)
{
if(q!=0&&(p==0||(p->m)<(q->m)))
{ s=q->next;
if(r==0)first=q;
else
{
r->next=q;
}
q->next=p;
r=q;
q=s;
}
else if(p!=0&&q!=0&&p->m==q->m)
{
p->a+=q->a;
r=p;
p=p->next;
q=q->next;
}
else
{ r=p;
p=p->next;
}
}
}
void output_data()
{
Tnode *p;
for(p=first;p!=0;p=p->next)
cout<<p->a<<" "<<p->m<<endl;
}
int main()
{
ifstream cin("a.txt");
input_data();
solve();
output_data();
return 0;
}
-------------------------------------------------------------------------------------------
置换稀疏矩阵
#include<iostream>
#include<fstream>
using namespace std;
typedef int DATAType;
typedef struct
{
int i,j;
DATAType x;
}TritupleNode;
typedef struct
{
TritupleNode data[100];
int m,n,t;
}TriTupleTable;
void TrainsMatrix( TriTupleTable *b,TriTupleTable *a )
{
int c=0,i,j;
// b->m=a->m; b->n=a->n; b->t=a->t;
for(i=0;i<a->n;i++)
{
for(j=0;j<a->t;j++)
{
if(a->data[j].j==i)
{
b->data[c].i= a->data[j].j;
b->data[c].j= a->data[j].i;
b->data[c++].x= a->data[j].x;
}
}
}
for(i=0;i<c;i++)
{
cout<<b->data[i].i<<" "<<b->data[i].j<<" "<<b->data[i].x<<endl;
}
}
int main()
{
TriTupleTable a;TriTupleTable b;int v,x,i,j,m,n;
ifstream cin("a.txt");
cin>>v>>m>>n;
a.m=m; a.n=n;a.t=v;
for(int g=0;g<v;g++)
{
cin>>i>>j>>x;
a.data[g].i=i;
a.data[g].j=j;
a.data[g].x=x;
}
TrainsMatrix(&b,&a);
return 0;
}
-
-----------------------------------------------------
字符串 函数
char *t = new char[100];
strcpy(t,"hello ");
char *p= "word!";
strcat(t,p);
printf("%s\n",t);
delete [] t; 输出hello Word!
char s[100];
strcpy(s,"hello");
char s1[]="c++";
strcat(s,s1);
cout<<s<<endl;
-----------------------------------
char a[30]="hello";
char b[]="kitty123";
strncpy(a,b,9);
cout<<a<<endl;
--------------
===================================================
数组的应用 --------寻找两个字符串中的最长公共子串
每条斜线上 可能有多段连续的 线段 求每个Len 替换 maxlen ,
在每条写线上 ,用 eq 做为标志量 ,表示上一个位置状态 。
#include<iostream>
#include<string>
using namespace std;
int t[20][20];
int maxlen;int jps;
void dline(int &maxlen,int i,int j,int m,int n,int &jps)
{
int eq=0; int len=0; int jp;
while(i<=n&&j<=m) //n行 m 列
{
if(t[i][j]==1)
{
len++;
if(!eq)
{eq=1;jp=j;}
}
else if(eq) // 此位置 ,没有重合,且上一次是重合的
{
if(len>maxlen) // 说明 已经结束一段长度的计算。
{ maxlen=len;jps=jp;}
eq=0;len=0;// 上一段 已经结束,重新标记 计算下一段长
}
i++;j++;
}
}
void Dis(int t[20][20],int &maxlen,int &jps,int m,int n) //n行 m 列
{
int istart=0; int i,j,k;
for(k=-(m-1);k<=n-1;k++)
{
i=istart;
j=i-k;
dline(maxlen,i,j,m,n,jps);
if(k>=0)
istart++;
}
}
int main()
{
string s1,s2; int n,m;
cin>>s1>>s2;
n=s1.length(); //n 是稍微短一点的字符串
m=s2.length();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(s1[i]==s2[j])
t[i][j]=1;
else
t[i][j]=0;
}
}
Dis(t,maxlen,jps,m,n);
int l=jps+maxlen;
for(i=jps;i<l;i++)
cout<<s2[i];
cout<<endl;
cout<<maxlen<<endl;
cout<<jps<<endl;
return 0;
}