数据结构-------数组

数组  

两个多项式相加
自定义的结构 结构数组

#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;
}

                                                             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值