c 数据结构 顺序串

/*
 * 顺序
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -2
#define MAXSIZE 255

typedef int statue;
typedef char Elemtype;
typedef struct {
	char *pBase;
	int chunsize;
}HString;
//函数的前置声明
statue Strini(HString &str);//初始化
statue StrAssign(HString &str,char *val);
void Strshow(HString str);
bool isEmpty(HString str);
statue Strcopy(HString &str1,HString str2);
int Strlength(HString str);
statue Concat(HString &str1,HString str2);//str2 链接到str1后面
statue SubString(HString &sub,HString s,int pos,int length);
int StrCompare(HString str1,HString str2);//比较两个字符串大小 1 0 -1
int Index(HString str1,HString str2);//str2 第一次在 str1 中的位置
int main(void){
HString str,str2;
Strini(str);
Strini(str2);
char val[255];
gets(val);
StrAssign(str,val);
gets(val);
StrAssign(str2,val);
//printf("%d\n",StrCompare(str,str2));
//Concat(str,str2);
//SubString(str2,str,4,5);
//Strshow(str2);
printf("%d\n",Index(str,str2));
return 0;
}
statue Strini(HString &str){
	str.pBase=(Elemtype *)malloc(sizeof(Elemtype)*MAXSIZE);
	if(str.pBase==NULL){
		printf("內存分配失敗\n");
		exit(OVERFLOW);
	}
	str.chunsize=0;
return OK;
}
statue StrAssign(HString &str,char *val){
	int i,length;
	length=strlen(val);
	if(length>MAXSIZE){
		printf("子串过大\n");
		return ERROR;
	}
	for(i=0;i<length;i++){
		str.pBase[i]=val[i];
	}
	str.chunsize=length;
return OK;	
}
void Strshow(HString str){
	int i;
	if(isEmpty(str)){
		printf("This chuan is empty\n");
		exit(-1);
	} 
	for(i=0;i<str.chunsize;i++){
		printf("%c",str.pBase[i]);
	}
	printf("\n");
}
bool isEmpty(HString str){
	if(str.chunsize==0)
		return true;
	return false;
}
statue Strcopy(HString &str1,HString str2){
	int i;
	if(isEmpty(str2)){
		printf("This chuan is empty\n");
		return ERROR;
	}
	for(i=0;i<str2.chunsize;i++){
		str1.pBase[i]=str2.pBase[i];
	}
	str1.chunsize=str2.chunsize;
return OK;
}
int Strlength(HString str){
	if(isEmpty(str))
		return 0;
return str.chunsize;
}
statue Concat(HString &str1,HString str2){
	int i,length;
	length=Strlength(str1)+Strlength(str2);
	if(isEmpty(str1)||isEmpty(str2)){
		printf("this chuan is empty\n");
		return ERROR;
	}
	while(length>MAXSIZE){
		str1.pBase=(Elemtype *)realloc(str1.pBase,sizeof(Elemtype)*length);
	}
	for(i=Strlength(str1);i<length;i++){
		str1.pBase[i]=str2.pBase[i-Strlength(str1)];
	}
	str1.chunsize+=str2.chunsize;
	return OK;
}
int StrCompare(HString str1,HString str2){
	int i,j,k;
	str1.chunsize>str2.chunsize ? k=str1.chunsize:k=str2.chunsize;
	if(isEmpty(str1)||isEmpty(str2)){
		printf("this chuan is empty\n");
		exit(-1);
	}
	for(i=0;i<k;i++){
		if(str1.pBase[i]>str2.pBase[i]){
			return 1;
		}else if(str1.pBase[i]<str2.pBase[i]){
			return -1;
		}
		if(i+1==k){
			return 0;
		}
	}
}
statue SubString(HString &sub,HString s,int pos,int length){
	int i;
	if(pos<0||pos>s.chunsize){
		printf("This pos ERROR\n");
		return ERROR;
	}
	if(s.chunsize-pos<length){
		printf("This length ERROR\n");
		return ERROR;
	}
	if(isEmpty(s)){
		printf("This chuan is empty\n");
		return ERROR;
	}
	for(i=0;i<length;i++){
		sub.pBase[i]=s.pBase[i+pos-1];
	}
	sub.chunsize=length;
	return OK;
}
int Index(HString str1,HString str2){
	int i=0,j=0,k;
	if(isEmpty(str1)||isEmpty(str2)){
		printf("this chuan is empty\n");
		exit(-1);
	}
	while(i<str1.chunsize&&j<str2.chunsize){
		//printf("%c*********%c\n",str1.pBase[i],str2.pBase[j]);
	//	printf("%d----%d\n",i,j);
		if(str1.pBase[i]==str2.pBase[j]){
			i++;
			j++;
		}else{
			j=0;
			i=i-j+1;
		}
	}
	//printf("%d-->>>--%d\n",i,j);
	if(j>=str2.chunsize){
		return i-str2.chunsize+1;
	}else if(i>str1.chunsize){
		return 0;
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值