zoukankan      html  css  js  c++  java
  • 串的动态顺序存储代码

    由于静态顺序存储使用C语言实现有些麻烦,其次容易产生溢出,因此就不对串的静态顺序存储实现了,而是采用

    动态顺序存储,使得存储串的长度可以动态分配存储空间。下面是它的实现代码

    #include <stdio.h>
    #include <stdlib.h>
    
    #define OK 1
    
    typedef int Status;
    typedef struct {
      char *data;
      int  len;
    }String;
    
    Status strInit(String *T){
      T->data = NULL;
      T->len = 0;
      return OK;
    }
    
    //***********************//
    //       基本操作      //
    //***********************//
    
    //赋值
    Status strAssign(String *T,char *str){ if(T->data)free(T->data); int i,j; i=j=0; while(str[i]!='')i++; if(!i){T->data=NULL;T->len=0;} //empty else{ //copy T->data = (char*)malloc(i*sizeof(char)); for(j=0;j<i;j++) T->data[j]=str[j]; T->len = i; } return OK; }
    //拼接 Status strConcat(String
    *T,String S1,String S2){ if(T->data)free(T->data); int j; int i = S1.len + S2.len; T->data = (char*)malloc(i*sizeof(char)); for(j=0;j<S1.len;j++) T->data[j]=S1.data[j]; for(j=S1.len;j<i;j++) T->data[j]=S2.data[j-S1.len]; T->len = i; return OK; }
    //截取 Status subString(String
    *Sub, String S,int pos,int len){ if(pos<0 || pos>=S.len || len<0 || pos+len>S.len){ printf("In Function:subString error "); exit(1); } int i; if(Sub->data)free(Sub->data); if(!len){Sub->data=NULL;Sub->len=0;} else{ Sub->data = (char*)malloc(len * sizeof(char)); Sub->len = len; for(i=0;len>0;len--,i++) Sub->data[i] = S.data[pos++]; Sub->data[Sub->len]=''; } return OK; }
    //复制 Status strCopy(String
    *T, String S,int i){ if(i<0 || i>S.len){ printf("In Function:strCopy error "); exit(2); } int j; if(T->data)free(T->data); if(!i){T->data=NULL;T->len=0;} else{ T->data = (char*)malloc(i*sizeof(char)); for(j=0;j<i;j++) T->data[j]=S.data[j]; T->len = i; } }
    //比较
    int strCompare(String T,String S){ //compare length if(T.len != S.len)return T.len-S.len; //compare ASCII code else{ int i; for(i=0;i<T.len;i++) if(T.data[i]!=S.data[i]) return T.data[i]-S.data[i]; } return 0; } //***************************// //    复合操作    // //***************************//

    //插入
    Status strInsert(String *T,int pos,String S){ int tail_len = T->len-pos; int head_len = pos; //head_string String sub1; strInit(&sub1); strCopy(&sub1,*T,pos); //tail_string String sub2; strInit(&sub2); subString(&sub2,*T,pos,tail_len); //concat_string String tmp; strInit(&tmp); strConcat(&tmp,sub1,S); strConcat(T,tmp,sub2); return OK; }
    //删除 Status strDelete(String
    *T,int pos,int len){ if(pos<0 || pos>=T->len || len<0 || len+pos>T->len){ printf("In Function:strDelete error"); exit(1); } int i=pos; while(T->data[i]){ T->data[i] = T->data[i+len]; //overlap i++; } T->len-=len; return 0; }
    int main(){ String T,S1,S2,tmp,a,b; strInit(&T); strInit(&a); strInit(&b); strInit(&S1); strInit(&S2); strInit(&tmp); //concat strAssign(&S1,"hello "); strAssign(&S2,"world"); strConcat(&T,S1,S2); printf("%s ",T.data); //T is "hello world" //subString int pos = 3; int len = 4; subString(&S1,T,pos,len); printf("%s ",S1.data); //S1 is "lo w" //copy strCopy(&S1,T,7); printf("%s ",S1); //S1 is "hello w" //compare int res; strAssign(&a,"hello worldaCc"); strAssign(&b,"hello worldacc"); if(!(res = strCompare(a,b))) printf("two sentence is eual "); else{ if(res>0)printf("res is %d ",res); else printf("res is %d ",res); } //insert strAssign(&tmp,"III"); strInsert(&T,6,tmp); printf("len=%d:"%s" ",T.len,T.data); //T is "hello IIIworld" //delete strDelete(&T,6,3); printf("len=%d:"%s" ",T.len,T.data); ///T is "hello world" return 0; }






  • 相关阅读:
    课堂Scrum站立会议演示
    每周工作进度及工作量统计
    连连看的设计与实现——四人小组项目(GUI)
    连连看的设计与实现——四人小组项目(NABCD)
    用户模板和用户场景
    对MySQL 存储过程中乱码的破解
    MySQL数据库同步的实现
    解决MySQL无法远程访问的3方案
    使用SQL Server 2014内存数据库时需要注意的地方
    navicat for sql server中文版|SQL Server管理及开发工具(Navicat for SQL Server)下载 v11.2.13
  • 原文地址:https://www.cnblogs.com/demonxian3/p/7471235.html
Copyright © 2011-2022 走看看