数据结构---串

      串的基本运算



下面是我的代码实现:

#include <iostream>
#include <cstdio>

static const int Maxlen = 100;

using namespace std;

typedef struct{
	char ch[Maxlen];
	int len;
}String;

class S
{
	public:
		S(){                                          //构造函数初始化
			S1.len = 0;
		}
		int Strassign ();                             //输入字符串
		void Dispstr();                                //输出字符串
		void Assign(char s[]);                               //赋值
		void Length();                                       //取长
		void Concat(char s1[], int choose_head_or_end);      //连接
		void Substring(int l1, int l2);
		int Replace(char z[], int length);
		int Strinsert(char str[],  int pos);           //插入子串
		int Strdelete(int pos, int len);               //删除子串
	private:
		String S1;
};

int S :: Strassign()                                //输入字符串实现
{
	if(S1.len != 0){
		cout << "早已初始化,请选择 3.赋值 操作修改字符串。" << endl;
	    return 0;
	}
	scanf ("%s", &S1);
	for(int i = 0; S1.ch[i] != '\0'; i++)
		;
	S1.len = i;
}

void S :: Dispstr()                                     //输出字符串实现
{
	for(int i = 0; S1.ch[i] != '\0'; i++)
		printf("%c",S1.ch[i]);
	printf("\n");
}

void S :: Assign(char s[])
{
	for(int i = 0; S1.ch[i] != '\0'; i++)
		S1.ch[i] = '\0';                            //首先将需被赋值字符串清空
	for(i = 0; s[i] != '\0'; i++)
		S1.ch[i] = s[i];                              //赋值
	S1.ch[i+1] = '\0';
	for(i = 0; S1.ch[i] != '\0'; i++)               //重新获得字符串长度
		;
	S1.len = i;
}

void S :: Length()
{
	cout << "当前字符串长度为" << S1.len << endl;
}

void S :: Concat (char s1[], int choose_head_or_end)
{
	int *pi = new int;                          // 衡量输入字符串的长度
	for(int i = 0; s1[i] != '\0'; i++)          // 获取输入字符串长
		;
	*pi = i;
	if(choose_head_or_end == 1){                 //连入现有字符串前面
		for(i = S1.len-1; i >= 0; i--)           //先将现有字符串集体后移,移动长度为输入字符串长度
			S1.ch[i + *pi] = S1.ch[i];
		S1.ch[S1.len  + *pi] = '\0';
		for(i = 0; i < *pi; i++)                //把输入字符串的值赋到空出的现有字符串前
			S1.ch[i] = s1[i];
		S1.len += *pi;                           //将表示长度的变量加上输入字符串的长度
	}
	else if(choose_head_or_end == 2){             //连入现有字符串后面
		for(i = 0; i < *pi; i++)               
		{
			S1.ch[S1.len] = s1[i];
		    S1.len ++;                           //在这一过程中自然改变长度值
		}
		S1.ch[S1.len] = '\0';
	}
	else
	{ cout << "输入错误"  << endl; }

	delete pi;
}

void S :: Substring (int l1, int l2)
{
	for(int i = l1 - 1; i < l1 - 1 + l2; i++ )
	{
		cout << S1.ch[i];
	}
	printf("\n");
}

int S :: Replace (char z[], int length)                     //子串替换
{
	for(int i = 0; z[i] != '\0'; i ++)                       //取子串长
		;
	if(i + length > S1.len)
	{
		cout << "越界" << endl;
		return 0;
	}
	for(i = 0; z[i] != '\0'; i ++)
	{
		S1.ch[i+length-1] = z[i];
	}
	return 1;
}

int  S :: Strinsert(char str[],  int pos)
{
	if(pos > S1.len){
		cout << "输入越界"  << endl;
		return 0;
	}

	int length;
	for(int i = 0; str[i] != '\0'; i ++)                       //取子串长
		;
	length = i;

	for (i = S1.len; i > pos-1; i -- )
		S1.ch[i + length -1] = S1.ch[i-1];                        //元素后移,为要插入元素腾出空余。
	S1.ch[S1.len + length ] = '\0';

	for (i = 0; i < length; i++)                              //赋值
	{
		S1.ch[pos + i -1] = str[i];
	}

    S1.len += length; 

	return 1;
}

int S :: Strdelete(int pos, int len)
{
	for (int i = pos - 1; i < pos - 1 + len; i ++)                    //先删除要删除的子串
		S1.ch[i] = '\0';

	for(i = pos - 1 + len; i <= S1.len - 1; i++)                      //删除的子串后面元素前移
		S1.ch[i - len] = S1.ch[i];

	S1.len -= len;                                                    //长度减删除子串长

    S1.ch[S1.len] = '\0';                                             //剃掉多余的

	return 1;
}

void main()
{
	S MyString;
	int If_End = 0;
	int Choose;
	while (If_End == 0){
		cout << "请选择操作: 1.输入字符串。2.输出字符串。 3.赋值。4.取长。 5.连接。" ;
		cout << "6.返回字符串子串。 7.子串的替换。8.子串插入。 9.删除子串。 10.结束。" << endl;
		cin >> Choose;
		switch (Choose){
			case 1:
				cout << "请输入:(输入字符串长度应不超过100)" ;
				MyString.Strassign();
				break;
			case 2:
				MyString.Dispstr();
			    break;
			case 3:
				{
					char *pq = new char [Maxlen];
				    cout << "请输入要赋的值"  << endl;
				    scanf ("%s",&*pq);
				    MyString.Assign(pq);
				    delete [] pq;
				    break;
				}
			case 4:
				MyString.Length();
				break;
			case 5:
				{
					int *py = new int;
					char *pu = new char [Maxlen];
					cout << "首先输入字符串" ;
					scanf("%s",&*pu);
					cout << "你是想把输入的字符串接到现有字符串前(输入一),还是现有字符串后(输入二)";
					cin >> *py;
					MyString.Concat(pu,*py);
					delete py;
					delete pu;
					break;
				}
			case 6:
				{
					int *pa = new int;
				    int *ps = new int;
				    cout << "请先输入从第几个元素开始" << endl;
				    cin >> *pa;
				    cout << "请输入子串长度"  << endl;
				    cin >> *ps;
				    MyString.Substring(*pa,*ps);
				    delete pa;
				    delete ps;
				    break;
				}
			case 7:
				{
					cout << "请先输入要替换的子串" << endl; 
					char *pd = new char [Maxlen];
					scanf("%s",&*pd);
					int *pf = new int;
					cout << "输入要替换的开始位置" << endl;
					cin >> *pf;
					MyString.Replace(pd,*pf);
					delete pd;
					delete pf;
					break;
				}
			case 8:
				{
					char *pv = new char [Maxlen];
				    int *pb = new int;
				    cout << "输入要插入的子串" << endl;
				    scanf ("%s",&*pv);
				    cout << "输入在第几个元素前插入(整型变量)" << endl;
				    cin >> *pb;
				    MyString.Strinsert(pv,  *pb);
					delete pv;
					delete pb;
				    break;
				}
			case 9:
				{
					int *delete_str = new int;
					int *delete_len = new int;
					cout << "请先输入删除子串位置" << endl;
					cin >> *delete_str ;
					cout << "请输入删除子串长度" << endl;
					cin >> *delete_len;
                    MyString.Strdelete(*delete_str,*delete_len);
					delete delete_str;
					delete delete_len;
					break;
				}
			case 10:
                 If_End = 1;
				break;
			default:
				cout << "输入有误" << endl;
				break;
		}
	}
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值