回 帖 发 新 帖 刷新版面

主题:[讨论]数据结构串类型题目

#define MAXSIZE 100         /*串的最大长度*/
#include "stdio.h"
typedef struct
{   
   char ch[MAXSIZE];      /*存放串字符*/
   int len;               /*存放串的实际长度*/
} SqString;
void Assign(SqString &s,char t[])    /*赋值操作函数*/
{
    int i=0;
    while (t[i]!='\0')
    {
        s.ch[i]=t[i];
        i++;
    }
    s.len=i;
}
void Input(SqString &s)
{
    int i;
    char t[MAXSIZE];
    fflush(stdin);  /*清空缓冲区*/
    for(i=0; (t[i]=getchar()) != '\n'; i++);
     t[i] = '\0';      
      Assign(s,t); /*调用赋值操作函数*/
}
void InitStr(SqString &s)
{
    s.len = 0;
}
void StrCopy(SqString &s,SqString t)
{
    int i;
    for (i=0;i<t.len;i++)     /*复制字符串t的内容到字符串s中*/
    s.ch[i]=t.ch[i];
    s.len=t.len;           /*复制t的长度给s*/

}
int StrLength(SqString s)   
{
   return s.len;/*返回长度*/

int StrEqual(SqString s,SqString t) 
{
    int i=0;
    if (s.len!=t.len)
    return(0);/*如果长度不等,则两字符串不相等*/
    
     else          /*如果长度相等,则判断每个字符是否相等*/
    {
        for (i=0; i<s.len;i++)
           if (s.ch[i]!=t.ch[i])
           return(0);
          printf("字符串相等\n");  
          return(1);
    }
}
SqString Concat(SqString s,SqString t)  
{
    SqString r;     /*定义字符串r用来保存链接后的字符串*/
    int i,j;
    for (i=0;i<s.len;i++)   /*把字符串s复制到r中*/      
        r.ch[i]=s.ch[i];
    for(j=0;j<t.len;j++)    /*把字符串t紧接着复制到r中*/                               ;
        r.ch[j+s.len]=t.ch[j];
           r.len=s.len+t.len;        /*设置r的长度*/
    return(r);              

SqString SubStr(SqString s,int i,int j) 
{
    SqString t;
    int k;
    if (i<1 || i>s.len || j<1 || i+j>s.len+1)
        t.len=0;        
    else
    {
       for (k=i-1;k<i+j;k++)
            t.ch[k-i+1]=s.ch[k];  
       t.len=j;
    }
    return(t);

int Index(SqString s,SqString t)    
{
    int i=0,j=0,k;                /*i和j分别扫描主串s和子串t*/
    while (i<s.len && j<t.len)
    {   if (s.ch[i]=t.ch[j])    //对应字符相同,继续比较下一对
        {   i++;j++;        }
        else                    //主子串指针回溯重新开始下一次匹配
        {   i=i-j+1;j=0;    }
    }
    if (j>=t.len)   k=i-s.len;     //求出第一个字符的位置
    else  k=-1;     //置特殊值-1
    return(k);

int InsStr(SqString &s,int i,SqString t)    
{
    int j;
    if (i>s.len+1 || i<1)
        return(0);                  
    else 
    {
        for (i=0;i<t.len;i++)     /*在s中为待插入子串t移动出足够的存储单元*/
            s.len++; 
        for (j=0;j<t.len;j++)       /*在第i个位置开始插入子串t*/
            s.ch[i+j-1]=t.ch[j]; 
            s.len=s.len+t.len;     /*改变s的长度*/
        return(1);
    }
}
int DelStr(SqString &s,int i,int j)
{
    int k;
    SqString str;
    str.len=0;
    if (i>s.len||i<1||i+j>s.len+1)   /*如果位置不对则无法进行删除*/
        return(0);      
    else
    {   for (k=0;k<i-1;k++)    /*删除第i个位置开始的j个字符*/
            str.ch[k]=s.ch[k];
            for(k=i+j-1;k<s.len;k++)
                str.ch[k-j]=s.ch[k];
                s.len=s.len-j;         /*s的长度改变*/ 
        return(1);
    }
}
SqString RepStrAll(SqString &s,SqString s1,SqString s2) 
{
    int i;
    i=Index(s,s1);
    while (i>=0)
    {
       DelStr(s,i,s1.len);   /*删除i位置的s1*/
       InsStr(s,i,s2);       /*在i位置插入s2*/
       i=Index(s,s1);        /*查找下一个s1所在的位置i*/
    }
    return(s);
}
void DispStr(SqString s)    
{  int i;
   if(s.len>0)
   {
    for(i=0;i<s.len;i++)
        printf("%c",s.ch[i]);
        printf("\n");
    }
   else 
       printf("空字符串\n");
}
void Menu()
{

        printf("===========顺序串基本操作====================\n");
        printf("      1=======输入字符串s1和s2\n");
        printf("      2=======显示字符串及其长度\n");
        printf("      3=======判断s1和s2是否相等\n");
        printf("      4=======复制s2到s3中\n");
        printf("      5=======连接s1和s2到s3中\n");
        printf("      6=======求s3中指定位置指定长度的字串\n");
        printf("      7=======求s3中某一字串的位置\n");
        printf("      8=======在s3中插入字串\n");
        printf("      9=======在s3中删除字串\n");
        printf("      10======查找并替换s3中的字串\n");
        printf("      0=======退出\n");
        printf("==============================================\n");
printf("请选择:");}
void main()
{    
    int i,j,m;
    SqString s1,s2,s3,t,str;
    InitStr(s1);
    InitStr(s2);
    InitStr(s3);
    InitStr(t);
    InitStr(str);
    Menu();
    do{    
        scanf("%d",&m);
        switch(m)
        {
        case 1:
            printf("请输入s1:");
            Input(s1);
            printf("请输入s2:");
            Input(s2);
            printf("请选择操作编号,输入0退出:\n");
            break;
        case 2:
            printf("s1:");
            DispStr(s1);
            printf("长度:");
            StrLength(s1);
            printf("\n");
            printf("s2:");
            DispStr(s2);
            printf("长度:");
            StrLength(s2);
            printf("\n");
            printf("s3:");
            DispStr(s3);
            printf("长度:");
            StrLength(s3);
            printf("\n");
            printf("请选择:");
            break;
        case 3:
            StrEqual(s1,s2);
            printf("请选择:");
            break;
        case 4:
            StrCopy(s3,s2);
            printf("复制后的s3为:");
            DispStr(s3);
            printf("请选择:");
            break;
        case 5:
            Concat(s3,s1);
            Concat(s1,s2);
            printf("连接后s3为:");
            DispStr(s3);
            printf("请选择:");
            break;
        case 6:
            printf("请输入所求字串的开始位置:");
            scanf("%d",&i);
            printf("请输入所求字串的长度:");
            scanf("%d",&j);
            SubStr(str,i,j);
            printf("所求字串为:");
            DispStr(str);
            printf("请选择:");
            break;
        case 7:
            printf("请输入要查找的字串:");
            Input(t);
            Index(s3,t);
            printf("请选择:");
            break;
        case 8:
            InsStr(s3,i,t);
            printf("请输入要插入的字串:");
            Input(t);
            printf("请输入插入的位置:");
            scanf("%d",&i);
            printf("插入后的字符串为:");
            DispStr(s3);
            printf("请选择:");
            break;
        case 9:
            DelStr(s3,i,j);
            printf("请输入删除的开始位置:");
            scanf("%d",&i);
            printf("请输入删除的字串长度:");
            scanf("%d",&j);
            printf("删除后的字符串为:");
            DispStr(s3);
            break;
        case 10:
            RepStrAll(s3,s1,s2);
            printf("请输入被替换的字串:");
            Input(s1);
            printf("请输入替换字符串:");
            Input(s2);
            printf("替换后的字符串为:");
            DispStr(s3);
            printf("请选择:");
            break;
        case 0:
            break;
        default:break;
        }
    }while(m<=10);
}
这个程序应该是没有错的了,就是我搞不懂为什么运行出现的结果不想描述的那样,如果你懂,或者不清楚我的问题又热心想帮助我的话,就加我的Q吧,237871892,小女子万分感激哈~~~

回复列表 (共5个回复)

沙发

#define MAXSIZE 100         /*串的最大长度*/
#include<stdio.h>
#pragma warning(disable:4996)
typedef struct
{   
    char ch[MAXSIZE];      /*存放串字符*/
    int len;               /*存放串的实际长度*/
} SqString;
void Assign(SqString &s,char t[])    /*赋值操作函数*/
{
    int i=0;
    while (t[i]!='\0')
    {
        s.ch[i]=t[i];
        i++;
    }
    s.len=i;
}
void Input(SqString &s)
{
    int i;
    char t[MAXSIZE];
    fflush(stdin);  /*清空缓冲区*/
    for(i=0; (t[i]=getchar()) != '\n'; i++);
    t[i] = '\0';      
    Assign(s,t); /*调用赋值操作函数*/
}
void InitStr(SqString &s)
{
    s.len = 0;
}
void StrCopy(SqString &s,SqString &t)
{
    int i;
    for (i=0;i<t.len;i++)     /*复制字符串t的内容到字符串s中*/
        s.ch[i]=t.ch[i];
    s.len=t.len;           /*复制t的长度给s*/
}
int StrLength(SqString s)   
{
    return s.len;/*返回长度*/

int StrEqual(SqString &s,SqString &t) 
{
    int i=0;
    if (s.len!=t.len)
        return(0);/*如果长度不等,则两字符串不相等*/

    else          /*如果长度相等,则判断每个字符是否相等*/
    {
        for (i=0; i<s.len;i++)
            if (s.ch[i]!=t.ch[i])
                return(0); 
        return(1);
    }
}
SqString Concat(SqString &s,SqString &t)  
{
    SqString r;     /*定义字符串r用来保存链接后的字符串*/
    int i,j;
    for (i=0;i<s.len;i++)   /*把字符串s复制到r中*/      
        r.ch[i]=s.ch[i];
    for(j=0;j<t.len;j++)    /*把字符串t紧接着复制到r中*/  
        r.ch[j+s.len]=t.ch[j];
    r.len=s.len+t.len;        /*设置r的长度*/
    return (r);              

SqString SubStr(SqString &s,int i,int j) 
{
    SqString t;
    int k;
    if (i<1 || i>s.len || j<1 || i+j>s.len+1)
        t.len=0;        
    else
    {
        //这里你以前逻辑也不对!!
        for(k = 0;k < j;k++)
            t.ch[k] = s.ch[k + i - 1];
        t.len       = j;
        t.ch[t.len] = '\0';
    }
    return t;

int Index(SqString &s,SqString &t)    
{
    int i     = 0;
    int j     = 0;
    int nLenA = s.len;
    int nLenB = t.len;
    //这句很关键!!!对效率影响很大的,尤其是当两个字符串都很长的时候
    if (nLenA < nLenA)
        return -1;
    //你以前那个逻辑有问题,在当两个字符不相等时那段代码
    for(i = 0;i <= (nLenA - nLenB);i++)
    {
        for(j = 0;j < nLenB;j++)
        {
            if(s.ch[i + j] != t.ch[j])
                break;
        }
        if(j == nLenB )
        {
            return ++i;
        }
    }
    return -1;

int InsStr(SqString &s,int i,SqString&t)    
{
    int j;
    int k;
    if (i > s.len+1 || i < 1)
        return 0;                  
    else 
    {
         //改变s的长度
        s.len += t.len;
        j      = s.len - 1;
        //在s中为待插入子串t移动出足够的存储单元
        for (k = s.len - t.len - 1;k >= i - 1;--k)
            s.ch[j--] = s.ch[k];
        //在第i个位置开始插入子串t
        for (j = 0;j < t.len;j++)       
            s.ch[i+j - 1] = t.ch[j]; 
        return 1;
    }
}
int DelStr(SqString &s,int i,int j)
{
    int k;
    int start;
    if (i>s.len||i<1||i+j>s.len+1)
        return 0;      
    else
    {  
        --i;
        start = i;
        //删除第i个位置开始的j个字符,包括i位置,把后面的字符串移过来即可
        for(k = i + j;k < s.len;k++)    
            s.ch[start++] = s.ch[k];
        //s的长度改变
        s.len -=j;
    }
        return 1;
}

板凳

SqString RepStrAll(SqString &s,SqString &s1,SqString &s2) 
{
    int i;
    i=Index(s, s1);
    while (i>=0)
    {
        DelStr(s, i, s1.len);
        InsStr(s, i, s2);
        //这里有问题,你应该保存一个查找的起始位置,比如s = ababa s1=aba s2=cca
        //替换后s = cccca 正确应该s = ccaba
        i=Index(s, s1);       
    }
    return(s);
}
void DispStr(SqString &s)    
{  
    int i;
    if(s.len>0)
    {
        for(i=0;i<s.len;i++)
            printf("%c",s.ch[i]);
        printf("\n");
    }
    else 
    printf("空字符串\n");
}
void Menu()
{

    printf("===========顺序串基本操作====================\n");
    printf("      1=======输入字符串s1和s2\n");
    printf("      2=======显示字符串及其长度\n");
    printf("      3=======判断s1和s2是否相等\n");
    printf("      4=======复制s2到s3中\n");
    printf("      5=======连接s1和s2到s3中\n");
    printf("      6=======求s3中指定位置指定长度的字串\n");
    printf("      7=======求s3中某一字串的位置\n");
    printf("      8=======在s3中插入字串\n");
    printf("      9=======在s3中删除字串\n");
    printf("      10======查找并替换s3中的字串\n");
    printf("      0=======退出\n");
    printf("==============================================\n");
    printf("请选择:");}

3 楼

void main()
{    
    int i,j,m;
    SqString s1,s2,s3,t,str;
    InitStr(s1);
    InitStr(s2);
    InitStr(s3);
    InitStr(t);
    InitStr(str);
    Menu();
    do{    
        scanf("%d",&m);
        switch(m)
        {
        case 1:
            printf("请输入s1:");
            Input(s1);
            printf("请输入s2:");
            Input(s2);
            printf("请选择操作编号,输入0退出:\n");
            break;
        case 2:
            printf("s1:");
            DispStr(s1);
            printf("长度: %d\n",StrLength(s1));
            printf("s2:");
            DispStr(s2);
            printf("长度:%d\n",StrLength(s2));
            printf("s3:");
            DispStr(s3);
            printf("长度:%d\n",StrLength(s3));
            printf("请选择:");
            break;
        case 3:
            StrEqual(s1,s2) == 1 ? printf("相等\n") : printf("不相等\n");
            printf("请选择:");
            break;
        case 4:
            StrCopy(s3,s2);
            printf("复制后的s3为:");
            DispStr(s3);
            printf("请选择:");
            break;
        case 5:
            //Concat(s3,s1);
            s3 = Concat(s1,s2);
            printf("连接后s3为:");
            DispStr(s3);
            printf("请选择:");
            break;
        case 6:
            printf("请输入所求字串的开始位置:");
            scanf("%d",&i);
            printf("请输入所求字串的长度:");
            scanf("%d",&j);
            str = SubStr(s3,i,j);
            printf("所求字串为:");
            DispStr(str);
            printf("请选择:");
            break;
        case 7:
            printf("请输入要查找的字串:");
            Input(t);
            printf("位置:%d\n",Index(s3,t));
            printf("请选择:");
            break;
        case 8:
        
            printf("请输入要插入的字串:");
            Input(t);
            printf("请输入插入的位置:");
            scanf("%d",&i);
            InsStr(s3,i,t);
            printf("插入后的字符串为:");
            DispStr(s3);
            printf("请选择:");
            break;
        case 9:
            printf("请输入删除的开始位置:");
            scanf("%d",&i);
            printf("请输入删除的字串长度:");
            scanf("%d",&j);
            DelStr(s3,i,j);
            printf("删除后的字符串为:");
            DispStr(s3);
            break;
        case 10:
            printf("请输入被替换的字串:");
            Input(s1);
            printf("请输入替换字符串:");
            Input(s2);
            RepStrAll(s3,s1,s2);
            printf("替换后的字符串为:");
            DispStr(s3);
            printf("请选择:");
            break;
        case 0:
            break;
        default:break;
        }
    }while(m<=10);
}

4 楼

如果这都不给分绝对会引起民愤的!!!

5 楼


十分感谢哈~~~
[fly]Thanks[/fly]

我来回复

您尚未登录,请登录后再回复。点此登录或注册