数据结构C语言实现之串

来源:互联网 发布:linux arp高速缓存表 编辑:程序博客网 时间:2024/05/16 00:58
#include <stdio.h>#include <stdlib.h>#include <string.h>//定义函数结果状态码#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0//定义数据类型//typedef int ElemType ;//定义顺序串空间大小,最多存放40个字符#define STRINGSIZE 20//定义程序返回状态类型typedef int State;// 定义顺序串结构体typedef struct{ char ch[STRINGSIZE];//按串长分配存储空间 int length;//存放串长}String;/*************************************************Function:       StrAssignDescription:    生成一个其值等于字符串常量s的串TInput:          串 String T                字符串指针 char *sOutput:Return:         成功返回OK,失败返回ERROROthers:*************************************************/State StrAssign(String *T, char *s){    int i,length = strlen(s);    if(length > STRINGSIZE)    {        printf("The s is too long!");        return ERROR;    }    for(i = 0; i < length; i++)        {            T->ch[i] = s[i];        }    T->length = length;    return OK;}/*************************************************Function:       StrCopyDescription:    由串S复制得串TInput:          串 String *T                串 String *SOutput:Return:         成功返回OK,失败返回ERROROthers:*************************************************/State StrCopy(String *T, String *S){    int i,length = S->length;    for(i = 0; i < length; i++)        T->ch[i] = S->ch[i];    T->length = length;    return OK;}/*************************************************Function:       StrEmptyDescription:    判断T是否为空串Input:          串 String *TOutput:Return:         为空返回TRUE,不为空返回FALSEOthers:*************************************************/State StrEmpty(String *T){    if(T->length == 0)        return TRUE;    else        return FALSE;}/*************************************************Function:       StrCompareDescription:    比较两个非空串的大小Input:          串 String *T                串 String *SOutput:Return:         若S>T,返回值>0, S<T,返回值<0, S=T,返回值=0Others:*************************************************/int StrCompare(String *S,String *T){    int i;    //如果有非空串,程序退出,若返回相关标志怕与下面返回的差值冲突    if((S->length == 0) || (T->length == 0))        exit(1);    for(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;}/*************************************************Function:       StrLengthDescription:    返回串的长度Input:          串 String *SOutput:Return:         intOthers:*************************************************/int StrLength(String *S){    return S->length;}/*************************************************Function:       StrClearDescription:    清空串Input:          串 String *SOutput:Return:         成功返回OKOthers:*************************************************/State StrClear(String *S){    S->length = 0;    return OK;}/*************************************************Function:       ConcatDescription:    用T返回由S1和S2连接而成的串Input:          String *T                String *S1                String *S2Output:Return:         成功返回OK,若T装不下则装入截断后的内容,返回ERROROthers:*************************************************/State Concat(String *T,String *S1,String *S2){    int i,j;    if(S1->length+S2->length <= STRINGSIZE)    {        for(i=0;i<S1->length;i++)            T->ch[i] = S1->ch[i];        for(j=0;j<S2->length;i++,j++)            T->ch[i] = S2->ch[j];        T->length = S1->length + S2->length;        return OK;    }    else //截断S2    {        for(i=0;i<S1->length;i++)        {            T->ch[i] = S1->ch[i];        }        for(j=0;i < STRINGSIZE;i++,j++)        {            T->ch[i] = S2->ch[j];        }        T->length = STRINGSIZE;        return ERROR;    }}/*************************************************Function:       SubStringDescription:    用Sub返回串S中自pos位置开始长度为len的字串Input:          String *Sub                String *S                int pos    pos>=1 && pos<=S->length                int len    len>=0 && pos+len <= S->length+1 //注意要+1Output:Return:         成功返回OK,pos与len不合适返回ERROROthers:*************************************************/State SubString(String *Sub,String *S,int pos,int len){    int i,j;    if((pos>=1 && pos<=S->length) && (len>=0 && len+pos<=S->length+1))    {        for(i=0,j=pos-1;i<len;i++,j++)        {            Sub->ch[i]=S->ch[j];        }        Sub->length = len;        return TRUE;    }    return ERROR;}/*************************************************Function:       IndexDescription:    若主串S中第pos个字符之后存在与T相等的子串                则返回第一个这样的子串在S中的位置,否则返回0Input:          String *S  非空,不做检查                String *T  非空,不做检查                int pos    pos>=1 && pos<=S->lengthOutput:Return:Others:*************************************************/int Index(String *S,String *T,int pos){    int m,n,i;    String sub;    if(pos>0)    {        n = S->length;        m = T->length;        i = pos;        while(i <= n-m+1)        {            SubString(&sub,S,i,m);            if(0 != StrCompare(&sub,T))            {                ++i;            }            else            {                return i;            }        }    }    return 0;}/*************************************************Function:       StrInsertDescription:    在串S的自第pos个字符处插入串TInput:          String *S                int pos   1<= pos <= S->length+1                String *T  非空Output:Return:         完全插入且原串无溢出返回OK,                部分插入                全部插入但原串溢出 返回ERROROthers:         不满意*************************************************/State StrInsert(String *S,int pos,String *T){    int len=T->length,i,j;    //插入位置不合法    if(pos<1 && pos>S->length+1)        return ERROR;    //  完全插入    if(S->length+len <= STRINGSIZE)    {        for(i=S->length-1; i >= pos-1; i--)            S->ch[i+len]=S->ch[i];        for(i=0; i<len; i++)            S->ch[pos-1+i] = T->ch[i];        S->length = S->length+T->length;        return TRUE;    }    else if(pos-1+len <= STRINGSIZE)//  完全插入但原串溢出        {            for(i=STRINGSIZE-1-len; i>=pos-1; i--)                S->ch[i+len] = S->ch[i];            for(i=0; i<len; i++)                S->ch[pos-1+i]=T->ch[i];            S->length = STRINGSIZE;            return FALSE;        }        else    //部分插入        {            for(i=pos-1,j=0; i<STRINGSIZE; i++,j++)                S->ch[i] = T->ch[j];            S->length = STRINGSIZE;            return FALSE;        }}/*************************************************Function:       StrDeleteDescription:    删除串S中从pos位置起长度为len的子串Input:          String *S 非空,不判断                int pos   pos>0 && pos<=S->length-len+1                int len   len>0 && pos<=S->length-len+1Output:Return:         成功返回OK,否则返回ERROROthers:*************************************************/State StrDelete(String *S,int pos,int len){    int i;    //验证pos 和 len的范围    if(pos<1 || pos>S->length-len+1 || len<0)return ERROR;    for(i=pos-1+len; i<S->length; i++)S->ch[i-len] = S->ch[i];S->length -= len;return OK;}/*************************************************Function:       StrDestroyDescription:    销毁串Input:          String *S 非空,不判断Output:Return:         成功返回OKOthers:*************************************************/State StrDestroy(String *S){    free(S);    return OK;}   

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 身份证到期了驾驶证上的号码怎么办 小车占道跟大车刮交警怎么办 邻居把消防栓的位置占用了怎么办 查环保要停业整改一个月怎么办 抽油烟机管道公共排烟道漏烟怎么办 深圳龙华电动车被交警扣了怎么办 英国平邮寄到中国丢件怎么办 安卓app与设备不兼容怎么办 手机卡坏了收不到快递短信怎么办 pph手术后钛钉没有脱落怎么办 右侧附件囊状透明声可怎么办 刚刚出生小孩睾丸没有掉下来怎么办 汽车被依非法营运之由扣押怎么办 老婆结婚小孩两个又上夜场该怎么办 对于不断无理要求赔偿的房东怎么办 欠的钱越来越多不知道怎么办了 手机壳的开机按键不好按怎么办 对方把保权的房子卖给我怎么办 内存卡在手机上显示损坏怎么办 内存卡显示但是下载不了东西怎么办 相机sd卡没办法读卡怎么办 尼康相机新sd卡显示满了怎么办 修冰箱没几个月又坏了怎么办 星露谷物语活动中心成了仓库怎么办 你家如果油锅起火时应该怎么办 当你遇到电器起火时应该怎么办 酷派大神f2充不进去电怎么办 借车子别人开违章一年了怎么办 快递刚发货我点错了收货怎么办 快递收货地址错了已经发货了怎么办 老公在外地工地上夜班吃不好怎么办 工人在工地干活被吊车撞了怎么办 小米手机记不得保密柜密码怎么办 华为手机文件保密柜密码忘了怎么办 超市寄存柜密码纸丢了怎么办 佳明软件安装不到手机上怎么办 最好的朋友的抢了自己的活怎么办 支付宝被实名验证上限了怎么办 装修预留插座被挡了一半怎么办 衣服放在柜子里面有味道怎么办 河北发货一个柜到天津港口怎么办