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

串的定长顺序存储表示

时间:2015-05-18 06:39:20      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:c语言   数据结构      

串的定长顺序存储表示是一种类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。

在实现时主要实现以下功能:

int Length(SString s);                               //串长

bool StringConcat(SString T, SString s1, SString s2);//用T返回s1和s2连接的串

void PrintString(char T[]);                          //输出

bool StringAssign(SString T,const char str[]);       //生成值为str的串

bool StrCopy(SString T, SString s);                  //将s拷贝到T

bool StrEmpty(SString T);                            //判空

int StrCompare(SString T,SString T1);                //比较

void ClearString(SString T);                         //清除

bool SubString(SString T,SString S,int pos,int len); //返回子串

bool StrInsert(SString S,int pos,SString T);         //插入
 
bool StrDelete(SString S,int pos,int len);           //删除


但是对于Replace()函数和Index()函数我仍有不懂得地方,故这里不进行编写。


具体的代码如下:

头文件:

#pragma once

#include<iostream>
using namespace std;


#define MAX_STRING_SIZE 8

typedef char SString[MAX_STRING_SIZE+1];

int Length(SString s);                               //串长

bool StringConcat(SString T, SString s1, SString s2);//用T返回s1和s2连接的串

void PrintString(char T[]);                          //输出

bool StringAssign(SString T,const char str[]);       //生成值为str的串

bool StrCopy(SString T, SString s);                  //将s拷贝到T

bool StrEmpty(SString T);                            //判空

int StrCompare(SString T,SString T1);                //比较

void ClearString(SString T);                         //清除

bool SubString(SString T,SString S,int pos,int len); //返回子串

bool StrInsert(SString S,int pos,SString T);         //插入
 
bool StrDelete(SString S,int pos,int len);           //删除


函数声明:

#include "String.h"

int Length(SString s)
{
	return strlen(s);
}

bool StringConcat(SString T, SString s1, SString s2)
{
	int t_length = MAX_STRING_SIZE;
	int s1_length = Length(s1);
	int s2_length = Length(s2);

	if(t_length >= s1_length+s2_length)
	{
		for(int i=0; i<s1_length; ++i)
		{
			T[i] = s1[i];
		}
		for(int j=0; j<s2_length; ++j)
		{
			T[i+j] = s2[j];
		}
		T[i+j] = '\0';
		return true;
	}
	else if(t_length>s1_length && t_length<s1_length+s2_length)
	{
		for(int i=0; i<s1_length; ++i)
		{
			T[i] = s1[i];
		}
		for(int j=0; j<t_length-s1_length; ++j)
		{
			T[i+j] = s2[j];
		}
		T[i+j] = '\0';
		return false;
		
	}
	else if(t_length < s1_length)
	{
		for(int i=0;i<t_length;++i)
		{
			T[i] = s1[i];
		}
		T[i] = '\0';
	}
	return true;
}

void PrintString(char T[])
{
	cout<<T<<endl;
}

bool StringAssign(SString T,const char str[])
{
	for(int i=0;str[i] != '\0';++i)
	{
		T[i] = str[i];
	}
	T[i] = '\0';
	return true;
}

bool StrCopy(SString T, SString s)
{
	int t_length = MAX_STRING_SIZE;
	int s_length = Length(s);
	if(s_length <= t_length)
	{
		for(int i = 0;i < s_length;++i)
		{
			T[i] = s[i];
		}
		T[i] = '\0';
	}
	else
	{
		for(int i = 0;i < t_length;++i)
		{
			T[i] = s[i];
		}
		T[i] = '\0';
	}
	return true;
}

bool StrEmpty(SString T)
{
	if(Length(T) == 0)
	{
		cout<<"串为空"<<endl;
		return true;
	}
	else
	{
		cout<<"串不为空"<<endl;
		return false;
	}
}

int StrCompare(SString T,SString T1)
{
	for(int i=0,j=0;i<Length(T),j<Length(T1);++i,++j)
	{
		if(T[i]-'0' > T1[j]-'0')
		{
			return 1;
		}
		else if(T[i]-'0' == T1[j]-'0')
		{
			return 0;
		}
		else
		{
			return -1;
		}
	}
	exit(-1);
}

void ClearString(SString T)
{
	T[0] = '\0';
}

bool SubString(SString T,SString S,int pos,int len)
{
	if(pos > Length(S) || pos < 1 || len < 0 )
	{
		return false;
	}
	else if(len > Length(S)-pos+1)
	{
		cout<<"无法返回,返回原始字符串:";
		for(int i=pos-1;i<Length(S);++i)
		{
			T[i] = S[i];
		}
		T[i]='\0';
	}
	else
	{
		for(int i=pos-1;i<pos+len-1;++i)
		{
			T[i] = S[i];
		}
		T[i]='\0';
	}
	return true;
}

bool StrInsert(SString S,int pos,SString T)
{
	if(pos < 1 || pos > Length(S)+1)
	{
		return false;
	}
	else
	{
		for(int i = Length(S);i>=pos-1;--i)
		{
			S[i+Length(T)] = S[i];
		}
		for(i  = 0;i < Length(T);++i)
		{
			S[pos+i-1] = T[i];
		}
	}
	return true;
}

bool StrDelete(SString S,int pos,int len)
{
	if(pos < 0 || pos > Length(S)|| len < 0)
	{
		return false;
	}
	else if(pos > Length(S)-len+1)
	{
		S[pos-1] = '\0';
	}
	else
	{
		for(int i = pos+len;i <= Length(S)-1;++i)
		{
			S[i-len] = S[i];
		}
		S[Length(S)-len] = '\0';
	}
	return true;
}


测试文件:

#include"String.h"

void main()
{
	SString T;
	char str[] = "bit";
	SString s1 = "hello";
	SString s2 = "world";
	StrInsert(s1,2,s2);
	PrintString(s1);
	SubString(T,s1,1,6);
	PrintString(T);
	StringConcat(T,s1,s2);
	PrintString(T);
	StrCopy(T,s1);
	PrintString(T);
	StringAssign(T,str);
	PrintString(T);
	StrDelete(s2,1,1);
	PrintString(s2);
	StrEmpty(T);
	if(StringAssign(s1,s2)==1)
	{
		cout<<"前串大于后串"<<endl;
	}
	else if(StringAssign(s1,s2)==0)
	{
		cout<<"前串等于后串"<<endl;
	}
	else
	{
		cout<<"前串小于后串"<<endl;
	}
	ClearString(T);
    StrEmpty(T);
}


希望大家能够指出我的不足,谢谢~我会努力改进的。

串的定长顺序存储表示

标签:c语言   数据结构      

原文地址:http://blog.csdn.net/qaz3171210/article/details/45809457

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