1. 程式人生 > >資料結構學習筆記-串(C語言實現)

資料結構學習筆記-串(C語言實現)

串由零個或多個字元組成,說白了就是字串。串的儲存方式相對於線性表來講有些不同,他分為以下幾種:順序儲存、堆分配儲存、鏈式儲存。順序儲存通常在陣列中的頭元素存放字串長度。堆分配儲存通常會動態分配空間。鏈式儲存分為兩種,一種是每個節點存放一個字元(比較浪費空間),另一種則是每個節點存放多個字元,如果字元不是剛好,就用#代替(c中字串定義會有以下幾種形式:字串常量"hello",char陣列char m[40] = "hello,world",char指標char *m = "hello,world"。字串碰到‘\0’結束,定義的字串末尾都會被系統新增‘\0’)這幾種串的儲存實現原理都一樣,只是方式有些異同。以下是串的基本操作:

  1.  基本操作:  
  2.         init(t , chars)  
  3.               初始條件: chars是一個字串常量。  
  4.               操作結果:生成一個值為chars的串t。  
  5.         connection(s, t)  
  6.               初始條件:串s, t 已存在。  
  7.               操作結果:將串t聯結到串s後形成新串存放到s中。   
  8.         getLength(t)  
  9.               初始條件:字串t已存在。   
  10.               操作結果:返回串t中的元素個數,稱為串長。   
  11.         SubString (s, pos, len, sub)  
  12.               初始條件:串s, 已存在, 1≦pos≦StrLength(s)且 0≦len≦StrLength(s) –pos+1。  
  13.               操作結果:用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;
}