您的位置: 网站首页 > 程序开发 > 数据结构 > 第4章 串、数组和广义表 > 【4.12 上 机 实 验】

4.12 上 机 实 验

 

4.12 

4.12.1  实验内容

1)设计下列算法(假定下面所用的串均采用顺序存储结构,参数chch1ch2均为字符型):

将串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的所有马鞍点。

4.12.2  实验指导

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*/

    return1;

}

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);

}