第四章 串的基本操作【数据结构】

运行截图。

自己太久没有这样用过指针了,总是用不好~~

下次自己申请了一个指针,就得初始化,不然在判断是否为空的操作下,会导致程序停止运行。(传说中的敲代码5分钟,debug2小时又被我碰上了,泪目)。


#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 1000
typedef int Status;
//------串的堆存储表示-------- 
typedef struct{
    char *ch;若是非空串,则按串长分配存储区,否则ch为NULL 
    int length;串长度 
}HString;
--------------------------------------基本操作的算法描述--------------------- 
生成一个其值等于串常量chars的串T 
Status StrAssign(HString *T,char *chars)
{
    int i,j;
    char *c;
    if(T->ch)
        free(T->ch);释放T原有的存储空间 
    for(i = 0,c = chars;*c; c++,i++);求chars串的长度 
    if(!i)
    {
        T->ch = NULL;
        T->length = 0;
    }
    else
    {
        T->ch = (char*)malloc(i*sizeof(char));
        if(!T->ch)
            exit(0);
        j = 0;
        while(j < i)
        {
            T->ch[j] = chars[j++];
        }
        T->length = i;
    }
    return OK;
}
返回串S的长度
int StrLength(HString S) 
{
    return S.length;
}
若S>T,返回值>0;若S==T,返回值=0;若S<T,返回值<0 
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 ;
}
用T返回由s1和s2连接而成的新串
Status Contact(HString &T,HString s1,HString s2)
{
    if(T.ch)
        free(T.ch);释放旧空间
     
    
} 
清空串S 
Status ClearString(HString &S)
{
    if(S.ch)
    {
        free(S.ch);
        S.ch = NULL;
    }
    S.length = 0;
    连接串s1和串s2,用T返回 
Status Concat(HString &T,128)">0,0)">释放旧空间 
    T.ch = (malloc((s1.length + s2.length )*char));
    if(!T.ch)
        exit(0);
    while(i < s1.length)
    {
        T.ch[i] = s1.ch[i++];
    }
    T.length = s1.length + s2.length ;
    j = while(j < s2.length)
    {
        T.ch [i++] = s2.ch[j++];
    }
    返回串s的第pos个字符起长度为len的子串
Status SubString(HString &sub,HString s,255)">int pos,255)">int len)
{
    if(pos < 1||pos > s.length || len < 0||len > s.length -1)
        return ERROR;
    if(sub.ch)
        free(sub.ch);
    if(!len)空子串 
    {
        sub.ch = NULL;
        sub.ch = else完整子串 
    {
        sub.ch = (malloc(len*while(i < len)
        {
            sub.ch[i] = s.ch[pos+i-1];
            i++;
        }
        sub.length = len;
    }
    return OK;
} 
在S串的第pos个字符前插入串T 
Status StrInsert(HString &S,255)">int pos,128)">0||pos > S.length-1)pos 不合法 
        if(T.length)T非空,则重新分配存储空间,插入T 
    {
        S.ch = (realloc(S.ch,(S.length + T.length)*if(!S.ch)
            exit(0);
        int i = S.length-1; i >= pos-1;i--)为插入T 腾出位置 
            S.ch[i+T.length] = S.ch[i];
        0; i < T.length ; i ++)插入T 
            S.ch[i+pos-1] = T.ch[i];
        S.length += T.length ;    
        S.ch[S.length] = '\0';
    }
    int main()
{
    char s1[MAXSIZE],s2[MAXSIZE];
    HString SS,T,sub,S1,S2;
    int flag,pos,len;
    printf("请输入串S1和串S2\n");
    while(scanf(%s %s",s1,s2),s1[0]!=#'&&s2[')
    {
        T.ch = SS.ch = NULL;
        StrAssign(&SS,s1);创建串T
        StrAssign(&T,s2); 创建串S 
        printf(S串为:\n");
        0;SS.ch[i]!=';i++)
            printf(%c",SS.ch[i]);
        printf(\n");
        printf(T串为:\n0; T.ch[i]!=';i ++)
            printf(\n\n");
        
        printf(S串的长度为%d\n\n比较两串
        if(flag > 0)
            printf(S串>T串\n\nelse if(flag == S串=T串\n\nelse
            printf(S串<T串\n\n");
        S1.ch = S2.ch = NULL;
        StrAssign(&S1,0)">创建串S1 
        StrAssign(&S2,s2);创建串S2 
        Concat(T,S2);将串s1和串s2连接
        printf(连接后的串T为:\n0;T.ch[i]!=请输入要在S中输出的子串的位置pos和长度\n"); 
        scanf(%d%d返回串s的第pos个字符起长度为len的子串 
        printf(子串为:\n0; sub.ch[i]!=");
        
        StrInsert(SS,T);在串S的第pos个位置前插入串T
        printf(在第%d个位置前入串T后的串S为:\n';i++)
             printf(");
        
        ClearString(SS);清空串S
    }
    return 0;
 } 

相关文章

【啊哈!算法】算法3:最常用的排序——快速排序       ...
匿名组 这里可能用到几个不同的分组构造。通过括号内围绕的正...
选择排序:从数组的起始位置处开始,把第一个元素与数组中其...
public struct Pqitem { public int priority; ...
在编写正则表达式的时候,经常会向要向正则表达式添加数量型...
来自:http://blog.csdn.net/morewindows/article/details/6...