字串(簡稱串),可以將其看作是種特殊的線性表,其特殊性在於線性表的資料元素的型別總是字元性,字串的資料物件約束為字符集。
串是由0個或多個字元組成的有限序列。一般記作:s = "s1 s2 s3 .... sn",,其中,s是串名,用雙引號括起來的字串行稱為串的值,si(1<=i <= n)稱為串的元素,可以是字母,數字或其他字元,是構成串的基本單位,字元的個數n稱為串的長度.
1. 空串: 由0個字元組成的串稱為空串,空串不包含任何字元,其長度為0。
2. 子串: 串中任意個連續的字元組成的子串行稱為該串的子串,空串是任何串的子串。
3. 主串: 包含子串的串相應的稱為主串。
4. 子串在主串的位置:通常稱字元在序列中的序號為該字元在串的位置,子串在主串中的位置則以子串的第乙個字元在主串中的位置來表示。
5. 兩串相等:當且僅當兩個串的長度相等,並且各個對應位置的字元都相等時才相等。
1. 串的順序儲存表示:
串的順序儲存結構簡稱為順序串,順序串中的字串行被順序地存放在一組連續的儲存單元中,主要有三種實現順序串的方式,分別如下:
(1) 定長字元陣列
在串的順序儲存結構中,按照預定義的大小,為每個定義的串變數分配乙個固定大小的儲存區,描述如下:
//定長字元陣列描述
#define maxsize 100
typedef char sstring[maxsize];
(2) 帶串長的字元陣列
//帶串長的字元陣列
#define maxsize 100
typedef structsqstring;
(3) 串的堆分配(即動態陣列)儲存描述
//串的堆分配儲存描述
typedef structhstring;
2.串的鏈式儲存表示:
和線性表的鏈式儲存結構相類似,也可以採用鍊錶方法儲存串值,有以下兩個方法:
(1)串的鏈式結構型別描述:
//串的鏈式儲存結構描述
typedef struct nodecnode,*linkstring;
(2)串的塊鏈儲存型別描述:
//串的塊鏈結構型別描述
#define nodesize 3
typedef struct nodesnode,*linkstr;
linkstr head;
3.串的索引儲存表示:
串也可以用索引的方式來表示,有以下兩種方法:
(1)串的帶長度的索引表:
//帶長度的索引表
#define maxsize 100
typedef structlsnode;
(2) 串的帶末指標的索引表:
//串的帶末指標的索引表
#define maxsize 100
typedef structenode;
以上介紹了三種儲存結構來表示串,每一種儲存結構又可以用幾種不同的方式來描述串,那麼,串的實現方法相應的也有多種,但不管有多少種,串的基本操作原理不變,變的只是處理的方式,所以也沒有必要將所有方式都學會,只要會一種即可,這裡就實現其中最常用動態陣列來描述串,並以此種方式來實現口串的各種操作。
這裡所有的基本操作都是建立在上述的用動態陣列,即堆結構來描述串的前提下的,直接給出**,裡面有注釋。
//串的堆分配儲存描述
typedef structhstring;
//初始化乙個空的順序串
void str_init(hstring *s)
//清空順序串
void str_clear(hstring *s)
}//判斷順序串是否為空
int str_isempty(hstring *s)
//求取串的長度
int str_getlength(hstring *s)
//順序串的賦值
void str_assign(hstring *s,char *chars)
//如果賦值串的長度大於0,則進行賦值
if(i > 0)
s->length = i; }}
//順序串的複製,將t複製到s
void str_copy(hstring *s,hstring *t)
}//順序串的連線,將t連線到s後
void str_concat(hstring *s,hstring *t)
//順序串的比較,如果s>t,返回大於0的值,小於,則返回小於0的值
int str_compare(hstring *s,hstring *t)
//求子串並用sub返回
void str_getsub(hstring *s,int pos,int len,hstring *sub)
else }}
//在順序串中找出給定子串給定位置後出現的第乙個的位置
int str_getsubindex(hstring *s,hstring *sub,int pos)
if(str_isempty(s))
if(str_isempty(sub))
for(i = pos - 1; i < s->length - sub->length + 1;i++)
//如果找不對,則返回-1;
return -1;
}//順序串中插入子串
void str_insert(hstring *s,int pos,hstring *t)
if(str_isempty(t))
str_init(&temp);
temp.length = s->length + t->length;
printf("%d\n",temp.length);
temp.ch = (char *)malloc(sizeof(char)*temp.length);
for(i = 0 ;i < pos ;i++)
temp.ch[i] = s->ch[i];
for(; i < pos + t->length;i++)
temp.ch[i] = t->ch[i - pos];
for(;i < temp.length;i++)
temp.ch[i] = s->ch[i - t->length];
//將串s 清空,並將串temp賦值給s
str_clear(s);
s->ch = temp.ch;
s->length = temp.length; }
//在順序串刪除子串
void str_deletesub(hstring *s,int pos,int len)
if(str_isempty(s))
str_init(&temp);
temp.length = s->length - len;
temp.ch = (char *)malloc(sizeof(char)*temp.length);
for(i = 0 ;i < pos - 1; i++)
temp.ch[i] = s->ch[i];
for(;i < temp.length;i++)
temp.ch[i] = s->ch[i+len];
//將串s清空,並將串temp賦值給s
str_clear(s);
s->ch = temp.ch;
s->length = temp.length; }
//列印順序串
void str_print(hstring *s)
else
printf("%s\n",s->ch);
}
資料結構 C語言實現串
include stdlib.h include stdio.h define true 1 define false 0 define maxlen 255 typedef int status typedef structstring 串的賦值 void strassign string s,c...
資料結構 串(C語言實現)
一.串的定義 串是由零個或者多個字元組成的有限序列。串中任意連續的字元組成的子串行稱為該串的字串,包含字串的串稱為主串。在c語言中,串可以使用如下語句定義 char str hello world 上面的串裡面一共有12個字元,但是編譯器以 0 作為字串結束標誌,所以陣列str的長度為13,串str...
資料結構 C 實現
之前的2周一直在學資料結構,頭都大了。我是之前對資料結構一點認識都沒有,我是直接看書懟的,我看的是 大話資料結構 前面的講解還不錯,到了樹 圖後,就有點看不懂了,因為直接講的 我想一般人類都不可能看得懂,尤其是kmp演算法那,簡直是天書,我最後還是看別人的部落格才勉強參透,但無論如何,大話資料結構的...