資料結構學習筆記-串(C語言實現)
阿新 • • 發佈:2019-01-04
串由零個或多個字元組成,說白了就是字串。串的儲存方式相對於線性表來講有些不同,他分為以下幾種:順序儲存、堆分配儲存、鏈式儲存。順序儲存通常在陣列中的頭元素存放字串長度。堆分配儲存通常會動態分配空間。鏈式儲存分為兩種,一種是每個節點存放一個字元(比較浪費空間),另一種則是每個節點存放多個字元,如果字元不是剛好,就用#代替。(c中字串定義會有以下幾種形式:字串常量"hello",char陣列char m[40] = "hello,world",char指標char *m = "hello,world"。字串碰到‘\0’結束,定義的字串末尾都會被系統新增‘\0’)這幾種串的儲存實現原理都一樣,只是方式有些異同。以下是串的基本操作:
- 基本操作:
- init(t , chars)
- 初始條件: chars是一個字串常量。
- 操作結果:生成一個值為chars的串t。
- connection(s, t)
- 初始條件:串s, t 已存在。
-  操作結果:將串t聯結到串s後形成新串存放到s中。
- getLength(t)
- 初始條件:字串t已存在。
- 操作結果:返回串t中的元素個數,稱為串長。
- SubString (s, pos, len, sub)
- 初始條件:串s, 已存在, 1≦pos≦StrLength(s)且 0≦len≦StrLength(s) –pos+1。
- 操作結果:用sub返回串s的第pos個字元起長度為len 的子串。
下面是串的鏈式儲存程式碼實現:
#include <stdio.h> #include <stdlib.h> //串的鏈式儲存 typedef struct charNode{ char data; struct charNode *next; }charNode; typedef charNode *charLink; //c中字串會有以下幾種形式:字串常量"hello",char陣列char m[40] = "hello,world",char指標char *m = "hello,world" void init(charLink *c,char s[]){ charLink p,q; (*c)=(charLink)malloc(sizeof(charNode));//建立鏈式串 q=*c;//定義指標指向串 for(int i=0;s[i]!='\0';i++){//c裡面所有定義的字串後面都會有一個‘\0’,他代表結束 p=(charLink)malloc(sizeof(charNode)); p->data=s[i];//這裡類似連結串列的尾插法 q->next=p; q=p; } q->next=NULL; } //獲取串長度 int getLength(charLink c){ int i=0; charLink p; p=c; while(p->next){ p=p->next; i++; } return i; } //將兩個串拼成一個串 void connection(charLink *c,charLink b){ charLink p=(*c)->next;//定義一個指標指向c的第一個字元。 charLink p2=b;//定義一個指標指向b charLink p3;//用來儲存在b中取出的字元節點 char s;//用來存放從b中取出的字元資料 while(p2->next){//從b的第一個字元節點開始取 p2=p2->next; s=p2->data; while(p->next){//從c的第一個字元節點的next開始判斷,如果不為空,就向下指,直到p成為c的最後一個字元節點 p=p->next; } p3=(charLink)malloc(sizeof(charNode)); p3->data=s; p->next=p3;//類似連結串列的尾插法,讓後插入的資料都往後排 p=p3; } p->next=NULL; } void substring(charLink c,int index,int slength,charLink *s){ //當index+slength<=(*s).length+1時才能取 charLink p,z; *s=(charLink)malloc(sizeof(charNode)); z=*s; p=c->next; int i=1,j=1; //拿到主串的要取資料的第一個位置 while(p->next&&i<index){ p=p->next; i++; } //取值賦值 while(p&&j<=slength){ charLink n=(charLink)malloc(sizeof(charNode)); n->data=p->data; z->next=n; z=n; p=p->next; j++; } z->next=NULL; } void display(charLink c){ charLink p=c->next; while(p){ char q=p->data; printf("%c ",q); p=p->next; } printf("\n"); } int main() { charLink c,b,z; char c1[20]="hello hello"; char c2[20]=" world world"; char c3[10]=""; init(&z,c3); init(&c,c1); display(c); init(&b,c2); display(b); connection(&c,b); display(c); printf("串的長度為:\n%d\n",getLength(c)); substring(c,1,5,&z); display(z); return 0; }