数据结构------串

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
//串的顺序存储

typedef struct st{
	char *ch;       //串存放的起始地址,串中第i个字符存储在ch[i-1]中
	int length;     //串的长度
	int strsize;    //分配的存储空间的大小,如果不足,在通过realloc()分配增加空间
}string;

//串的初始化操作
string CreateNullString(){
	string s;
	s.length = 0;
	s.ch = (char*)malloc(MAXSIZE *sizeof(char));
	s.strsize = MAXSIZE;
	return s;
}

//判断空串
int isEmpty(string s){
	if (s.length == 0)
		return 1;
	else
		return 0;
}

//赋值操作
void StringAssign(string *s1, char s2[]){
	int i = 0;
	while (s2[i] != '\0')  // '\0' 是字符串的结束符,任何字符串之后都会自动加上'\0'
		i++;            //计算s2的长度
	if (i>s1->strsize){
		//所赋值的字符数组超过字符串的默认容量,则增加存储空间
		s1->ch = (char*)malloc(i*sizeof(char));
		s1->strsize = i;
	}
	s1->length = i;
	for (i = 0; i<s1->length; i++)
		s1->ch[i] = s2[i]; //从第一个字符开始逐个字符赋值
}

//串拷贝操作
void StringCopy(string *s1, string s2){
	if (s1->strsize<s2.length){
		//realloc则对malloc申请的内存进行大小的调整.
		s1->ch = (char*)realloc(s1->ch, s2.length*sizeof(char));
		s1->strsize = s2.length;
	}
	s1->length = s2.length;
	int i;
	for (i = 0; i<s1->length; i++)
		s1->ch[i] = s2.ch[i];
}

//求串的长度
int StringLength(string s){
	return s.length;
}

//串的连接操作
void concat(string *s, string s1, string s2){
	if (s->strsize<s1.length + s2.length){
		s->ch = (char*)realloc(s->ch, (s1.length + s2.length)*sizeof(char));
		s->strsize = s1.length + s2.length;
	}
	s->length = s1.length + s2.length;       //两串连接
	int i;
	for (i = 0; i<s1.length; i++)         //将s1复制到s中
		s->ch[i] = s1.ch[i];
	for (; i<s->length; i++)
		s->ch[i] = s2.ch[i - s1.length]; //将s2复制到s中去
}

//取子串操作
int substr(string s, int i, int len, string *t){
	/*
	i表示从字符串s的第i个位置开始截取(索引从1开始)
	len表示截取字符串的长度
	*/
	if (i <= 0 || i>s.length || len<0 || len>s.length - i + 1)    //参数不合法
		return 0;
	if (t->length<len){ //存储空间不够,继续分配存储空间
		t->ch = (char*)realloc(t->ch, len*sizeof(char));
		t->strsize = len;
	}
	t->length = len;
	int k;
	for (k = 0; k<t->length; k++)
		t->ch[k] = s.ch[i - 1 + k];
	return 1;
}

//插入操作
int insertString(string *s, int i, string t){
	//在字符串s的第i个位置插入字符串t
	if (i <= 0 || i>s->length + 1)
		return 0;
	if (s->strsize<s->length + t.length){  //空间不足
		s->ch = (char*)realloc(s->ch, (s->length + t.length)*sizeof(char));
		s->strsize = s->length + t.length;
	}
	int k;
	for (k = s->length - 1; k >= i - 1; k--) //将s中的后i个字符后移到后面
		s->ch[k + t.length] = s->ch[k];//end[][][] ==> e[][][]nd
	s->length = s->length + t.length;//s->length=3+3
	for (k = 0; k<t.length; k++)              //将t的值赋值给s
		s->ch[k + i - 1] = t.ch[k];//e[][][]nd==>eaaand
	return 1;
}

//删除操作
int deleteString(string *s, int i, int len){
	//从s的第i个字符开始删除len个字符
	if (i <= 0 || i>s->length || len<0 || len>s->length - i + 1)    //参数不合法
		return 0;
	int k;
	for (k = i + len - 1; k<s->length; k++)    //从s的i+len-1个位置开始将其后的所有字符前移
		s->ch[k - len] = s->ch[k];
	s->length -= len;
	return 1;
}

//输出操作
void print(string s){
	int i;
	for (i = 0; i<s.length; i++)
		printf("%c", s.ch[i]);
	printf("\n");
}

int main(){
	string s1 = CreateNullString();
	string s2 = CreateNullString();
	string s3 = CreateNullString();
	char ch[MAXSIZE];
	printf("请输入主串:\n");
	//输入friend
	gets(ch);
	//赋值操作
	StringAssign(&s1, ch);
	printf("主串 s1 为:");
	print(s1);
	//将字符s1拷贝到s2
	StringCopy(&s2, s1);
	printf("拷贝串操作结果如下,结果如下 s2 :");
	print(s2);
	printf("删除操作(1——s1.length-3 全删):");
	//删除操作
	deleteString(&s2, 1, s1.length - 3);
	print(s2);
	printf("插入操作,插入到s2的第2个位置上,请输入插入的字符串:");
	gets(ch);
	//赋值操作 把输入的字符放到s3中
	StringAssign(&s3, ch);
	//进行插入操作,将s3插入到s2的第二个位置上
	insertString(&s2, 2, s3);
	print(s2);
	printf("取子串操作(取s1的子串【2-4】):");
	//提取friend 中[2-4]位置元素-rie
	substr(s1, 2, 3, &s3);
	print(s3);
	//s1==>friend s3==>rie
	printf("串连接操作【将s1与s3合并】:");
	concat(&s1, s1, s2);
	print(s1);
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值