資料結構(C實現) 串

2021-06-25 21:21:32 字數 4123 閱讀 3952

字串(簡稱串),可以將其看作是種特殊的線性表,其特殊性在於線性表的資料元素的型別總是字元性,字串的資料物件約束為字符集。

串是由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演算法那,簡直是天書,我最後還是看別人的部落格才勉強參透,但無論如何,大話資料結構的...