串的动态顺序存储代码

由于静态顺序存储使用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]!=‘\0‘)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\n");
    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]=‘\0‘;
  }
  return OK;
}
//复制
Status strCopy(String *T, String S,int i){
  if(i<0 || i>S.len){
    printf("In Function:strCopy error\n");
    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\n",T.data);     //T is "hello world"

  //subString
  int pos = 3;
  int len = 4;
  subString(&S1,T,pos,len);
  printf("%s\n",S1.data);    //S1 is "lo w"

  //copy
  strCopy(&S1,T,7);
  printf("%s\n",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\n");
  else{
    if(res>0)printf("res is %d\n",res);
    else printf("res is %d\n",res);
  }

  //insert
  strAssign(&tmp,"III");
  strInsert(&T,6,tmp);
  printf("len=%d:\"%s\"\n",T.len,T.data);  //T is "hello IIIworld"

  //delete
  strDelete(&T,6,3);
  printf("len=%d:\"%s\"\n",T.len,T.data);  ///T is "hello world"
  return 0;
}
时间: 2024-10-07 01:54:24

串的动态顺序存储代码的相关文章

C#动态执行字符串(动态创建代码)

在编写C#程序的时候,有时我们需要动态生成一些代码并执行.然而C#不像JavaScript有一个Eval函数,可以动态的执行代码.所有这些功能都要我们自己去完成.如下是实例. 动态创建代码: using System; using System.Data; using System.Configuration; using System.Text; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Reflec

如何根据动态SQL代码自动生成DTO

当前的状况 一般做数据库相关开发, 除非学习, 否则很少有人愿意直接使用JDBC.本来Java代码就比较啰嗦了,而直接用JDBC写代码之啰嗦简直有些令人发狂!所以在实际开发过程中,我们通常都会使用一些框架/库来帮助我们操作数据库.而且开源市场上的选择也比较多,就我个人接触到的有:Hibernate,MyBatis,JdbcTemplate,DbUtils,ActiveRecord,JavaLite等等. 这些框架都能大幅的提高开发效率,对于一些基本CRUD操作来说,虽然各有差异,但总的来说基本是

C# 动态编译代码

C# 动态编译代码: 公共辅助类,有注释就不废话了. using System; using System.Text; using System.Reflection; using System.CodeDom.Compiler; namespace DynamicCompilation.Compilation { /// /// 编译返回结果 /// public class CompilationReturn { /// /// 程序集 /// public Assembly Assembl

Emit动态生成代码

Emit动态生成代码 引用:秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, // specify a new assembly name var assemblyName = new AssemblyName("Kitty"); 从当前应用程序域获取程序集构造器, // create assembly builder var assemblyBuilder=AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyNam

串的动态存储分配

串:由零个或者多个字符组成的有限序列.零个字符的串称为空串,和空格串[一个或多个空格诸城的串]有区别,请注意比较.在串的抽象数据类型中,有五个操作组成最小操作子集,分别是串赋值StrAssign,串比较StrCompare,求串长StrLength ,串联接Concat,求子串SubString.现以串的动态存储结构为例,将5个基本操作实现如下: 具体介绍详见注释. 1 /** 2 在串的抽象数据类型的13中操作中:串赋值StrAssign,串比较StrCompare,求串长StrLength

动态生成代码中的事件注意事项

var d = '<a href="#" title="查看"  onclick ="ViewById(' + row.Id + ','+"'"+row.vpdm+"'"+')">' + value + '</a>'; "'"+row.vpdm+"'"这里要加上单引号,前面的row.Id是int所以不用,但后面的是字符串类型就得加上单引号,要不

JS打字效果的动态菜单代码分享

这篇文章主要介绍了JS打字效果的动态菜单,推荐给大家,有需要的小伙伴可以参考下. 这是一款基于javascript实现的打字效果的动态菜单特效代码,分享给大家学习学习. 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式.为大家分享的JS打字效果的动态菜单代码如下 <html> <head> <title>JS打字效果的动态菜单</title> <meta http-equiv="imagetoolbar" content=&q

java 动态代理代码

java 动态代理代码 最近学了java 代理,感觉很神奇,尤其是动态代理,功能真是强大,如果有了动态代理,那么黑客是不是更加发展一步呢... 实现java动态代理,主要实现几个步骤 1.实现 InvocationHandler 接口,然后实现 public Object invoke(Object proxy, Method m, Object[] args) 方法,代码如下 package com.chapter1.dynamicproxy; import java.lang.reflect

程序动态编译代码

c#可以在程序运行过程中动态的编译代码,并生成程序集加载在内存,然后就可以动态的调用代码生成的程序了,这有点像我们的vs编译器,感兴趣的可以制作属于自己的c#编译器: 要实现这种功能,我们只需要调用CSharpCodeProvider就可以实现了: string prefix = "using System;"+ "public static class Test{"+ "public static void Run(){"; string po