| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 302 人关注过本帖
标题:串的删除和插入运行结果有问题,求解释!!!
只看楼主 加入收藏
gailv7
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-11-15
结帖率:100%
收藏
 问题点数:0 回复次数:0 
串的删除和插入运行结果有问题,求解释!!!
难道就没有人会了么?程序我改了,代码如下://-----串的堆分配存储表示------
 #include<stdio.h>
 #include<stdlib.h>
 #include <malloc.h>
 
#define TRUE    1
 #define FALSE    0
 #define OK        1
 #define ERROR    0
 #define OVERFLOW    -2
 #define INFEASIBLE    -1
 
typedef struct
 {
 char *ch;  //若是非空串,则桉串长分配存储区,否则ch为NULL
 int length;  //串长度
 }HString;
 
//--------基本操作--------
//-----初始化-------
 void InitString(HString *S)
 {
 S->ch=NULL;
 S->length=0;
 }
 
//----生成一个其值等于串常量chars的串T--------
 void StrAssign(HString *T,char *chars)   
{
   if(T->ch)
    free(T->ch);

   int len=0;
   while(chars[len])
   {
   ++len;
   }
   if(0==len)
   {
    T->ch=NULL;
    T->length=0;
   }
   else
   {
    T->ch=(char *)malloc(sizeof(char)*len);
    if(NULL==T->ch)
    {
    printf("Out of space!\n");
        exit(OVERFLOW);
    }
    else
    {
    for(int i=0;i!=len;++i)
    {
     T->ch[i]=chars[i];
    }
    T->length=len;
    }
   }
 }
 
//---返回S的元素个数,即为串的长度------
 int StrLength(HString S)  
 {
 return S.length;
 }
 
//----两个串的比较------
 int StrCompare(HString S,HString T)
 {
 for(int i=0;(i!=S.length)&&(i!=T.length);++i)
 {
   if(S.ch[i]!=T.ch[i])
    return (S.ch[i]-T.ch[i]);
 }
 return (S.length-T.length);
 }
 
//-----将S清为空串------
 void ClearString(HString *S)
 {
 if(S->ch)
 {
   free(S->ch);
   S->ch=NULL;
   S->length=0;
 }
 }
 
//-------将两个串联接成一个新串---------
 void Concat(HString *T,HString S1,HString S2)
 {
 ClearString(T);  //释放旧空间
T->ch=(char *)malloc((S1.length+S2.length)*sizeof(char));
 if(NULL==T->ch)
 {
   printf("Out of space!!!\n");
   exit(OVERFLOW);
 }
 else
 {
   for(int i=0;i!=S1.length;++i)
   {
    T->ch[i]=S1.ch[i];
   }
   T->length=S1.length+S2.length;
   for(int j=S1.length,k=0;j!=T->length,k!=S2.length;++j,++k)
   {
    T->ch[j]=S2.ch[k];
   }
 }
 }
 
//------用sub返回串S的第pos个字符长度为len的子串-------
 void SubString(HString *Sub,HString S,int pos,int len)
 {
 if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
 {
   printf("子串的起始位置或串长错误!\n");
 }
     ClearString(Sub);
 if(0==len)
 {
   Sub->ch=NULL;
   Sub->length=0;
 }
 else
 {
   Sub->ch=(char *)malloc(len*sizeof(char));
   if(NULL==Sub->ch)
   {
    printf("Out of space!!\n");
    exit(0);
   }
   int i=0;
   int k=0;
   for(i=0,k=pos-1;i!=len,k!=pos+len-1;++i,++k)
   {
    Sub->ch[i]=S.ch[k];
    Sub->length=len;
   }
 }
 }
 
// 在串st1的第pos个字符之前插入串st2
 int StrInsert(HString *st1,int pos,HString st2)
{
     int i;
     if(pos<1||pos>(*st1).length+1) // pos不合法
    return ERROR;
     if(st2.length) // st2非空,则重新分配空间,插入st2
    {
         (*st1).ch = (char*)realloc((*st1).ch,
            ((*st1).length+st2.length)*sizeof(char));
         if(!(*st1).ch)
             exit(OVERFLOW);
         for(i=(*st1).length-1;i>=pos-1;--i) // 为插入st2而腾出位置
            (*st1).ch[i+st2.length]=(*st1).ch[i];     
         for(i=0;i<st2.length;i++)
             (*st1).ch[pos-1+i]=st2.ch[i]; // 插入st2
        (*st1).length+=st2.length;
     }
     return OK;
 }
 
// 从串st1中删除第pos个字符起长度为len的子串
 int StrDelete(HString *st1,int pos,int len)
 {
     int i;
     if((*st1).length<pos+len-1)
         exit(OVERFLOW);
     for(i=pos-1;i<=(*st1).length-len;i++)
         (*st1).ch[i]=(*st1).ch[i+len];
     (*st1).length-=len;
     (*st1).ch=(char*)realloc((*st1).ch,(*st1).length*sizeof(char));
     return OK;
 }
 
//-----输出串中的字符-----
 void PrintString(HString S)
 {
 if(S.length)
 {
   for(int i=0;i!=S.length;++i)
    printf("%-4c",S.ch[i]);
   printf("\n");
 }
 else
 {
   printf("empty!\n");
 }
 }
 
int main()
 {
     HString st1;
     HString st2;
     HString sub;
     HString T;
     char ch1[20];
     printf("输入st1:");
     gets(ch1);
 
    InitString(&st1);
     StrAssign(&st1,ch1);
     PrintString(st1);

     printf("串长:%d\n",StrLength(st1));
     printf("输入st2:");
     gets(ch1);
     InitString(&st2);
     StrAssign(&st2,ch1);
     
   int state=StrCompare(st1,st2);
    if(0==state)
    {
        printf("st1和st2比较:st1=st2\n");
    }
    else if(state>0)
    {
        printf("st1和st2比较:st1>st2\n");
    }
    else
    {
        printf("st1和st2比较:st1<st2\n");
    }
 
   InitString(&T);
    printf("st1连接st2:");
    Concat(&T,st1,st2);
    PrintString(T);
 
   InitString(&sub);
   printf("st1中起始位置为7,长度为1的子串:");
    SubString(&sub,st1,7,1);
    PrintString(sub);
 
   InitString(&st1);
   printf("插入st2后的串st1=");
    StrInsert(&st1,3,st2);
    PrintString(st1);
 
   InitString(&st1);
   printf("删除起始位置为4,长度为3的子串后st1=");
    StrDelete(&st1,4,3);
    PrintString(st1);
 
   ClearString(&st1);
    ClearString(&st2);
    ClearString(&sub);
    ClearString(&T);
 
   return ERROR;
 }
 大侠救急啊!!!
搜索更多相关主题的帖子: include 
2011-11-16 20:04
快速回复:串的删除和插入运行结果有问题,求解释!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041734 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved