码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构之 --线性表之--串

时间:2015-05-30 01:51:16      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

  简单的实现串的操作,其实这与那些字符串库函数所用的操作思想是相同的,但是这是一种数据的存储方式,与操作,重点强调了数据的存储.


下面是串的非堆存储操作,说明白就是穿类似数组的存储,在分配内存时在栈中分配:

/**********************************************************************   
* *   Copyright (c)2015,WK Studios 
* *   Filename:  str.h
* *   Compiler: GCC  vc 6.0  
* *   Author:WK   
* *   Time: 2015 25 5 
* **********************************************************************/ 

#pragma once
#include<iostream>
using namespace std;
#include<assert.h>

#define MAX_STR_LEN 20
typedef char SString[MAX_STR_LEN+2];//首元素放串的长度,再给'\0'空间
//1.生成一个值为s的串ss
bool StrAssign(SString ss,char *s);
//2.复制串s得到串ss
bool StrCopy(SString ss,SString s);
//一.字符串拷贝,返回新字符串的首地址
char *my_strcpy(char *d, const char *str);
//3.判空
bool StrEmpty(SString ss);
//4.比较字符串
int StrCompare(SString ss,SString s);
//二.字符串比较
size_t my_strcmp(const char *d,const char *str);
//5.求串长度
size_t StrLength(SString ss);
//三.求字符串长度(在使用返回值时可以强制类型转换将无符号转换为有符号进行运算)
size_t my_strlen(const char *str);
//6.把字符串s1和s2联接成新串ss
bool Concat(SString ss,SString s1,SString s2);
//四.字符串连接,返回新串的首地址
char *my_strcat(char *d,const char *str);
//7. 返回串ss从pos位置起长度为len的子串并用数组sub保存
bool SubString(SString sub,SString ss,size_t pos,size_t len);
//8.返回从ss串pos位置开始与c串有相同的子串出现的位置(只返回第一次出现的相同子串)
size_t Index(SString ss,SString c,size_t pos);
//9.用串v替换ss串中和c串相等的子串
bool Replace (SString ss,SString c,SString v);
//10.在串ss的第pos个字符前面插入串c
bool StrInsert(SString ss,size_t pos,SString c);
//11.删除串ss中第pos个字符开始长度为len 的字符串
bool StrDelete(SString ss,size_t pos,size_t len);
//12.销毁删除串ss
bool DestoryString(SString ss);
//13.显示串
void StrPrint(SString ss);

/**********************************************************************   
* *   Copyright (c)2015,WK Studios 
* *   Filename:  str.cpp
* *   Compiler: GCC  vc 6.0  
* *   Author:WK   
* *   Time: 2015 25 5 
* **********************************************************************/ 

#include"str.h"
//1.生成一个值为s的串ss
bool StrAssign(SString ss,char *s)
{
	assert(strlen(s)<=MAX_STR_LEN);//超过就放不下
	ss[0]=strlen(s);//字符串长度放在首元素
	for(int i=1;i<=ss[0];++i)
	{
		ss[i]=s[i-1];
	}
	ss[ss[0]+1]='\0';//保证有字符串的'\0'标识
	return true;
}
//2.复制串s得到串ss
bool StrCopy(SString ss,SString s)
{
	//assert(ss[0]>s[0]);没必要判断,因为初始化的时候已经判断了
    for(int i=0;i<=s[0];++i)
	{
		ss[i]=s[i];
	}
	ss[ss[0]+1]='\0';//保证有字符串的'\0'标识
	return true;
}
//一.字符串拷贝,返回新字符串的首地址
char *my_strcpy(char *d, const char *str);
//3.判空
bool StrEmpty(SString ss)
{
	return ss[0]==0;
}
//4.比较字符串
int StrCompare(SString ss,SString s)
{
	int i=1;
	for(;i<=ss[0]&&i<=s[0];++i)
	{
		if(ss[i] != s[i])
		{
			return ss[i]-s[i];
		}
	}
	if(i>ss[0] || i>s[0])//两个串长度不相等时候
	{
		return ss[i]-s[i];
	}
	return ss[0]-s[0];//两个串相等的时候
}
//二.字符串比较
size_t my_strcmp(const char *d,const char *str);
//5.求串长度
size_t StrLength(SString ss)
{
	return ss[0];
	
}
//三.求字符串长度(在使用返回值时可以强制类型转换将无符号转换为有符号进行运算)
size_t my_strlen(const char *str);
//6.把字符串s1和s2联接成新串ss
bool Concat(SString ss,SString s1,SString s2)
{
	
	if(s1[0]+s2[0]<=MAX_STR_LEN)
	{
		ss[0]=s1[0]+s2[0];
		for(int i=1;i<=s1[0];++i)
		{
			ss[i]=s1[i];
		}
		for(int j=1;j<=s2[0];++j)
		{
			ss[s1[0]+j]=s2[j];
		}
	}
	else//超过后,放入s1截断s2或者s2无机会放入
	{
		ss[0]=MAX_STR_LEN;
		for(int i=1;i<=MAX_STR_LEN;++i)
		{
			ss[i]=s1[i];
			if(s1[0]< MAX_STR_LEN)
			{
				ss[s1[0]+1]=s2[i];
			}
		}	
	}
	ss[s1[0]+s2[0]+1]='\0';//保证有字符串的'\0'标识
	return  true;
}
//四.字符串连接,返回新串的首地址
char *my_strcat(char *d,const char *str);
//7. 返回串ss从pos位置起长度为len的子串并用数组sub保存
bool SubString(SString sub,SString ss,size_t pos,size_t len)
{
	if(pos<1 || pos>ss[0] ||len<1|| len > ss[0]-pos+1)//当pos=0时候就直接输出数原字符串  
		//长度与位置关系应考虑到加一
	{
		return false;
	}
	sub[0]=len;
	for(int i=0;i<len;++i)
	{
		sub[i+1]=ss[pos+i];
	}
	return true;
}

//8.返回从ss串pos位置开始与c串有相同的子串出现的位置(只返回第一次出现的相同子串)
size_t Index(SString ss,SString c,size_t pos)
{
	assert( pos <=ss[0] && c[0] <=ss[0] );
    int i=pos;
	int j=1;
	
	while(i<=ss[0] && j<=c[0])
	{
		if(ss[i]==c[j])
		{
			i++;
			j++;
		}
		else
		{
			i=i-j+2; //从串ss的下一个字符开始比较
			j=1;	//串c又从开头开始进行比较
		}
		
	}
    
	if(j>c[0])//说明比较完毕
	{
		return i-c[0];//返回c字符串在ss中首元素出现的位置
	}
	return 0;//没找到
	
}
//9.用串v替换ss串中和c串相等的子串
bool Replace (SString ss,SString c,SString v)
{
	
	
	return true;
}
//10.在串ss的第pos个字符前面插入串c
bool StrInsert(SString ss,size_t pos,SString c)
{
	   for(int i=ss[0]+1;i>=pos;--i)//往后移动时,连'\0'一块进行移动
	   {
		   int a=c[0];
		   if(ss[0]+ c[0] > MAX_STR_LEN)
		   { 
			   a=MAX_STR_LEN-ss[0];
		   }   
		  ss[i+a]= ss[i];   
	   }
	   int j=0,r=ss[0];
	   while( j<=c[0] )
	   {
		  if(ss[0]+ c[0] > MAX_STR_LEN)
		  {
			  if(r<MAX_STR_LEN)//c串部分插入
			  { 	  
			  r++;
			  }
			  else
			  {
			  break;
			  } 
		  }
			  
		  ss[pos+j]=c[j+1]; //c串全部插入
		  j++;
		
	   }

	   if(ss[0]+ c[0]<=MAX_STR_LEN)//确定插入后串的长度
	   {
	   ss[0]+=c[0];
	   }
	   else
		{
		ss[0]=MAX_STR_LEN;
		}
	   return true;
}
//11.删除串ss中第pos个字符开始长度为len 的字符串
bool StrDelete(SString ss,size_t pos,size_t len)
{   
    if(pos<1  ||  pos>ss[0]-len +1||  len<1)
     return false;
     for(int i=pos+len;i<=ss[0];i++)
     ss[i-len]=ss[i];
     ss[0]-=len;
	
	return true;
}
//12.销毁删除串ss
bool DestoryString(SString ss)
{
	ss[0]=0;
	return true;
}
//13.显示串
void StrPrint(SString ss)
{
	for(int i=1;i<=ss[0];++i)
	{
		cout<<ss[i]<<" ";
	}
	cout<<"\n";
}

/**********************************************************************   
* *   Copyright (c)2015,WK Studios 
* *   Filename:  main.cpp
* *   Compiler: GCC  vc 6.0  
* *   Author:WK   
* *   Time: 2015 25 5 
* **********************************************************************/ 
//测试函数

#include"str.h"
int main()
{
	SString s1;
	char a1[]="123456";
	StrAssign(s1, a1);
	cout<<"s1 is: ";
    StrPrint(s1);
    cout<<"\n";
	
	SString s2;
    char a2[]="123456789900009900";
	StrAssign(s2, a2);
    cout<<"s2 is: ";
    StrPrint(s2);
    cout<<"\n";
     
     cout<<"After Insert:";
     StrInsert(s1,2,s2);
      StrPrint(s1);
	cout<<"\n";
	
       cout<<"After Delete:";
	StrDelete(s1,3,4);
	StrPrint(s1);
	cout<<"\n";
	/*
	cout<<Index(s1, s2, 4)<<"\n";
	
	  
		//substring 函数测试
		SString sub;
		SubString(sub,s1,1, 3);
		cout<<"sub is: ";
		StrPrint(sub);
		cout<<"\n";
		
		  //连接测试
		  SString ss;
		  Concat(ss,s1,s2);
		  cout<<"After concat ss is: ";
		  StrPrint(ss);
		  cout<<"\n";
		  
			//复制测试
			  StrCopy(s1,s2);
			  cout<<"After copy s1 is: ";
			  StrPrint(s1);
			  cout<<"\n";
			  //比较测试
			  cout<<"result of compare s1 with s2 is : ";
			  if(StrCompare(s1,s2)!= 0)
			  {
			  if(StrCompare(s1,s2) > 0)
			  cout<<"s1 大 \n";
			  else
			  cout<<"s2 大 \n";
			  }
			  else
			  {
			  cout<<"相等 \n";
}*/
	return 0;
}

技术分享







待续:串的堆存储操作》》》》》》》》》》》》》

数据结构之 --线性表之--串

标签:

原文地址:http://blog.csdn.net/kai8wei/article/details/46246383

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!