天天看點

《資料結構》串基本操作與實作

#include"stdio.h"
#include"stdlib.h"
#include"String.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define Maxstrlen 225

typedef unsigned char SString[Maxstrlen+1];
typedef int Status;

/*typedef struct Node
{
	char ch;
	int count;
	struct Node * next;
}LNode,* LinkList;*/

//生成一個值為chars的串T
Status StrAssign(SString T,char chars[])
{
	int i=1;
	if(strlen(chars)>Maxstrlen)return ERROR;
	T[0]=strlen(chars);//串的長度
	for(i=1;i<=T[0];i++)
	{	
			T[i]=chars[i-1];
	}
	return TRUE;
}

//由串S複制得到串T
Status StrCopy(SString T,SString S)
{
	int i=1;
	T[0]=S[0];
	printf("T string after copy is :");
	for(i=1;i<=T[0];i++)
	{
		T[i]=S[i];
		printf("%c",T[i]);
	}
	printf("\n");
	return OK;
}

//判空
Status StrEmpty(SString S)
{
	return S[0]==0?TRUE:FALSE;
}

//比較串長,傳回長度差
int StrCompare(SString S,SString T)
{
	int i=1;
	for(i=1;i<=S[0]&&i<=T[0];i++)
	{
		if(S[i]!=T[i])return S[i]-T[i];
	}
	return S[0]-T[0];//strlen(S)>strlen(T)時,如果前面完全一樣傳回長度差,不用在意傳回的含義
}

//串長度
int StrLength(SString S)
{
	return S[0];
}

//清空
Status ClearString(SString S)
{
	S[0]=0;
	return OK;
}

//銷毀
Status DestroyString(SString S)
{
	S=NULL;
	free(S);
	return OK;
}

Status Concat(SString T,SString S1,SString S2)
/*用T傳回由串S1和串S2連接配接成的新串。若未截斷,則傳回true,否則傳回false*/
{
	int i=1;
	if(S1[0]+S2[0]<=Maxstrlen)
	{
		T[0]=S1[0]+S2[0];
		for(i=1;i<=S1[0];i++)
		{
			T[i]=S1[i];
		}
		for(i=1;i<=S2[0];i++)
		{
			T[i+S1[0]]=S2[i];
		}
		return OK;
	}
	else if(S1[0]<Maxstrlen)//截斷;隻取S2的一部分,傳回false
	{
		T[0]=Maxstrlen;
		for(i=1;i<=S1[0];i++)
		{
			T[i]=S1[i];
		}
		for(i=1;i<=Maxstrlen-S1[0];i++)
		{
			T[i+S1[0]]=S2[i];
		}
		return FALSE;
	}
	else
	{
		T[0]=Maxstrlen;
		for(i=1;i<=T[0];i++)
		{
			T[i]=S1[i];
		}
		return FALSE;
	}
}

//在串S的第pos個位置插入串T
Status StrInsert(SString S,SString T,int pos)
{
	int i=1;
	if(pos<1||pos>S[0]+1)return ERROR;

	if(S[0]+T[0]<=Maxstrlen)
	{/*
		for(i=S[0];i>=pos;i--)
		{
			S[i+T[0]]=S[i];
		}*/
		for(i=pos;i<pos+T[0];i++)
		{
			S[i]=T[i-pos+1];
		}
		S[0]=S[0]+T[0];
		return OK;
	}
	else
	{
		for(i=Maxstrlen;i>=pos;i--)
		{
			S[i]=S[i-S[0]];
		}
		for(i=pos;i<pos+Maxstrlen-S[0];i++)
		{
			S[i]=T[i-pos+1];
		}
		S[0]=Maxstrlen;
		return OK;
	}
}

//在串S中從第pos個位置開始删除長度為len的元素
Status StrDelete(SString S,int pos,int len)
{
	int i=1;
	if(len<0||pos<1||pos>S[0]-len+1)return ERROR;
	for(i=pos+len;i<=S[0];i++)
	{
		S[i-len]=S[i];
	}
	S[0]-=len;
	return OK;
}

//傳回串s中長度為len的子串
Status SubString(SString Sub,SString S,int pos,int len)
{
	int i=1;
	if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)return ERROR;
	for(i=pos;i<=pos+len;i++)
	{
		Sub[i-pos+1]=S[i];
	}
	Sub[0]=len;
	return OK;
}

//若串S中存在相同子串,則傳回在主串中第pos個字元後第一次出現的位置
int Index(SString S,SString T,int pos)
{
	int i=pos,j=1;
	while(i<=S[0]&&j<=T[0])
	{
		if(S[i]==T[j])
		{
			i++;
			j++;
		}
		else
		{
			i=i-j+1+1;
			j=1;
		}
	}
	if(j>T[0])return i-T[0];
	else
		return 0;
}

//周遊
void PrintString(SString S)
{
	int i=1;
	printf("string is :");
	for(i=1;i<=S[0];i++)
	{
		printf("%c",S[i]);
	}
	printf("\n");
}


void main()
{
	//LinkList L;
	SString S,T,S1,S2,Sub;
	char chars[Maxstrlen];
	printf("input S string:\n");
	gets(chars);
	StrAssign(S,chars);

	int pos,len;
	int choice=1;
	while(choice!=0)
	{
		printf("0.exit 1.StrAssign 2.StrCopy 3.StrEmpty 4.StrCompare 5.StrLength 6.ClearString 7.DestroyString \n");
		printf("8.Concat 9.StrInsert 10.StrDelete 11.SubString 12.Index 13.PrintString\n");
		printf("input your choice : ");
		scanf("%d",&choice);
		switch(choice)
		{
		case 0:printf("BEY BEY !");break;
		case 1:
			{				
				printf("input assign chars: ");
				getchar();
				gets(chars);
				if(StrAssign(T,chars)==OK)printf("strassign T succeess.\n");
				else
				{
					printf("strassign T not success.\n");
				}
			}break;
		case 2:
			{
				if(StrCopy(T,S)==OK)printf("T copy S success.\n");
				else
					printf("T copy S not success.\n");
			}break;
		case 3:
			{
				if(StrEmpty(S)==TRUE)printf("S string is empty.\n");
				else
					printf("S string is not empty.\n");
			}break;
		case 4:
			{
				int value=0;
				value=StrCompare(S,T);
				if(value==0)printf("string S==srtring T\n");
				else if(value>0)printf("string S>srtring T\n");
				else
					printf("string S<srtring T\n");
			}break;
		case 5:printf("S string's length is %d",StrLength(S));break;
		case 6:
			{
				if(ClearString(S)==OK)printf("S string clear sucess.\n");
				else
					printf("S string clear not success.\n");
			}break;
		case 7:
			{
				if(DestroyString(S)==OK)printf("S string destroy sucess.\n");
				else
					printf("S string destroy not success.\n");
			}break;
		case 8:
			{
				printf("input S1 string:\n");
				getchar();
				gets(chars);
				StrAssign(S1,chars);
				printf("input S2 string:\n");
				gets(chars);
				StrAssign(S2,chars);
				if(Concat(T,S1,S2)==TRUE)
				{
					printf("T 完全連接配接 S1 and S2.\n");
					PrintString(T);
				}
				else
				{
					printf("T連接配接了部分 S1 and S2 \n");
					PrintString(T);
				}
			}break;
		case 9:
			{
				printf("input insert location: ");
				scanf("%d",&pos);
				if(StrInsert(S,T,pos)==OK)printf("T string inser sucess.\n");
				else
					printf("T String insert not sucess.\n");
			}break;
		case 10:
			{
				printf("input delete location and len: ");
				scanf("%d %d",&pos,&len);
				if(StrDelete(S,pos,len)==OK)printf("delete sucess.\n");
				else
					printf("delete not sucess.\n");
			}break;
		case 11:
			{
				printf("input sub location and len: ");
				scanf("%d %d",&pos,&len);
				if(SubString(Sub,S,pos,len)==OK)
				{
					printf("substring is : ");
					for(int i=1;i<=Sub[0];i++)
					{
						printf("%c",Sub[i]);
					}
					printf("\n");
				}
				else
					printf("substring not sucess.\n");
			}break;
		case 12:
			{
				printf("input start valued pos:");
				scanf("%d",&pos);
				int first=0;
				first=Index(S,T,pos);
				printf("T string from S string's %d start first apprea is %d ",pos,first);
			}break;
		case 13:PrintString(S);break;
		}
		printf("\n");
	}
}