还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第章主要算法的代码6C++顺序串的基本操作/*顺序串的实现C++*/#includeiostream usingnamespace std;const intMAX_N=100;//定义数据类型class SqStr{public:char data[MAX_N];int length;;//串class String{public:String{}-String{}//生成串void StrAssigncharcstr[]{int i;for i=0;cstr[i]!=1\01;i++{S.data[i]=cstr[i];}S.length=i;//复制串void StrCopyString t{int i;//串赋值for i=0;it.Gets-length;i++{S.data[i]=t.Gets-data[i];//串长度赋值S.length=t.Gets-length;//是否相等bool StrEqualStringt{SparseMatrix bmaxTerms;b,Rows=Rows;b,Cols=Cols;・b Terms=Terms;b,maxTerms=maxTerms;ifTerms0{int i,k,CurrentB=O;for k=0;kb.Cols;k++for i=0;iTerms;i++ifsmArray[i].col==k{b.smArray[CurrentB].row=smArray[i].col;b.smArray[CurrentB].col=smArray[i].row;b.smArray[CurrentB].value=smArray[i].value;CurrentB++;return b;}*///转置函数SparseMatrix SparseMatrix::Transpose{//转置矩阵每行非零元素的个数int*rowSize=new int[Cols];//转置矩阵每行第一个非零元素对应其三元组的下int*rowStart=new int[Cols];标//转置后的矩阵对应的三元组SparseMatrix bmaxTerms;的性质b-Rows=Rows;//bb.Cols=Cols;・b Terms=Terms;b,maxTerms=maxTerms;ifTerms0{int i,j,CurrentB=O;//对数组赋值㊀for i=0;iCols;i++rowSizrowSize[i]=0;for i=0;iTerms;i++rowSize[smArray[i].col]//对数组赋值rowStart
[0]=0;rowStartfor i=l;ib.Rows;i++rowStart[i]=rowStart[i-1]+rowSize[i-1];//遍历三元组把各个元素按数组存在for i=0;KTerms;i++{a,rowStart b中相应的位置数组中行号按从小到大的顺序排列,j=rowStart[smArray[i].col];//a所以相同列最先遇到的元素肯定处在相应转置矩阵相应行中的最前面//把该元素按照找到的下标b.smArray[j].row=smArray[i].col;存入中j bb.smArray[j].col=smArray[i].row;b.smArray[j].value=smArray[i].value;//因为该值已经存入所以转置矩阵rowStart[smArray[i].col]++;b,的该行下一个元素在中对应的下标为b rowStart[smArray[i].col]//释放申请的存储空间㊀delete[]rowSize;n wdelete[]rowStart;return b;//转置矩阵的力口法SparseMatrix SparseMatrix::Add SparseMatrix b{//结果存于里面SparseMatrix ResultRows*Cols;Result//规格相同的矩阵才能相加if Rows!=b.Rows I|Cols!=b.Cols{coutnIncompatible matricesnendl;return Result;Result,Rows=Rows;Result.Cols=Cols;Result.Terms=0;Result.maxTerms=Rows*Cols;遍历三元组;当前所指的中int i=0,j=0,index_a,index_b;//i aindex_a:a元素在矩阵中的位置;whileiTermsjb.Terms{index_a=smArray[i].row*Cols+smArray[i].col;index_b=b.smArray[j].row*b.Cols+b.smArray[i].col;//当前所指的中两个元素,中元素位置在前if index_aindex_b{a,b a//直接Result.smArray[Result.Terms].row=smArray[i].row;lEa的元素放在里面ResultResult.smArray[Result.Terms].col=smArray[i].col;指针指向;Result.smArray[Result.Terms].value=smArray[i].value;i++//i中下一个元素aif index_aindex_b{Result.smArray[Result.Terms].row=b.smArray[j].row;Result.smArray[Result.Terms].col=b.smArray[j].col;;Result.smArray[Result.Terms].value=b.smArray[j].value;j++//位置相同if index_a==index_b{//如果两个值相力口if smArray[i].value+b.smArray[j].value{的和不为零//把相加Result.smArray[Result.Terms].row=smArray[j].row;的结果放在中㊀R suitResult.smArray[Result.Terms].col=smArray[j].col;Result.smArray[Result.Terms].value=smArray[i].value+b.smArray[j].value;;;i++j++//存一个元素,非零元素的个数Result.Terms++;+1;for;iTerms;i++中元素已经遍历完,把剩余的元素放入{//b aResult里面,此时所指的第一个元素位置肯定在中最后一个元素后面i bResult.smArray[Result.Terms].row=smArray[i].row;Result.smArray[Result.Terms].col=smArray[i].col;;Result.smArray[Result.Terms].value=smArray[i].value;i++Result.Terms++;for;jb.Terms;j++{Result.smArray[Result.Terms].row=b.smArray[j].row;Result.smArray[Result.Terms].col=b.smArray[j].col;;Result.smArray[Result.Terms].value=b.smArray[j].value;j++Result.Terms++;return Result;//矩阵的乘法SparseMatrix SparseMatrix::Multiply SparseMatrixb{//存放矩阵相乘的结果SparseMatrix ResultRows*b.Cols;//两个矩阵能相乘的先决条件第一个的列数等于if Cols!=b.Rows{第二个的行数ncerr Incompatiblematricesendl;矩阵每行的非零元素return Result;int*rowSize=new int[b.Rows];//b个数矩阵每行第一个非零元素在中的int*rowStart=new int[b.Rows+1];//b b下标;为何加一?//暂时存放每——行每个元素的运算结果int*temp=new int[b.Cols];Result的指针;int i,Current,lastlnResult,RowA,Col A,ColB;//Current a的指针lastlnResult Resuit十十//对数组赋值for i=0;ib.Rows;i roeSizerowSize[i]=0;for i=0;ib.Terms;i++rowSize[b.smArray[i].row]//对数组赋值rowStart
[0]=0;rowStartfor i=l;ib.Rows;i++rowStart[i]=rowStart[i-1]+rowSize[i-1];//从下标开始遍历Current=0;0a//赋初值是为了计算方便,看完代码即可了解last!nResult=-l;while//遍历三元组的每——个元素CurrentTerms{a RowA=smArray[Current].row;//取得第一个元素的所在行//把数组赋初值为;for i=0;ib.Cols;i++temp0temp[i]=0;//对该行的所有元素while CurrentTermssmArray[Current].row==RowA{进行操作//该元素所在的列就是该元素对应相乘的ColA=smArray[Current].col;ColA中元素的行数b//遍历中该for i=rowStart[ColA];KrowStart[ColA+1];i++{b行的所有元素的该元素与中对应行第列的元素相ColB=b.smArray[i].col;//a bColB乘的结果应该被放到中;temp[ColB]temp[ColB]4-=smArray[Current].value*b.smArray[i].value;中该元素的已经完成使命,指向中下一个元素㊀Curr nt++;//a afor//把该行的运算结果存入里面i=0;ib.Cols;i++{Result;iftemp[i]!=0{lastInResult++Result.smArray[lastInResult].row=smArray[Current].row;Result.smArray[lastlnResult].col=i;Result.smArray[lastInResult].value=temp[i];//对的性质进行赋值操作Result,Rows=Rows;ResultResult.Cols=b.Cols;Result.Terms=lastInResult+l;//释放创建的存储空间㊀delete[]rowSize;n wdelete[]rowStart;delete[]temp;return Result;//长度不等if S.length!=t.Gets-length{return false;else{int i;//内容不等for i=0;iS.length;i++{if S.data[i]!=t.Gets-data[i]{return false;//否则相等return true;//求长度int STrLength{return S.length;//串连接SqStr ConcatStringt{SqStr str;str.length=S.length+t.Gets-length;int i;//赋值Sfor i=0;iS.length;i++{str.data[i]=S.data[i];//赋值tfor i=S.length;iS.length+t.GetS-length;i++{str.data[i]=t.Gets-data[i-S.length];}return str;//求子串,返回从串的位置开始连续个字符,返回新串,参数不正确时返回空串S ij SqStrSubStrint i,int j{SqStr str;str.length=0;//下标与位置差1if i=0||iS.length||j=0||i+j-1S.length{return str;else{int k;for k=i-1;ki+j-1;k++{str.data[k-i-1]=S.data[k];str.length=j;return str;//插入串,将插入到中的位置开始,si S i SqStrInsertStrString si,int}else{int j;//插入前个字符S i-lfor j=0;ji-1;j++{str.data[j]=S.data[j];//插入串sifor j=0;jsi.Gets-length;j++{str.data[j+i-1]=si.Gets-data[j];//插入剩下的串Sfor j=i-1;jS.length;j++{str.data[i-1+si.返回新串,参数不正确时返回空串・Gets-length+j-i-1]Si{SqStr str;str.length=0;为位置,与数组下标差//i1+1if i=0||iS.lengthreturnstr;data[j];str.length=S.length+si.Gets-length;return str;//删除串中位置开始的连续个字符,生成新串并返回,参数不正确时返回空串S ij SqStrDeleteStrint i,int j{SqStr str;str.length=0;无意义,不删除任何字符,即删除个字符串,仍为空串//j0j==00if i=0||iS.length||j=0||i+j-1S.length{returnstr;else{int k;//赋值前个字符S i-lfor k=0;ki-1;k++{str.data[k]=S.data[k];//跳过个字符,赋值剩下的字符jfor k=i-1+j;kS.length;k++{str.data[k-j]=S.data[k];str.length=S.length-j;return str;}//替换串,将中的位置开始的个字符替换成串生成新串并返回,参数不正确返回S ij t,空串SqStr ReplaceStrinti,int jStringt{rSqStr str;str.length=0;没有实际意义,即将后的个字符替换//j0j==0,i-l0if i=0|I iS.length||j0||i+j-1S.length{return str;}else{int k;//赋值的前个字符Si-lfor k=0;ki-1;k++{str.data[k]=S.data[k];//插入串tfor k=0;kt.Gets-length;k++{str.data[i-1+k]=t.Gets-data[k];串跳过个字符后插入剩下所有//S jfork=i-1+j;kS.length;k++{str.data[i-1+t.Gets-length+k-i-14-j]=S.data[k];str.length=S.length-j+t.Gets-length;return str;}//输出串不带参数//空串处理void DisplayStr{if S.length==0{cout Empty.”endl;//否则输出串else{inti;for i=0;iS.length;i++{cout S.data[i];coutendl;//输出串带参数}void DisplayStrSqStrstr{if str.length==0{coutEmpty.endl;else{inti;for i=0;istr.length;i++{coutstr.data[i];coutendl;private:SqStr S;//获取串首地址;SqStr*Gets{return S;int main{int n,i,locate,strlength;//生成串nchar a[MAX_N];coutCreate String.endl;n ncoutInput n:;cinn;coutnInput nncharacters.nendl;for i=0;in;i++{cina[i];,,a[i]=\0String strl;strl.StrAssigna;//输出串coutnDispaly string.nendl;strl.DisplayStr;//串长度ncoutString Length.endl;coutstrl.STrLengthendl;//拷贝串coutString Copy.nendl;n ncoutInput n:;cinn;n HcoutInputn”characters.endl;for i=0;in;i++{cina[i];}a[i]=String str2;str
2.StrAssigna;strl.StrCopystr2;strl,DisplayStr;//获取子串coutnGet SubStr.nendl;n ncoutInput locate,string length:;cinlocatestrlength;//插入串strl.DisplayStrstrl.SubStrlocate,strlength;coutnInsert string.nendl;coutnInput n:n;cinn;coutnInputn”characters.endl;for i=0;in;i++{cina[i];a[i]=f\0T;str
2.StrAssigna;n ncoutInput locate:;cinlocate;//连接串nstrl.DisplayStrstrl.InsertStrstr2,locate;coutConcatnstring.endl;coutnInput n:n;cinn;coutnInput nncharacters.nendl;for i=0;in;i++{cina[i];f1a[i]=\0;str
2.StrAssigna;strl.DisplayStrstrl.Concatstr2;//是否相等n ncoutIs Equal.endl;if strl.StrEqualstr2{coutYES.”endl;}else{coutNO.”endl;//删除串coutDelete.Hendl;coutnInput locate,string length:;cinlocatestrlength;strl.DisplayStrstrl.DeleteStrlocate,strlength;//替换串n ncoutRepalce.endl;coutnInput locate,string length:n;cinlocatestrlength;strl.DisplayStrstrl.ReplaceStrlocate,strlength,str2;return0;稀疏矩阵的基本操作#includeiostream usingnamespace std;//自定义数据结构矩阵元素的行,歹值;struct Trituple{U,int row,col;int value;//赋值运算符重载Trituple operator=Trituple x{row=x.row;col=x.col;value=x.value;return*this;;#includenTrituple・hn#includeiostream#includeassert.h usingnamespace//稀疏矩阵std;const intDefaultSize=100;class SparseMatrix{private://行数,歹!数,非零元素的个数int Rows,Cols,Terms;J//存非零元素的三元数组Trituple*smArray;//三元组最大可容纳的元素个数int maxTerms;public://构造函数SparseMatrix intmaxSz=DefaultSize;//赋值构造函数SparseMatrix SparseMatrix SM;//析构函数-SparseMatrix;//赋值运算符重载SparseMatrix operator=SparseMatrix^SM;SparseMatrix//矩阵转置Transpose;//矩阵的力口法SparseMatrix AddSparseMatrixb;//矩阵的乘法SparseMatrix MultiplySparseMatrix^b;矩阵的输出friend ostreamSoperatorostream ostr,SparseMatrix SM;//重载函数矩阵的输入friend istream operatoristreamS istr,SparseMatrix^SM;//重载函数;//构造函SparseMatrix::SparseMatrix intmaxSz:maxTerms maxSz{数构造一个大小为的三元组,行列数和非零元素个数都置零㊀maxT rmifmaxSzl{矩阵初始化错误!“〈〈cerrcc”endl;exit1;smArray=new Trituple[maxSz];assertsmArray!=NULL;Rows=Cols=Terms=0;//复制构造函数SparseMatrix::SparseMatrix SparseMatrix^SM{Rows=SM.Rows;//赋值矩阵的性质Cols=SM.Cols;Terms=SM.Terms;maxTerms=SM.maxTerms;//构造三元组并赋与相同的值smArray=new Trituple[maxTerms];SMassertsmArray!=NULL;for inti=0;iTerms;i++smArray[i]=SM.smArray[i];//析构函数释放所有存储SparseMatrix::-SparseMatrix{delete[]smArray;//赋值运算符重载SparseMatrixS SparseMatrix::operator=SparseMatrixS SM{//元素性质的赋值Rows=SM.Rows;Cols=SM.Cols;Terms=SM.Terms;maxTerms=SM.maxTerms;//三元组所有元素赋值for inti=0;iTerms;i++smArray[i]=SM.smArray[i];//返回的是对调用该函数的对象的引用,需显式使用指针;return*this;this//输出运算符重载为啥ostream operatorostream ostr,SparseMatrix^SM{代模板就不能调用row//输出该矩阵的性质n nostr#Rows=SM.Rowsendl;nostr#Cols=SM.Colsendl;ostrn#Terms=nSM.Termsendl;//输出该矩阵非零元素的位置及值for inti=0;iSM.Terms;i++nostri+l:nnSMnSM.smArray[i].row,nSM.smArray[i].col«n=SM.smArray[i].valueendl;return ostr;//输入运算符istreamoperatoristream istrSparseMatrixSM{z重载n ncoutPlease enternumber ofrows,columns,and termsof Matrixendl;//输入元素的‘性质istr»SM.Rows»SM.Cols»SM.Terms;if SM.TermsSM.maxTerms{cerrNumbers ofTerms overflow!endl;exit1;//依次输入非零元素的坐标和值for inti=0;iSM.Terms;i++{n ncoutEnter row,column,and valueof term:i+lendl;cinSM.smArray[i].rowSM.smArray[i].colSM.smArray[i].value,■return istr;}//转置函数/*Spars eMatrixSparseMatrix::Transpose{。