标签:
(C版之java线程例子)
串,即字符串。计算机上的非数值处理的对象基本上是字符串数据。但是,由于现在我们使用的计算机硬件结构主要是反映数值计算的需要的,在处理字符串数据时比处理整数和浮点数要复杂的多。而且,对于不同类型程序,所处理的字符串具有不同的特点,要有效地实现字符串的处理,就必须根据具体情况使用合适的存储结构。串的存储表示主要有:1.定长顺序存储表示; 2. 堆分配存储表示; 3.块链存储表示。
以下介绍比较简单的定长顺序存储表示。
串定长顺序存储表示,说白了,就是用以个固定长度字符数组来存放。
1.定义“头部”
2.初始化
3.把一个字符数组赋给SString。。
也许看到在这,你会问,SString本身是一个字符数组,为什么又要用一个字符数组去赋给SString?
其实不然,SString相对与字符数组,已经有所不同了,它以数组中下标0的位置存放串当前的实际长度。PASCAL语言中就是使用这个串类型的表示方法。
而对于char *chars = "12345",要像把它赋给另一个字符数组如char chars1[n],那么这里的n值必须大于等于6。因为C语言在字符串末位加了‘\0‘作为结束标志符。但是有的编译器如gcc不检测这错误。
4.串的比较
5.从S下标为pos开始,取长度len的子串Sub。
6.串的合并:S1,S2合并为S
7.模式匹配的一种改进算法:KMP算法
/* 2 * 七、数据结构基础之顺序串 3 * 顺序串与顺序表类似,用一组地址连续的存储单元来存储串中的字符序列 4 * --- 2012年4月29日 ---by lee 5 */ 6 7 #ifndef _SEQUENTIAL_STRING_H 8 #define _SEQUENTIAL_STRING_H 9 10 #include "Utility.h" 11 12 //宏定义顺序串的空间大小,最多存放20个字符 13 #define STRINGSIZE 21 14 15 16 //声明顺序表类型结构体 17 typedef struct _SqString 18 { 19 char str[STRINGSIZE];//存放数据元素的数组 20 int length;//记录串的实际长度 21 } SqString; 22 23 /* 串匹配算法 24 * 目标串:"t0 t1 t2 ... tn-1" (length=n) 25 * 模式串:"p0 p1 p2 ... pm-1" (m>=1 && m<=n) 26 * 找出模式串P在目标串T中首次出现的有效位移i 27 */ 28 29 // 朴素的串匹配算法: 30 // 用一个循环来依次检查i(i>=0 && i<=n-m)是否为有效位移 31 // 匹配成功则返回目标串中的有效位移i,否则返回-1 32 int NaiveMatch(SqString *T, SqString *P) 33 { 34 int n=T->length;//目标串长度 35 int m=P->length;//模式串长度 36 int j,k; 37 //外层循环i控制位移 38 for(int i=0; i<=n-m; i++) 39 { 40 j=0;//j作为模式串P的计数器 41 k=i;//k作为目标串中匹配P的字符串的计数器 42 while((j<m) && (T->str[k]==P->str[j])) 43 { 44 k++; 45 j++; 46 } 47 //j移动到最后,则说明完全匹配 48 if(j==m) 49 { 50 return i;//返回有效位移i 51 } 52 } 53 return -1; 54 } 55 56 57 58 59 #endif
用堆分配存储表示实现Hstring串类型的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用C语言本身提供的串函数)。
代码一如下:
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct{
char *ch;
int length;
}HString;
Status StrAssign(HString *t,char *chars){
int i,j;
char *c;
if(t->ch) free(t->ch);
for(i=0,c=chars;c[i]!=‘\0‘;i++);
if(!i) {t->ch=NULL;t->length=0;}
else {
t->ch=(char *)malloc(i *sizeof(char));
if(!(t->ch))
exit(OVERFLOW);
for(j=0;j<i;j++)
t->ch[j]=chars[j];
t->length=i;
}
return OK;
}
Status DestroyString(HString *s)
{free(s->ch);
s->ch=NULL;
s->length=0;
return OK;
}
void print(HString T)
{int i;
for(i=0;i<T.length;i++)
printf("%c",T.ch[i]);
printf("\n");
}
int StrLength(HString S){
return S.length;
}
Status ClearString(HString *s){
if(s->ch) {free(s->ch);s->ch=NULL;}
s->length=0;
return OK;
}
Status Concat(HString *t,HString S1,HString S2){
int i;
ClearString(t);
t->ch=(char *)malloc((S1.length+S2.length) *sizeof(char));
if(!(t->ch))
exit(OVERFLOW);
for(i=0;i<S1.length;i++)
t->ch[i]=S1.ch[i];
t->length=S1.length+S2.length;
for(i=0;i<t->length;i++)
t->ch[S1.length+i]=S2.ch[i];
return OK;
}
Status SubString(HString *sub,HString S,int pos,int len){
int i;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
return ERROR;
if(sub->ch) free (sub->ch);
if(!len) {sub->ch=NULL;sub->length=0;}
else{
sub->ch=(char *)malloc(len *sizeof(char));
for(i=0;i<len;i++)
sub->ch[i]=S.ch[pos-1+i];
sub->length=len;
}
return OK;
}
int StrCompare(HString S,HString T){
int i;
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;
}
int Index(HString S,HString T,int pos)
{int i,m,n;
HString Sub,*sub=⋐
Sub.ch=NULL;
if(pos>0){
n=StrLength(S);m=StrLength(T);i=pos;
while(i<=n-m+1){
SubString(sub,S,i,m);
if(StrCompare(Sub,T)!=0) ++i;
else return i;
}
}
return 0;
}
Status StrInsert(HString *s,int pos,HString T)
{int i;
if(pos<1||pos>s->length+1) return ERROR;
if(T.length){
s->ch=(char *)realloc(s->ch,(s->length+T.length) *sizeof(char));
if(!s->ch) exit(OVERFLOW);
for(i=s->length-1;i>=pos-1;--i)
s->ch[i+T.length]=s->ch[i];
for(i=0;i<=T.length-1;i++)
s->ch[pos-1+i]=T.ch[i];
s->length+=T.length;
}
return OK;
}
Status StrDelete(HString *s,int pos,int len)
{int i;
if(pos<1||pos>s->length) return ERROR;
for(i=pos+len-1;i<s->length;i++)
s->ch[i-len]=s->ch[i];
s->length-=len;
return OK;
}
Status Replace(HString *s,HString T,HString V)
{int i,n,d;
n=StrLength(T);
do{d=Index(*s,T,1);
StrDelete(s,d,n);
StrInsert(s,d,V);
}while(Index(*s,T,1));
return OK;
}
main()
{int i;
HString S,S1,S2,S3,T,U,V,W,*s;
clrscr();
S.ch=NULL;S1.ch=NULL;S2.ch=NULL;S3.ch=NULL;
T.ch=NULL;U.ch=NULL;V.ch=NULL;W.ch=NULL;
s=&S1;StrAssign(s,"THIS IS A BOOK");
s=&S2;StrAssign(s,"ESE ARE");
s=&U;StrAssign(s,"XYXYXYXYXYXY");
s=&S;StrAssign(s,"S");
s=&W;StrAssign(s,"W");
s=&S3;SubString(s,S1,3,7);
s=&V;SubString(s,U,6,3);
s=&T;Concat(s,S1,S);
Replace(s,S3,S2);
s=&U;Replace(s,V,W);
printf("S1=");print(S1);;
printf("T=");print(T);
printf("U=");print(U);
DestroyString(&S);
DestroyString(&S1);
DestroyString(&S2);
DestroyString(&S3);
DestroyString(&T);
DestroyString(&U);
DestroyString(&V);
DestroyString(&W);
getch();
}
代码段二用选择顺序实现用户的需要
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct{
char *ch;
int length;
}HString;
void menu()
{ clrscr();
printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("\n***** StrAssign-1 Destroy-2 Print-3 Concat-4 Substring-5 Replace-6 Quit-7 *****\n");
printf("\n** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **\n");
gotoxy(15,10);printf("Operation: \n");
gotoxy(1,20);
printf("\n*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\n");
printf("\n* Enter a operation code:1,2,3,4,5,6,7 *\n");
printf("\n**** **** **** **** **** **** **** **** **** **** **** **** **** **** ****\n");
gotoxy(26,10);
}
Status StrAssign(HString *t,char *chars){
int i,j;
char *c;
if((*t).ch) free((*t).ch);
for(i=0,c=chars;c[i]!=‘\0‘;i++);
if(!i) {(*t).ch=NULL;(*t).length=0;}
else {
(*t).ch=(char *)malloc(i*sizeof(char));
if(!((*t).ch))
exit(OVERFLOW);
for(j=0;j<i;j++)
(*t).ch[j]=chars[j];
(*t).length=i;
}
return OK;
}
Status DestroyString(HString *p)
{if(p->ch==NULL)return ERROR;
free(p->ch);
p->ch=NULL;
p->length=0;
return OK;
}
int StrLength(HString S)
{
return S.length;
}
void Print(HString T)
{int i;
if(T.length==0)printf("null string!\n");
for(i=0;i<=T.length-1;i++)
printf("%c",T.ch[i]);
printf("\n");
}
Status ClearString(HString *p){
if(p->ch) {free(p->ch);p->ch=NULL;}
p->length=0;
return OK;
}
Status ConCat(HString *t,HString S1,HString S2){
int i;
ClearString(t);
(*t).ch=(char *)malloc((S1.length+S2.length) *sizeof(char));
if(!((*t).ch))
exit(OVERFLOW);
for(i=0;i<S1.length;i++)
(*t).ch[i]=S1.ch[i];
(*t).length=S1.length+S2.length;
for(i=0;i<(*t).length;i++)
(*t).ch[S1.length+i]=S2.ch[i];
return OK;
}
Status SubString(HString *sub,HString S,int pos,int len){
int i;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
return ERROR;
if((*sub).ch) free ((*sub).ch);
if(!len) {(*sub).ch=NULL;(*sub).length=0;}
else{
(*sub).ch=(char *)malloc(len *sizeof(char));
for(i=0;i<len;i++)
(*sub).ch[i]=S.ch[pos-1+i];
(*sub).length=len;
}
return OK;
}
int StrCompare(HString S,HString T)
{
int i;
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;
}
int Index(HString S,HString T,int pos)
{int i,m,n;
HString Sub,*sub=⋐
Sub.ch=NULL;
if(pos>0){
n=StrLength(S);m=StrLength(T);i=pos;
while(i<=n-m+1){
SubString(sub,S,i,m);
if(StrCompare(Sub,T)!=0) ++i;
else return i;
}
}
return 0;
}
Status StrInsert(HString *p,int pos,HString T)
{int i;
if(pos<1||pos>p->length+1) return ERROR;
if(T.length){
p->ch=(char *)realloc(p->ch,(p->length+T.length) *sizeof(char));
if(!p->ch) exit(OVERFLOW);
for(i=p->length-1;i>=pos-1;--i)
p->ch[i+T.length]=p->ch[i];
for(i=0;i<=T.length-1;i++)
p->ch[pos-1+i]=T.ch[i];
p->length+=T.length;
}
return OK;
}
Status StrDelete(HString *p,int pos,int len)
{int i;
if(pos<1||pos>p->length) return ERROR;
for(i=pos+len-1;i<p->length;i++)
p->ch[i-len]=p->ch[i];
p->length-=len;
return OK;
}
Status Replace(HString *p,HString T,HString V)
{int i,n,d;
n=StrLength(T);
do{d=Index(*p,T,1);
StrDelete(p,d,n);
StrInsert(p,d,V);
}while(Index(*p,T,1));
return OK;
}
main()
{int i,ch; int pos,len;
HString T,M1,M2,M3,M4,*p;
T.ch=NULL;M1.ch=NULL;M2.ch=NULL;M3.ch=NULL;M4.ch=NULL;p=NULL;
ch=1;
clrscr();
while(ch)
{ menu();
scanf("%d",&ch);
switch(ch)
{
case 1:clrscr();
printf("input the mather string(press ‘Enter‘ to shou the end) :\n");
scanf("%s",p);
if(StrAssign(&M1,p)) printf("Assign string mather success!\n");
else printf("Assign string mather fail!\n");
printf("input the chile string(press ‘Enter‘ to shou the end) :\n");
scanf("%s",p);
if(StrAssign(&M2,p)) printf("Assign string child success!\n");
else printf("Assign string child fail!\n");
printf("press any key to continue !\n");
getch();
break;
case 2:clrscr();
p=&M1;
if(DestroyString(p))printf("destroy mather string success!\n");
else printf("null pointer,can‘t destroy!\n");
p=&M2;
if(DestroyString(p))printf("destroy child string success!\n");
else printf("null pointer,can‘t destroy!\n");
p=&M3;
if(DestroyString(p))printf("destroy small string success!\n");
else printf("null pointer,can‘t destroy!\n");
p=&M4;
if(DestroyString(p))printf("destroy replaced string success!\n");
else printf("null pointer,can‘t destroy!\n");
printf("press any key to continue !\n");
getch();
break;
case 3:clrscr();
p=&M1;
printf("mather string is :\n");
Print(*p);
p=&M2;
printf("child string is:\n");
Print(*p);
p=NULL;
printf("press any key to continue !\n");
getch();
break;
case 4:clrscr();
ConCat(&T,M1,M2);
printf("the concat string is :\n");
Print(T);
M1=T;
printf("press any key to continue:\n");
getch();
break;
case 5:clrscr();
printf("input the pos and the len:\n");
scanf("%d%d",&pos,&len);
SubString(p,M1,pos,len);
printf("the sub string is:\n");
Print(*p);
T.ch=NULL;
printf("press any key to continue:\n");
getch();
break;
case 6:clrscr();
printf("input the string need to replace:\n");
scanf("%s",&M3);
printf("input the new string you want to change to:\n");
scanf("%s",&M4);
Replace(&M1,M3,M4);
printf("the replaced string is :\n");
Print(M1);
DestroyString(&T);
printf("press any key to continue:\n");
getch();
break;
case 7:exit(0);
}
}
}
#include <stdio.h>
#include <malloc.h>
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int status;
typedef struct
{
char *ch;//按串长分配存储空间
int length;//存放串长
}sstring;
status initstring(sstring &s)
{//初始化串,堆存储方式
s.ch=(char*)malloc(sizeof(char));
if(!s.ch) return ERROR;//分配存储空间失败
s.ch=NULL;
s.length=0;//串长为0
return OK;
}
status strassign(sstring &s,char *chars)
{//串赋值
int i=0,j;
if(s.ch) free(s.ch);
while(chars[i]!=‘\0‘)
{
i++;
}//求串的长度
s.ch=(char*)malloc(i*sizeof(char));
if(!s.ch) return ERROR;
for(j=0;j<i;j++)
{
s.ch[j]=chars[j];
}
s.length=i;
return OK;
}
status getlength(sstring s,int &len)
{//求串长
len=s.length;
return len;
}
status insert (sstring &s1,sstring s2,int pos)
{//在字符串s1的第pos个字符之前插入字符串s2,并显示
int j,k;
if(pos<1||pos>s1.length+1)
{//pos不合法
printf("the pos is a wrong value\n");
return ERROR;
}
s1.ch=(char*)realloc(s1.ch,(s1.length+s2.length)*sizeof(char));
if(!s1.ch)
return ERROR;//空间分配失败
for(j=s1.length-1,k=s1.length+s2.length-1;j>=pos-1;j--)
{//字符串后移
s1.ch[k]=s1.ch[j];
k--;
}
for(j=s2.length-1;j>=0;j--)
{
s1.ch[k]=s2.ch[j];
k--;
}
s1.length+=s2.length;
printf("the new string s1 is %s\n",s1.ch);
return OK;
}
status delstr(sstring &s,int pos,int j)
{//在串s中删除从第pos个字符起长度为j的字串(此处不显示删除的字串)
int i,k=pos,m=pos-1;
if(pos<1||pos+j-1>s.length)
{
printf("参数不合法\n");
return ERROR;
}
for(i=k+j-1;i<=s.length-1;i++)
{
s.ch[m]=s.ch[i];
m++;
}
s.ch[m]=‘\0‘;
printf("the new string s is %s\n",s.ch);
return OK;
}
int strcompare(sstring s,sstring s1)
{//比较串s和s1的大小,如果s>s1,则返回正数;如果s=s1,则返回0;如果s<s1,则返回复数
int i;
for(i=0;i<s.length&&i<s1.length;i++)
{
if(s.ch[i]!=s1.ch[i])
return s.ch[i]-s1.ch[i];
}
return s.length-s1.length;
}
status concat(sstring &t,sstring s,sstring s1)
{//由串t返回串s和s1联接而成的新串,并显示
int i,j;
t.ch=(char*)malloc((s.length+s1.length)*sizeof(char));
if(!t.ch) return ERROR;
for(i=0;i<s.length;i++)
{
t.ch[i]=s.ch[i];
}
for(i=s.length,j=0;j<s1.length;j++,i++)
{
t.ch[i]=s1.ch[j];
}
t.ch[i]=‘\0‘;
t.length=s.length+s1.length;
printf("the string t is %s\n",t.ch);
return OK;
}
status substr(sstring &sub,sstring s,int pos,int l)
{//求出串s第pos个字符起长为l的字串,并用sub返回
int i,j=0;
if(pos<1||pos>s.length||l<1||pos+l-1>s.length)
{
printf("参数不合法\n");
return ERROR;
}
sub.ch=(char*)malloc(l*sizeof(char));
if(!sub.ch) return ERROR;
for(i=pos;i<=pos+l-1;i++,j++)
sub.ch[j]=s.ch[i-1];
sub.length=l;
printf("the string sub is %s\n",sub.ch);
return OK;
}
void getnext(sstring t,int next[])
{//求串t的next函数,并存入数组next
int i=0,j=-1;
next[0]=-1;
while(i<t.length)
{
if(j==-1||t.ch[i]==t.ch[j])
{
++i;++j;next[i]=j;
}
else j=next[j];
}
}
int KMPindex(sstring s,sstring t)
{//KMP算法,其中s为主串,t为子串
int next[50],i=0,j=0,v;
getnext(t,next);
while(i<s.length&&j<t.length)
{
if(j==-1||s.ch[i]==t.ch[j])
{
i++;j++;
}
else j=next[j];
}
if(j>=t.length)
v=i-t.length;
else
v=-1;
return v;
}
void main()
{
sstring s1,s2,t,sub;
char str[50];
int pos,len,next[50],j,v,l;
initstring(s1);
printf("**************初始化完毕**************\n");
printf("*************字符串s1赋初值*************\n");
printf("please input the chars\n");
scanf("%s",str);
strassign(s1,str); //字符串赋初值
printf("*************输出字符串s1*************\n");
printf("the string s1 is %s\n",s1.ch);//输出字符串
printf("************字符串s1的长度为************\n");
len=getlength(s1,len);
printf("the length of the string s1 is %d\n",len);
printf("*************字符串s2赋初值*************\n");
initstring(s2);
printf("please input the chars\n");
scanf("%s",str);
strassign(s2,str);//字符串赋初值
printf("*************输出字符串s2*************\n");
printf("the string s2 is %s\n",s2.ch);//输出字符串
printf("*************字符串的插入**************\n");
printf("在字符串s1的第pos个位置之前插入字符串s2,pos=");scanf("%d",&pos);
printf("\n");
insert(s1,s2,pos);
printf("*************字符串的删除*************\n");
printf("删除字符串s2第pos个字符起长为j的字符串\n");
printf(" pos=");scanf("%d",&pos);printf(" j=");scanf("%d",&j);
delstr(s2,pos,j);//串删除
printf("***************串比较******************\n");
if(strcompare(s1,s2)>0) //串比较
printf("s1>s2\n");
else
if(strcompare(s1,s2)==0)
printf("s1=s2\n");
else
printf("s1<s2\n");
printf("***************串的合并******************\n");
printf("将串s1,s2合并于串t后\n");
initstring(t);
concat(t,s1,s2);
printf("***************取子串******************\n");
printf("取出字符串s1第pos个字符起长为l的子串\n");
printf(" pos=");scanf("%d",&pos);
printf(" l=");scanf("%d",&l);
substr(sub,s1,pos,l);
printf("***************求模式串的next******************\n");
printf("the next of the string is ");
getnext(s1,next);
for(j=0;j<s1.length;j++)
{
printf(" %d",next[j]);
}
printf("\n");
printf("***************串的模式匹配******************\n");
v=KMPindex(s1,s2);
if(v!=-1)
printf("从主串的第%d个字符起,匹配成功!\n",v+1);
else
printf("匹配失败!主串中没有与模式串匹配的子串\n");
}
标签:
原文地址:http://www.cnblogs.com/tangtang-123/p/4436950.html