(1)设计下列算法(假定下面所用的串均采用顺序存储结构,参数ch、ch1和ch2均为字符型):
① 将串r中所有其值为ch1的字符换成ch2字符。
② 将串r中所有字符按相反的次序逆置。
③ 从串r中删除其值等于ch的所有字符。
④ 从串r1中第index个字符起求出首次与字符r2相同的子串的起始位置。
⑤ 从串r中删除所有与串r3相同的子串(允许调用第④小题的函数和前面的删除子串的函数)。
算法设计完成后上机调试程序。
(2)对于链串h,设计一个算法将其中的所有c字符替换成s字符。
(3)如果矩阵A中存在这样的一个元素A[i][j]满足条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。编写一个算法计算出m×n的矩阵A的所有马鞍点。
(1)算法如下。
① 将串r中所有其值为ch1的字符换成ch2字符。
void trans(SqString &r,char ch1,char ch2)
{
int i;
for(i=0;i<r.len;i++)
if(r.ch[i]==ch1)
r.ch[i]=ch2;
}
② 将串r中所有字符按相反的次序逆置。
void invert(SqString &r)
{
int i;
char tmp;
for(i=0;i<(r.len/2);i++)
{
tmp=r.ch[i];
r.ch[i]=r.ch[r.len-i+1];
r.ch[r.len-i+1]=tmp;
}
}
③ 从串r中删除其值等于ch的所有字符。
void delall(SqString &r,char ch)
{
int i,j;
for(i=0;i<r.len;i++)
if (r.ch[i]==ch)
{
for (j=i;j<r.len;j++)
r.ch[i]=r.ch[i+1];
r.len=r.len-1;
}
}
④ 从串r1中第index个字符起求出首次与字符r2相同的子串的起始位置。
int partposition(SqString r2, SqString r1,int index)
{
int i,j,k;
for(i=index;i<r2.len;i++)
for(j=i,k=0;r2.ch[j]==r1.ch[k];j++,k++)
if(k==r1.len-1)
return(i);
return(-1);
}
⑤ 从串r中删除所有与串r3相同的子串。
void delstringall(SqString &r, SqString r3)
{
int i;
i=partposition(r,r3,0); /*调用第④题的函数*/
while(i!=-1)
{
if(delsubstring(r,i,r3.len)==1)
i=partposition(r,r3,0);
else
break;
}
}
int delsubstring(SqString &r,int i,int j)
{
int k;
if(i+j-1>r.len)
return(0);
for (k=i+j-1;k<r.len;k++)
r.ch[k-j]=r.ch[k]; /*将被删除子串后面的所有字符依次前移j个位置*/
r.len=r.len-j; /*r的长度减少j*/
return(1);
}
(2)算法如下:
void trans(LinkString *&h,char c,char s)
{
LinkString *p=h->next;
while p!=NULL)
{
if(p->data=='c')
p->data='s';
p=p->next;
}
}
(3)计算m×n的矩阵A的所有马鞍点算法如下:
#define m 3
#define n 4
void minmax(int A[m][n])
{
int i,j,have=0;
int min[m],max[n];
for(i=0;i<m;i++) /*计算出每行的最小值元素,放入min[m]之中*/
{
min[i]=A[i][0];
for(j=1;j<n;j++)
if(A[i][j]<min[i]) min[i]=A[i][j];
}
for(j=0;j<n;j++) /*计算出每列的最大值元素,放入max[1..n]之中*/
{
max[j]=A[0][j];
for(i=1;i<m;i++)
if(A[i][j]>max[j]) max[j]=A[i][j];
}
for (i=0;i<m;i++) /*判定是否为马鞍点*/
for(j=0;j<n;j++)
if(min[i]==max[j])
{
printf("(%d,%d):%d\n",i,j,A[i][j]);/*显示马鞍点*/
have=1;
}
if (!have) printf("没有马鞍点\n");
}
void main()
{
int a[m][n];
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
minmax(a);
}