串 堆分配存储 数据结构 C语言 严蔚敏

这篇博客详细介绍了如何使用C语言实现基于堆分配存储的数据结构,包括头文件的引用,关键函数的定义和主函数的应用,最终展示运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件

typedef struct{
	char *ch;
	int length;
}HString;
#define MAXSTRLEN  255
#define OK 1
#include<stdlib.h>
#include<string>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -2
#include<iostream>
using namespace std;

typedef int Status;

	Status StrAssign(HString &T,char *chars);
	Status SubString(HString &Sub,HString S,int pos,int len);
	Status Concat(HString &T,HString S1,HString S2);
	Status StrPrint(HString S);
	void InitalStr(HString &T);

 

函数

#include "com.h"
//初始化一个串
void InitalStr(HString &T){
	T.ch = NULL;
	T.length = 0;
}
Status Concat(HString &T,HString S1,HString S2){
  int i;
	if(T.ch)
		free(T.ch);
	if(!(T.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))    
		exit(OVERFLOW);
	for(i=0;i<S1.length;i++)
		T.ch[i]=S1.ch[i];  //不存在截断,于是直接将S1赋给T

		T.length=S1.length+S2.length;        //T的长度为S1和S2相加
		for(i=0;i<S2.length;i++)      //将S2赋给T
		T.ch[S1.length+i]=S2.ch[i];    
		return OK;
}

//返回串S的第pos个字符起长度为len的子串
Status SubString(HString &Sub,HString S,int pos,int len){

	int i;
	if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
		return ERROR;
	if(Sub.ch)   free(Sub.ch);
	if(!len)            //长度为0,就全部置为0
	{
		Sub.ch=NULL;
      Sub.length=0;
	}
	else{
		Sub.ch=(char *)malloc(len*sizeof(char));   //分配空间
     if(!Sub.ch) exit(OVERFLOW);
	 for(i=0;i<len;i++)    
		 Sub.ch[i]=S.ch[pos-1+i];        //将串S的第pos个字符起长度为len的子串赋给Sub
         Sub.length= len;    //设置Sub的长度
	}   
	 return OK;
	}


	Status StrAssign(HString &T,char *chars){
		int i;
		char *c;
		if(T.ch) free(T.ch);
		for(i=0,c=chars; *c ;++i,++c);   //求chars长度i
		if(!i){
        T.ch = NULL;        //串常量chars长度为0时串为空串长度0存储区间指向NULL
          T.length = 0;
      }
		else{
			if(!(T.ch=(char*)malloc(i*sizeof(char))))
              exit(OVERFLOW);
        for(int j = 0; j < i; j++)
             T.ch[j] = chars[j];          //写入chars串
            T.length = i;
     }
     return OK;
  }


	//输出函数 
Status StrPrint(HString S)
{
	int i;
	for (i = 0; i < S.length; i++)
	{
		cout << S.ch[i];
	}
	cout << endl;
	return 0;
}

主函数

#include "com.h"

int main(){
	int ch;
	int q=1,len,pos;
	char a[MAXSTRLEN],b[MAXSTRLEN];
	HString S1,S2,T,Sub;
   	InitalStr(T);
	InitalStr(S1);
	InitalStr(S2);
	InitalStr(Sub);
cout << "请输入主串S1" << endl;    
	cin >> a ;
	StrAssign(S1, a);


  cout<<endl;
	while(q){
  cout<<endl;
		cout<<"*********************"<<endl;
	cout<<"1.连接串S1和S2"<<endl<<endl;
	cout<<"2.返回串S1第pos个字符起长度为len的子串"<<endl<<endl;
	cout<<"请输入选择:"<<endl;
	cin>>ch;
	switch(ch){

	case 1:
       cout << "请输入要和主串S1连接的S2" << endl;    
    	cin >> b;
    	StrAssign(S2, b);
		  if (Concat(T,S1,S2))	
		   {
		      cout<<"连接成功后串为:";
		       StrPrint(T);
		  
		  }
	      else
	        	cout << "串连接失败" << endl;
	     break;

	case 2:
	       cout << "请输入求子串的pos和len的值"<<endl;
         	cin >> pos>> len;
        	if (SubString(Sub,S1,pos,len))
			{
	        	cout << "输出子串Sub:";
	    	     StrPrint(Sub);
			}
	      else
	    	    cout << "求子串失败!" << endl;
           break;
	 

	default:q=0;	break;
	
	}
	}	return 0;
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值