数据结构 - 串(C语言实现)

一. 串的定义
 串是由零个或者多个字符组成的有限序列。串中任意连续的字符组成的子序列称为该串的字串,包含字串的串称为主串
 在C语言中,串可以使用如下语句定义:

char str[] = "Hello World!";

 上面的串里面一共有12个字符,但是编译器以 ‘\0’ 作为字符串结束标志,所以数组str的长度为13串str的长度为12

二. 串的存储结构

  1. 定长顺序表示
     串的定长顺序表示指的是采用一个固定长度的数组来存储串,但是并不像上面那样直接定义,而是额外定义一个变量存储所存储数组中串的长度。

    typedef struct
    {
    	char str[MaxSize +1];//MaxSize为串的最大长度,定义为+1是因为最后存储'\0'作为字符串结束标记
    	int Length;
    }str;
    
  2. 变长分配存储表示
     变长分配存储表示(又叫动态分配存储表示)是指定义一个指向存储区的首地址的指针,根据需要不断申请内存来存储串。

    typedef struct{
    	char *ch;	//指向动态分配存储区首地址的指针 
    	int length; //串的长度 
    }Str;
    

三. 串的基本操作

  1. 赋值操作

    int strassign(Str *S, char *ch){
    	//将串ch保存在S所指的空间
    	int len = 0,i=0;
    	char *c = ch;
    	
    	if(S->ch)
    		free(S->ch);		//释放原串空间 
    	while(*c){				//求串长度 
    		++len;
    		++c;
    	}
    	if(len == 0){			//若串长为零直接返回空串 
    		S->ch = NULL;
    		S->length = 0;
    		return OK;
    	}
    	else{
    		S->ch = (char *)malloc((len+1)*sizeof(char));//分配串长+'\0'的空间
    		if(S->ch == NULL)
    			return ERROR;	//内存分配失败 
    		else{
    			c = ch;			//重新指向首地址
    			for(i=0;i<len+1;++i){
    				S->ch[i] = *c;
    				++c;
    			} 				//将字符串赋值 
    			S->length = len;
    			return OK;
    		} 
    	}
    }
    
  2. 串比较操作

    int strcompare(Str s1, Str s2){
    	//比较s1、s2两个串,返回 1\2
    	int i=0;
    	while(i<s1.length && i<s2.length){
    		if(s1.ch[i] > s2.ch[i])
    			return 1;
    		else if(s1.ch[i] < s2.ch[i])
    			return 2;
    		++i;
    	} 
    	if(s1.length > s2.length)
    		return 1;
    	else	if(s1.length < s2.length)
    		return 2;
    	else 
    		return 0;	
    }
    
  3. 串连接操作

    int strconcat(Str *s, Str s1, Str s2){
    	//将s1 s2 两个串连接并存储在s里面
    	int i=0,j=0;
    	if(s->ch)
    	{//释放原串空间 
    		free(s->ch); 
    		s->ch = NULL;		
    	}
    	s->ch = (char *)malloc((s1.length+s2.length+1)*sizeof(char)); 
    	if(s->ch == NULL)
    		return ERROR;
    	while(i<s1.length){
    		s->ch[i] = s1.ch[i];
    		++i;
    	}
    	while(j<s2.length+1){		//此处+1将'\0'也赋值过来 
    		s->ch[i+j] = s2.ch[j];
    		++j;
    	}
    	s->length = s1.length + s2.length;
    	return OK; 
    }
    
  4. 演示代码及结果

    int main(int argc, char *argv[]) {
    	Str s1 = {NULL,0},s2 = {NULL,0},s = {NULL,0};
    	//这里必须两个都要初始化 
    	strassign(&s1,"Hello ");
    	printf("字符串1为:"); 
    	printf(s1.ch);
    	printf("\t长:%d \n",s1.length);
    
    	strassign(&s2,"World!");
    	printf("字符串2为:");
    	printf(s2.ch);
    	printf("\t长:%d \n",s2.length);
    	
    	printf("两个字符串比较结果:%d\n",strcompare(s1, s2));
    		
    	
    	strconcat(&s, s1, s2);
    	printf("两个字符串粘贴后为:"); 
    	printf(s.ch);
    	printf("\t长:%d \n",s.length);	
    	return 0;
    }
    

    程序结果
    结果正确!
    ——————————————————————————————————
     这次遇到一个问题,在主函数中如果定义结构体三个s不初始化,只有第一个可以使用,后续的无效,所以必须将三个都初始化。
     结构体初始化,都初始化就都有内存空间地址都可以都引用,默认初始化,第一个系统默认给个内存空间,第二个系统还会给吗

猜你喜欢

转载自blog.csdn.net/qq_40344307/article/details/89416122
今日推荐