数据结构学习笔记-串(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 
#include 
//串的链式存储
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&&inext;
        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;
}


你可能感兴趣的:(数据结构)