數據結構學習(十)——串的操做

    幾天沒看數據結構了,今天從新開始了。數據結構

    串是一種特殊的線性表,它的每一個結點是一個字符,因此串也稱做字符串。code

    關於串的操做主要有求串長,串複製,串鏈接,求子串,串插入,串刪除,子串定位等。串的操做也是C語言筆試中常考的一部分。字符串

    下面的代碼實現了串的主要操做。get

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 20
char *String_Create();					//建立串
int String_Length(char *s);				//求串長
void String_Show(char *s);				//輸出串
char *String_Copy(char *d, char *s);	//串複製
char *String_Connect(char *d, char *s);	//串鏈接
char *String_SubStr(char *d, char *s, int pos, int len);	//求子串
int String_Compare(char *d, char *s);	//串比較
char *String_Insert(char *d, char *s, int pos);		//串插入
char *String_Delete(char *d, int pos, int len);		//串刪除
int String_Index(char *d, char *s, int pos);		//串匹配

int main(void)
{
	int choice;
	char *str, *c;
	int ans, pos, len;

	c = (char*)malloc(sizeof(MAXSIZE));
	printf("請輸入一串字符串(小於10個字符):\n");
	str = String_Create();
	
	while(1)
	{
		printf("***************************\n");
		printf("字符串操做練習:\n");
		printf("1.求串長\n");
		printf("2.串複製\n");
		printf("3.串鏈接\n");
		printf("4.求子串\n");
		printf("5.比較串\n");
		printf("6.串插入\n");
		printf("7.串刪除\n");
		printf("8.串定位\n");
		printf("9.串輸出\n");
		printf("10.退出程序\n");
		
		printf("輸入選擇:\n");
		scanf("%d", &choice);
		getchar();

		switch(choice)
		{
		case 1:
			ans = String_Length(str);
			printf("串的長度爲%d\n", ans);
			break;
		case 2:
			c = String_Copy(c, str);
			printf("目標字符串爲:\n");
			String_Show(c);
			break;
		case 3:
			printf("輸入字串(小於10個字符)\n");
			gets(c);
			c = String_Connect(c, str);
			printf("新的字符串爲\n");
			String_Show(c);
			break;
		case 4:
			printf("輸入你想求子串所在位置及長度\n");
			scanf("%d %d", &pos, &len);
			c = String_SubStr(c, str, pos, len);
			if(c == NULL)
				printf("求子串失敗!\n");
			else
			{
				printf("所求子串爲:\n");
				String_Show(c);
			}
			break;
		case 5:
			printf("輸入字串:\n");
			gets(c);
			ans =  String_Compare(c, str);
			if(ans>0)
				printf("首字符串大\n");
			else if(ans<0)
				printf("第二個字符串大\n");
			else
				printf("兩字符串相等\n");
			break;
		case 6:
			printf("輸入需在主串中插入的字串\n");
			gets(c);
			printf("輸入插入的位置:\n");
			scanf("%d", &pos);
			str = String_Insert(str, c, pos);
			printf("新的字符串爲:\n");
			String_Show(str);
			break;
		case 7:
			printf("輸入刪除子串的起始位置及長度\n");
			scanf("%d %d", &pos, &len);
			str = String_Delete(str, pos, len);
			break;
		case 8:
			printf("輸入要定位的子串:\n");
			gets(c);
			ans = String_Index(str, c, 1);
			printf("定位的結果爲%d\n", ans);
			break;
		case 9:
			String_Show(str);
			break;
		case 10:
			return 0;
			break;
		default:
			printf("選擇無效!\n");
			break;
		}
	}
	return 1;
}

//建立串
char *String_Create()
{
	char *s, ch;
	int i = 0;

	s = (char*)malloc(MAXSIZE);
	ch = getchar();
	while(ch != '#')
	{
		*(s+i) = ch;
		i++;
		ch = getchar();
	}
	if(i > MAXSIZE/2)
		printf("輸入長度大於10!\n");
	else
		*(s+i) = '\0';
	return s;
}

//求串長
int String_Length(char *s)
{
	int l=0;

	while(*s != '\0')
	{
		l++;
		s++;
	}

	return l;
}

//串的複製
char *String_Copy(char *d, char *s)
{
	char *c;

	c = d;
	while((*d++=*s++)!='\0');

	return c;
}

//串鏈接
char *String_Connect(char *d, char *s)
{
	char *c;
	int l, i=0;;

	c = d;
	l = String_Length(d);
	d = d + l;
	while((*d++ = *s++) != '\0');		//串鏈接

	return c;
}

//求子串
char *String_SubStr(char *d, char *s, int pos, int len)
{
	char *c1, *c2=NULL;
	int l, i;
	
	c2 = (char*)malloc(MAXSIZE/2);

	c1 = s;
	d = c2;
	l = String_Length(s);

	if(pos>l || pos<1)			//輸入位置非法
		return NULL;
	if(len<0)					//輸入長度非法
		return NULL;
	c1 = c1 + pos - 1;
	
	for(i=1; i<=len && *c1 != '\0'; i++)	//求字串
	{
		*c2++ = *c1++;
	}
	*c2 = '\0';					//不要忘記結尾符號
	
	return d;
}

//串比較
int String_Compare(char *d, char *s)
{
	char *c1, *c2;

	c1 = d;
	c2 = s;

	while(*c1 != '\0' || *c2 != '\0')
	{
		if(*c1 > *c2)
			return 1;
		else if(*c1 < *c2)
			return -1;
		c1++;
		c2++;
	}
	if(*c1 == '\0' && *c2 == '\0')		//兩個字符處都結束時,則兩字符串相等
		return 0;
	else if(*c2 == '\0')				//第二個字符串先結束,則第一個字符串大
		return 1;
	else
		return -1;
}

//插入串
char *String_Insert(char *d, char *s, int pos)
{
	int i, ld,ls;
	char *c1, *c2;

	c1 = d;
	c2 = s;

	ld = String_Length(d);
	ls = String_Length(s);

	for(i=ld; i>=pos-1; i--)		//字符串後移,留出待插字符串位置
		*(c1 + ls + i) = *(c1 + i);	
	for(i=pos; i<=pos+ls-1; i++)	//插入子字符串
		*(c1 + i - 1) = *c2++;
	*(c1 + ld + ls) = '\0';			//最後的結尾符號不能忘掉

	return d;
}

//串刪除
char *String_Delete(char *d, int pos, int len)
{
	int i, l;

	l = String_Length(d);
	if(pos + len > l)				//若是刪除長度大於字串開始位置後面的長度,則只保留主串前面字符
		*(d + pos -1) = '\0';
	else
	{
		for(i=pos+len-1; i<=l; i++)
			*(d + i - len) = *(d + i);
		*(d + l - len) = '\0';		//結束字符
	}

	return d;
}

//子串定位
int String_Index(char *d, char *s, int pos)
{
	int i = pos - 1, j = 0, ld, ls, b=0;

	ld = String_Length(d);
	ls = String_Length(s);
	while(i < ld && j<ls)
	{
		if(*(d+i) == *(s+j))	//當前字符相等,則繼續匹配
		{
			i++;
			j++;
		}
		else					//下一趟匹配
		{
			i = i - j + 1;
			j = 0;
		}
	}
	if(j == ls)			//匹配成功
		return (i - ls + 1);
	else
		return 0;
}

//輸出串
void String_Show(char *s)
{
	while(putchar(*s++));
	printf("\n");
}
上面的代碼就是串的相關操做。
相關文章
相關標籤/搜索