資料結構中的串
阿新 • • 發佈:2018-12-08
C語言中有個字串,資料結構中有個串,聯絡是二者都是儲存字元的,區別在於前者我們直接定義陣列儲存,以\0結尾,如
char str[size];
而後者我們是把字串看成一個線性表,定義成結構體形式,可以用連結串列,也可以是順序表(結尾用length控制),以下是定義:如
//堆分配儲存表示,即順序表,最常用
typedef struct Str
{
char elem[SIZE];//elem陣列用來存放串的元素
int length;//定義一個串長度
}Str;
//塊鏈儲存
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct{
Chunk *head,*tail; //串的頭尾指標
int curlen; //串的當前長度
}LString;
1.串的定義:串是由零個或多個組成的有序佇列。
2.串的長度:串中字元的數目稱為串的長度。
3.空串:由零個字元組成的串叫做空串,空串不包括任何字元,其長度為零。
4.子串:串中任意個連續的字元組成的子序列稱為該串的子串,空串是任何串的子串。
5.主串:包含子串的串相應的稱為主串。
串的表示:
串有兩種表示形式:順序儲存表示和鏈式儲存表示。
順序儲存表示:串的順序儲存結構簡稱為順序串,順序串中的字元序列被順序地存放在一組連續的儲存單元中,主要有三種實現順序串的方式。
串的初始化(以下基於順序表):
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define SIZE 20
typedef struct Str
{
char elem[SIZE];//elem陣列用來存放串的元素
int length;//定義一個串長度
}Str;
//為串分配空間、賦值
int StrAssign(HString &T,char *chars){
int i;
// if(T.ch)free(T.ch); //釋放T原有空間 【1】
char * c=chars;
for(i=0;*c!='\0';++i,++c); //求chars的長度i
if(!i){
T.ch=NULL;
T.length=0;
}else{
if(!(T.ch=(char*)malloc(i*sizeof(char))))return 0; //分配空間的同時判斷是否成功分配
for(int j=0;j<i;j++)
T.ch[j]=chars[j];
T.length=i;
}
return 1;
}
串的操作:
void StrAssign(Str *s, const char *chars);//初始化串
void StrCpy(Str*s, Str*t);//拷貝串
int Getlength(Str *s);//獲取串的長度
void Clear(Str *s);//清空串s
bool Inset(Str *s,int pos,Str *t);//在串s的pos位置插入串t
void Show(Str *s) ;//列印串
int BF(Str *s,Str *sub,int pos);//在串s裡找第一個串sub,並返回串sub的第一個元素的下標
bool DeletePos(Str* s,int pos,int len);//在串中的pos位置開始刪除len長度個元素
bool Delete(Str *s,int pos,Str *t);//在串中的pos位置開始刪除串t
bool Replace(Str *s,Str *t,Str *v,int pos);//用v替換從pos位置開始的第一個t
bool RepIaceAll(Str *s,Str *t,Str *v);//在串s中查詢到串t並用串v替換
void StrAssign(Str *s, const char *chars)//初始化串
{
assert(s != NULL);
int len = strlen(chars);
/*if(s->length<len)
{
return;
}*/
s->length = len;
for(int i = 0;i<len;i++)
{
s->elem[i] = chars[i];
}
}
void StrCpy(Str*s, Str*t)//拷貝串
{
for(int i = 0;i<t->length;i++)
{
s->elem[i] = t->elem[i];
}
s->length = t->length;
}
int Getlength(Str *s)//獲取串的長度
{
return s->length ;
}
void Clear(Str *s)//清空串s
{
s->length = 0;
}
bool SubStr(Str *sub,Str *s,int pos,int len)//空白字元不拷貝
{
if(pos < 0 || len < 1||pos >=s->length||pos+len>s->length-1)
{
return false;
}
for(int i = pos;i<pos+len;i++)
{
sub->elem[i-pos] = s->elem[i];
}
sub->length = len;
return true;
}
bool Inset(Str *s,int pos,Str *t)//在串s的pos位置插入串t
{
assert(s!=NULL);
assert(t!=NULL);
if(pos<0||pos>s->length||pos+t->length>SIZE)
{
return false;
}
for(int i = s->length-1;i>=pos;i--)
{
s->elem[i+t->length] = s->elem[i];
}
for(int j = 0;j<t->length;j++)
{
s->elem[j+pos] = t->elem[j];
}
s->length +=t->length;
return true;
}
int BF(Str *s,Str *sub,int pos)//在串s裡找第一個串sub,並返回串sub的第一個元素的下標
{
if(pos<0||pos>s->length)
{
return -1;
}
int i = pos;
int j = 0;
int lens = s->length;
int lensub = sub->length;
while (i < lens && j < lensub)
{
if (s->elem[i] == sub->elem[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j >= lensub)
{
return i - j;
}
else
return -1;
}
bool DeletePos(Str* s,int pos,int len)//從pos位置開始刪除len個長度
{
assert(s!=NULL);
if(pos<0||pos+len>s->length||len<0)
{
return false;
}
//for(int i = pos;i<len+pos;i++)
for(int i = pos;i<s->length-len;i++)
{
s->elem[i] = s->elem[i+len];
}
s->length -= len;
return true;
}
bool Delete(Str *s,int pos,Str *t)//在串中的pos位置開始刪除串t
{
assert(s!=NULL);
assert(t!=NULL);
if(pos<0||pos>s->length||t->length>s->length)
{
return false;
}
int index = BF(s,t,pos);
if(index < 0)
{
return false;
}
return DeletePos(s,index,t->length);
}
bool Replace(Str *s,Str *t,Str *v,int pos)//用v替換從pos位置開始的第一個t
{
assert(s!=NULL);
assert(t!=NULL);
assert(v!=NULL);
int index = BF(s,t,pos);
if(index < 0)
{
return false;
}
DeletePos(s,index,t->length);
return Inset(s,index,v);
}
bool RepIaceAll(Str *s,Str *t,Str *v)//在串s中查詢到串t並用串v替換
{
assert(s!=NULL);
assert(t!=NULL);
assert(v!=NULL);
while(Replace(s,t,v,0));
return true;
}
void Show(Str *s) //列印
{
for(int i=0;i<Getlength(s);i++)
{
printf("%c",s->elem[i]);
}
printf("\n");
}
int main()
{
Str s;
char *s1 = "abcdecdfcd";
StrAssign(&s, s1);
Show(&s);
Str t;
char *t1 = "cd";
StrAssign(&t, t1);
Show(&t);
/*
Inset(&s, 2, &t);
Show(&s);
Inset(&s, 7, &t);
Show(&s);*/
/*int index = BF(&s,&t,0);
printf("index = %d\n",index);*/
/*DeletePos(&s,3,2);
Show(&s);*/
/*Str v;
char *v1 = "zkr";
StrAssign(&v, v1);
Show(&v);
Replace(&s,&t,&v,0);
Show(&s);*/
Str v;
char *v1 = "zkr";
StrAssign(&v, v1);
Show(&v);
RepIaceAll(&s,&t,&v);
Show(&s);
system("pause");
return 0;
}