⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3-4(串基本操作的演示).cpp

📁 清华大学严蔚敏老师《数据结构题集(C语言版)》实验3.4 串基本操作的演示
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>


#define STR_LEN 50
#define STR_INCREMENT 10


typedef struct
{
	char cmd;
	int args[3];
	int num[2];
} CmdType;

char CmdSet[11] = {'A','E','C','L','S','I','R','P','D','Q','H'};


typedef struct
{
	char *str;
	int length;
	int size;
} HString;


#define MAX 100

struct StrList
{
	HString S[MAX];
	int curnum;
} List;

char ch;					// 定义字符ch为全局变量,因读入操作在两个函数中执行


typedef int Status;

#define OK 1
#define ERROR 0
#define QUIT -1



char StrAssign( HString &S )
{
	if (S.str != NULL) free(S.str);

	S.str = (char *)malloc(STR_LEN * sizeof(char));
	if (!S.str) {
		printf("malloc failure\n");
		exit(ERROR);
	}
	S.size = STR_LEN;
	S.length = 0;

	ch = getchar();
	while ( 1 )
	{
		if (ch == '\'')
		{
			ch = getchar();
			if (ch != '\'')
				break;
		}

		if (S.length >= S.size)
		{
			S.str = (char *)realloc(S.str, (S.size + STR_INCREMENT) * sizeof(char));
			if (!S.str)
			{
				printf("malloc failure\n");
				exit(ERROR);
			}
		
			S.size += STR_INCREMENT;
		}

		S.str[S.length] = ch;
		++S.length;

		ch = getchar();
	}

	return OK;
}



Status ClearString( HString &S )
{
	if (S.str != NULL)
	{
		free(S.str);
		S.str = NULL;
	}
	S.length = 0;
	S.size = 0;

	return OK;
}



int StrCompare( HString S, HString T )
{
	int i;

	for (i = 0; (i < S.length) && (i < T.length); ++i)
		if (S.str[i] != T.str[i])
		{
			return (S.str[i] - T.str[i]);
		}

	return (S.length - T.length);
}



Status Concat( HString &T, HString S1, HString S2 )
{
	int i,j;

	if (T.str != NULL) free(T.str);

	T.length = S1.length + S2.length;
	if (T.length == 0)
	{
		T.str = NULL;
	}
	else
	{
		T.str = (char *)malloc(T.length * sizeof(char));
		if (!T.str)
		{
			printf("malloc failure\n");
			exit(ERROR);
		}

		j = 0;
		for (i = 0; i < S1.length; ++i)
		{
			T.str[j] = S1.str[i];
			++j;
		}
		for (i = 0; i < S2.length; ++i)
		{
			T.str[j] = S2.str[i];
			++j;
		}
	}

	return OK;
}



Status SubString( HString &Sub, HString S, int pos, int len )
{
	int i;

	if ((pos < 1) || (pos > S.length))
	{
		printf("ERROR, start-position not in main-string.\n");
		return ERROR;
	}
	if ((len < 0) || (len > S.length-pos+1))
	{
		printf("ERROR, sub-string length too large.\n");
		return ERROR;
	}

	if (Sub.str != NULL) free(Sub.str);

	Sub.length = len;
	if (Sub.length == 0)
	{
		Sub.str = NULL;
	}
	else
	{
		Sub.str = (char *)malloc(len * sizeof(char));

		for (i = 0; i < len; ++i)
			Sub.str[i] = S.str[pos+i];
	}

	return OK;
}




Status HStr_Assign( HString &S, HString &T )
{
	// 将S的值赋给T
	
	if (T.str != NULL) free(T.str);
	T.str = S.str;
	T.size = S.size;
	T.length = S.length;

	return OK;
}

Status Dec_List( int num )
{
	int i;
	
	for (i = num; i < List.curnum-1; ++i)
	{
		HStr_Assign( List.S[i + 1], List.S[i]);
	}
	
	--List.curnum;
	List.S[List.curnum].str = NULL;
	
	return OK;
}



Status SubStrIndex( HString S, HString T, int pos)
{
	int next[STR_LEN];
	void KMP_GetNext( HString T, int next[], int len );
	int i,j;

	KMP_GetNext( T, next, T.length );
	i = pos;
	j = 0;
	while ((i < S.length) && (j < T.length))
	{
		if ((j == -1) || (S.str[i] == T.str[j]))
		{
			++i;
			++j;
		}
		else
		{
			j = next[j];
		}
	}
	if (j >= T.length) return (i - T.length + 1);
	
	return 0;
}

void KMP_GetNext( HString T, int next[], int len )
{
	int i,j;
	
	i = 0;
	j = -1;
	next[0] = -1;
	while (i < T.length-1)
	{
		if ((j == -1) || (T.str[i] == T.str[j]))
		{
			++i;
			++j;
			if (T.str[i] != T.str[j])
				next[i] = j;
			else
				next[i] = next[j];
		}
		else
		{
			j = next[j];
		}
	}
}



Status Replace( HString S, HString T1, HString T2, HString &R )
{
	int i,j,m,n;

	R.str = (char *)malloc(S.size * sizeof(char));
	if (!R.str)
	{
		printf("malloc failure\n");
		exit(0);
	}
	R.size = S.size;
	R.length = 0;

	i = 0;
	j = 0;
	m = 0;
	while (m < S.length )
	{
		m = SubStrIndex( S, T1, m) - 1;

		if (m == -1)
			m = S.length;
		for (; j < m; ++j)
		{
			R.str[i] = S.str[j];
			++i;
			++R.length;
		}

		if (m == S.length)
			break;

		while (R.length + T2.length >= R.size)
		{
			R.str = (char *)realloc(R.str, (R.size + STR_INCREMENT) * sizeof(char));
			if (!R.str)
			{
				printf("malloc failure\n");
				exit(0);
			}
				R.size += STR_INCREMENT;
		}

		for (n = 0; n < T2.length; ++n)
		{
			R.str[i] = T2.str[n];
			++i;
			++R.length;
		}

		m += T1.length;
		j = m;
	}

	return OK;
}


void PrtUsage( char c )
{
	printf("===================================================\n");
	printf("Usage:\t");
	switch (c)
	{
		case 'A':	printf("A 'abc'\n");
					break;
		case 'E':	printf("E <string 1> <string 2>\n");
					break;
		case 'C':	printf("C <string 1> <string 2>\n");
					break;
		case 'L':	printf("L <string>\n");
					break;
		case 'S':	printf("S <string> <num 1> <num 2>\n");
					break;
		case 'I':	printf("I <main-string> <sub-string>\n");
					break;
		case 'R':	printf("R <main-string> <sub-string 1> <sub-string 2>\n");
					break;
		case 'P':	printf("P\n");
					break;
		case 'D':	printf("D si  (0 <= i < str-num)\n");
					break;
		case 'Q':	printf("Q\n");
					break;
		case 'H':	printf("A 'abc'\n");
					printf("E <string 1> <string 2>\n");
					printf("C <string 1> <string 2>\n");
					printf("L <string>\n");
					printf("S <string> <num 1> <num 2>\n");
					printf("I <main-string> <sub-string>\n");
					printf("R <main-string> <sub-string 1> <sub-string 2>\n");
					printf("P\n");
					printf("D si  (0 <= i < str-num)\n");
					printf("Q\n");
					break;
	}
	printf("===================================================\n");
}


int IsCmd( char c )
{
	int i;

	for (i = 0; i < 11; ++i)
		if (CmdSet[i] == c)
			return (i + 1);

	return 0;
}

int IsDigit( char c )
{
	if ((c >= '0') && (c <= '9'))
		return 1;
	
	return 0;
}



int Count_args( CmdType cmmd )
{
	switch (cmmd.cmd)
	{
		case 'A':	return 1;
					break;
		case 'E':	return 2;
					break;
		case 'C':	return 2;
					break;
		case 'L':	return 1;
					break;
		case 'S':	return 1;
					break;
		case 'I':	return 2;
					break;
		case 'R':	return 3;
					break;
		case 'P':	return 0;
					break;
		case 'D':	return 1;
					break;
		default:	return 0;
	}
	
	return 0;
}

int Count_argn( CmdType cmmd )
{
	switch(cmmd.cmd)
	{
		case 'A':
		case 'E':
		case 'C':
		case 'L':
		case 'I':
		case 'R':
		case 'P':
		case 'D':	return 0;
					break;
		case 'S':	return 2;
		default:	return 0;
	}

	return 0;
}

Status GetCmd( CmdType &cmmd )
{
	int args_num,argn_num,num,flag;

	fflush(stdin);

	ch = getchar();
	while (ch == ' ' || ch == '\t')
		ch = getchar();

	if (!IsCmd(ch))
	{
		printf("Wrong Command\n");					// 错误指令
		return ERROR;
	}

	cmmd.cmd = ch;

	if (cmmd.cmd == 'H')							// help 指令
	{
		return OK;
	}

	args_num = 0;
	argn_num = 0;
	ch = getchar();
	while (ch != '\n')						// 读入一行命令,并将信息存放于cmmd中
	{
		while (ch == ' ' || ch == '\t')
			ch = getchar();

		if (ch == '\'')
		{
			if (cmmd.cmd == 'D')			// 删除指令输入错误
			{
				printf("Deleting format ERROR.\n");
				return ERROR;
			}

			StrAssign( List.S[List.curnum] );
			cmmd.args[args_num] = List.curnum;
			++args_num;
			++List.curnum;
		}

		else if (ch == 's')
		{
			ch = getchar();
			flag = 0;
			num = 0;
			while (IsDigit(ch))
			{
				num = num * 10 + (ch - '0');
				++flag;
				ch = getchar();
			}

			if (flag == 0)					// 内部名输入格式错误
			{
				printf("ERROR\n");
				return ERROR;
			}

			cmmd.args[args_num] = num;
			++args_num;
		}

		else if (IsDigit(ch))
		{
			if (args_num == 0)				// 输入格式错误,如 S 1 2 'abcde' 
			{
				printf("ERROR");
				return ERROR;
			}

			num = 0;
			while (IsDigit(ch))
			{
				num = num * 10 + (ch - '0');
				ch = getchar();
			}

			cmmd.num[argn_num] = num;
			++argn_num;
		}

		else								// 输入格式错误,如 a1
		{
			printf("ERROR\n");
			return ERROR;
		}
	}

	if ((args_num !=Count_args(cmmd)) || (argn_num != Count_argn(cmmd)))				// 检查命令行参数数量的合法性
	{
		printf("ERROR\n");
		return ERROR;
	}


	if (cmmd.cmd == 'Q')
		return QUIT;

	return OK;
}



Status ClearCmd( CmdType &cmmd )
{
	int i;

	cmmd.cmd = '\0';
	for (i = 0; i < 3; ++i)
		cmmd.args[i] = -1;
	for (i = 0; i < 2; ++i)
		cmmd.num[i] = -1;

	return OK;
}

void InterFace()
{
	printf("\t=============================================================\n");
	printf("\t=                  String  Processing  demo                 =\n");
	printf("\t=                                                           =\n");
	printf("\t=    A (assignment)    E (equal)         C (concat)         =\n");
	printf("\t=    L (length)        S (substring)     I (index)          =\n");
	printf("\t=    R (replace)       P (print)         D (delete)         =\n");
	printf("\t=    Q (quit)                                               =\n");
	printf("\t=                                                           =\n");
	printf("\t=                         - input 'H (<cmd>)' to get help   =\n");
	printf("\t=============================================================\n");
}

int main()
{
	int stat,i,j,pos;
	CmdType command;

	InterFace();

	while (1)
	{
		ClearCmd(command);
		printf("Input Command:\n");
		stat = GetCmd(command);
		while (stat == ERROR)
		{
			printf("\nPlease input Command again:\n");
			ClearCmd(command);
			stat = GetCmd(command);
		}

		if (stat == QUIT)
		{
			printf("\t==================================================\n");
			printf("\t=   Quit, Thank you for running this program!    =\n");
			printf("\t==================================================\n");
			return 0;
		}

		if (stat == OK)
		{
			switch (command.cmd)
			{
				case 'A':	printf("String Assignment:\n");
							printf("s%d : ",command.args[0]);
							for (i = 0; i < List.S[command.args[0]].length; ++i)
								printf("%c",List.S[command.args[0]].str[i]);
							printf("\n");
							break;

				case 'E':	if (StrCompare( List.S[command.args[0]], List.S[command.args[1]] ) == 0)
								printf("EQUAL\n");
							else printf("UNEQUAL\n");
							break;

				case 'C':	if (Concat( List.S[List.curnum], List.S[command.args[0]], List.S[command.args[1]] ) == OK)
							{
								printf("Strings Concat:\n");
								printf("s%d : ",List.curnum);
								for (i = 0; i < List.S[List.curnum].length; ++i)
									printf("%c",List.S[List.curnum].str[i]);
								printf("\n");
								++List.curnum;
							}
							break;

				case 'L':	printf("The length of s%d : %d\n",command.args[0],List.S[command.args[0]].length);
							break;

				case 'S':	if (SubString( List.S[List.curnum], List.S[command.args[0]], command.num[0]-1, command.num[1] ) == OK)
							{
								printf("Get SubString:\n");
								for (i = 0; i < List.S[List.curnum].length; ++i)
									printf("%c",List.S[List.curnum].str[i]);
								printf("\n");
								++List.curnum;
							}
							else
							{
								printf("\nPlease input Command again:\n");
							}
							break;
				case 'I':	if ((pos = SubStrIndex( List.S[command.args[0]], List.S[command.args[1]], 0 )) != 0)
							{
								printf("SubString Positioning: %d\n",pos);
							}
							else
							{
								printf("no such a SubString in Main-string.\n");
							}
							break;

				case 'R':	if (Replace( List.S[command.args[0]], List.S[command.args[1]], List.S[command.args[2]], List.S[List.curnum] ) == OK)
							{
								printf("Replace SubStr1 in main-String with SubStr2:\n");
								printf("New String s%d : ",List.curnum);
								for (i = 0; i < List.S[List.curnum].length; ++i)
									printf("%c",List.S[List.curnum].str[i]);
								printf("\n");
								++List.curnum;
							}
							break;

				case 'P':	if (List.curnum == 0)
							{
								printf("no Strings in the List.\n");
							}
							else
							{
								printf("Display all the strings:\n");
								for (j = 0; j < List.curnum; ++j)
								{
									printf("s%d : ",j);
									for (i = 0; i < List.S[j].length; ++i)
										printf("%c",List.S[j].str[i]);
									printf("\n");
								}
							}
							break;
				case 'D':	if ((command.args[0] < 0) || (command.args[0] >= List.curnum))
							{
								if (command.args[0] == List.curnum-1)
								{
									printf("Command format ERROR.\n");
								}
								else
								{
									printf("Deletion failure, no such a String.\n");
								}
								printf("Usage: D si");
								printf("\t\t( 0 <= i < %d )\n",List.curnum-1);
								printf("\nPlease input Command again:\n");
							}
							else
							{
								printf("Delete String : ");
								for (i = 0; i < List.S[command.args[0]].length; ++i)
									printf("%c",List.S[command.args[0]].str[i]);
								printf("\n");
								if (Dec_List( command.args[0] ) == OK)
									printf("success\n");
								else
									printf("fail\n");
							}
							break;

				case 'H':	while (((ch =getchar()) == ' ') || (ch == '\t'));
							if (ch == '\n')
								PrtUsage('H');
							else if (IsCmd( ch ))
								PrtUsage(ch);
							else
								printf("ERROR");
			}
		}
							
		printf("\n");
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -