• 数据结构教程(第五版 李春葆 上机实验题4 验证性实验)


    一、实现顺序串的各种基本运算的算法

    #include
    #include
    #define MaxSize 50
    
    
    typedef struct{
    	char data[MaxSize];
    	int length;
    }SqString;
    
    //生成串
    void StrAssign(SqString &s,char cstr[]){
    	int i;
    	for(i=0;cstr[i]!='\0';i++)
    		s.data[i]=cstr[i];
    	s.length=i;
    } 
    
    //销毁串
    void DestroyStr(SqString &s){
    } 
    
    //串的复制
    void StrCopy(SqString &s,SqString t){
    	int i;
    	for(i=0;i<t.length;i++)
    		s.data[i]=t.data[i];
    	s.length=t.length;
    } 
    
    //判断串相等
    bool StrEqual(SqString s,SqString t){
    	bool same=true;
    	int i;
    	if(s.length!=t.length) same=false;
    	else{
    		for(i=0;i<s.length;i++)
    			if(s.data!=t.data){
    				same=false;
    				break;
    			}
    	}
    	return same;
    } 
    
    //求串的长
    int StrLength(SqString s){
    	return s.length;
    } 
    
    //串的连接
    SqString Concat(SqString s,SqString t){
    	SqString str;
    	int i;
    	str.length=s.length+t.length;
    	for(i=0;i<s.length;i++)
    		str.data[i]=s.data[i];
    	for(i=0;i<t.length;i++)
    		str.data[i+s.length]=t.data[i];
    	return str;
    } 
    
    //求子串
    SqString SubStr(SqString s,int i,int j){
    	int k;
    	SqString str;
    	str.length=0;
    	if(i<=0||i>s.length||j<0||i+j-1>s.length)
    		return str;
    	for(k=i-1;k<i+j-1;k++)
    		str.data[k-i+1]=s.data[k];
    	str.length=j;
    	return str;
    } 
    
    //子串的插入
    SqString InsStr(SqString s1,int i,SqString s2){
    	int j;
    	SqString str;
    	str.length=0;
    	if(i<=0||i>s1.length+1)return str;
    	for(j=0;j<i-1;j++) str.data[j]=s1.data[j];
    	for(j=0;j<s2.length;j++) str.data[i+j-1]=s2.data[j]; 
    	for(j=i-1;j<s1.length;j++) str.data[s2.length+j]=s1.data[j];
    	str.length=s1.length+s2.length;
    	return str; 
    }
    
    //子串的删除
    SqString DelStr(SqString s,int i,int j){
    	int k;
    	SqString str;
    	str.length=0;
    	if(i<=0||i>s.length||i+j-1>s.length)return str;
    	for(k=0;k<i-1;k++) str.data[k]=s.data[k];
    	for(k=j+i-1;k<s.length;k++) str.data[k-j]=s.data[k];
    	str.length=s.length-j;
    	return str; 
    }
    
    //子串的替换
    SqString InsStr(SqString s,int i,int j,SqString t){
    	int k;
    	SqString str;
    	str.length=0;
    	if(i<=0||i>s.length||i+j-1>s.length)return str;
    	for(k=0;k<i-1;k++) str.data[k]=s.data[k];
    	for(k=0;k<t.length;k++) str.data[i+k-1]=t.data[k]; 
    	for(k=j+i-1;k<s.length;k++) str.data[k-j+t.length]=s.data[k];
    	str.length=s.length-j+t.length;
    	return str;	
    } 
    
    //输出串
    void DispStr(SqString s){
    	int i;
    	if(s.length>0){
    		for(i=0;i<s.length;i++)
    			printf("%c",s.data[i]);
    		printf("\n");
    	}
    } 
    
    int main(){
    	SqString s,s1;
    	//建立串s,s1
    	printf("1、建立串s,s1\n");
    	char cstr[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};
    	char cstr1[]={'x','y','z'};
    	StrAssign(s,cstr);
    	StrAssign(s1,cstr1); 
    	printf("\n");
    	//输出串s
    	printf("2、输出串s:");
    	DispStr(s); 
    	printf("\n");
    	//输出串s的长度
    	printf("3、输出串s的长度:");
    	StrLength(s);
    	printf("%d",StrLength(s));
    	printf("\n");
    	//在串s的第9个字符位置插入s1而产生s2
    	printf("4、在串s的第9个字符位置插入s1而产生s2");
    	SqString s2;
    	s2=InsStr(s,9,s1);
    	//输出s2
    	printf("5、输出串s2:");
    	DispStr(s2); 
    	printf("\n"); 
    	//删除串s的第2个字符开始的5个字符而产生的s2
    	printf("6、删除串s的第2个字符开始的5个字符而产生的s2"); 
    	s2=DelStr(s,2,5);
    	printf("\n");
    	//输出s2
    	printf("7、输出串s2:");
    	DispStr(s2); 
    	printf("\n");
    	//将串s的第二个字符开始的5个字符替换成s1而产生s2
    	printf("8、将串s的第二个字符开始的5个字符替换成s1而产生s2"); 
    	s2=InsStr(s,2,5,s1);
    	printf("\n");
    	//输出s2
    	printf("9、输出串s2:");
    	DispStr(s2); 
    	printf("\n");
    	//提取串s的第2个字符开始的10个字符而产生串s3
    	printf("10、提取串s的第2个字符开始的10个字符而产生串s3");
    	SqString s3;
    	s3=SubStr(s,2,10); 
    	printf("\n");
    	//输出串s3
    	printf("11、输出串s3:");
    	DispStr(s3); 
    	printf("\n");
    	//将串s1与s2连接起来产生串s4
    	printf("12、将串s1与s2连接起来产生串s4"); 
    	SqString s4;
    	s4=Concat(s1,s2);
    	printf("\n");
    	//输出串s4
    	printf("13、输出串s4:");
    	DispStr(s4); 
    	printf("\n");
    	return 0;
    }
    

    结果:
    在这里插入图片描述

    二、实现链串的各种基本运算的算法

    #include
    #include
    
    
    typedef struct snode{
    	char data;
    	struct snode *next;
    }LinkStrNode;
    
    //生成串
    void StrAssign(LinkStrNode *&s,char cstr[]){
    	int i;
    	LinkStrNode *r,*p;
    	s=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	r=s;
    	for(i=0;cstr[i]!='\0';i++){
    		p=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		p->data=cstr[i];
    		r->next=p;
    		r=p;
    	}
    	r->next=NULL;
    } 
    
    //销毁串
    void DestroyStr(LinkStrNode *&s){
    	LinkStrNode *pre=s,*p=s->next;
    	while(p!=NULL){
    		free(pre);
    		pre=p;
    		p=p->next;
    	}
    	free(pre);
    } 
    
    //串的复制
    void StrCopy(LinkStrNode *&s,LinkStrNode *t){
    	LinkStrNode *p=t->next,*q,*r;
    	s=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	r=s;
    	while(p!=NULL){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;
    		r=q;
    		p=p->next;
    	}
    	r->next=NULL;
    } 
    
    //判断串相等
    bool StrEqual(LinkStrNode *s,LinkStrNode *t){
    	LinkStrNode *p=s->next,*q=t->next;
    	while(p!=NULL&&q!=NULL&&p->data==q->data){
    		p=p->next;
    		q=q->next; 
    	} 
    	if(p==NULL&&q==NULL) return true;
    	else return false;
    } 
    
    //求串的长
    int StrLength(LinkStrNode *s){
    	LinkStrNode *p=s->next;
    	int count=0;
    	while(p!=NULL){
    		count++;
    		p=p->next; 
    	}
    	return count; 
    } 
    
    //串的连接
    LinkStrNode* Concat(LinkStrNode *s,LinkStrNode *t){
    	LinkStrNode *str,*p=s->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	r=str;
    	while(p!=NULL){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	p=t->next;
    	while(p!=NULL){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL;
    	return str;
    } 
    
    //求子串
    LinkStrNode * SubStr(LinkStrNode *s,int i,int j){
    	int k;
    	LinkStrNode *str,*p=s->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	str->next=NULL; 
    	r=str;
    	if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
    		return str;
    	for(k=1;k<i;k++)
    		p=p->next;
    	for(k=1;k<=j;k++)
    	{
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL;
    	return str;
    } 
    
    //子串的插入
    LinkStrNode * InsStr(LinkStrNode *s,int i,LinkStrNode *t){
    	int k;
    	LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	str->next=NULL; 
    	r=str;
    	if(i<=0||i>StrLength(s)+1)
    		return str;
    	for(k=1;k<i;k++){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	while(p1!=NULL){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p1->data;
    		r->next=q;r=q;
    		p1=p1->next;
    	}
    	while(p!=NULL){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL; 
    	return str; 
    }
    
    //子串的删除
    LinkStrNode * DelStr(LinkStrNode *s,int i,int j){
    	int k;
    	LinkStrNode *str,*p=s->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	str->next=NULL; 
    	r=str;
    	if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
    		return str;
    	for(k=1;k<i;k++){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	for(k=0;k<j;k++) p=p->next;
    	while(p!=NULL){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL; 
    	return str; 
    }
    
    //子串的替换
    LinkStrNode * InsStr(LinkStrNode *s,int i,int j,LinkStrNode *t){
    	int k;
    	LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	str->next=NULL; 
    	r=str;
    	if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
    		return str;
    	for(k=0;k<i-1;k++){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	for(k=0;k<j;k++) p=p->next;
    	while(p1!=NULL){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p1->data;
    		r->next=q;r=q;
    		p1=p1->next;
    	}
    	while(p!=NULL){
    		q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL; 
    	return str; 
    } 
    
    //输出串
    void DispStr(LinkStrNode *s){
    	LinkStrNode *p=s->next;
    	while(p!=NULL){
    		printf("%c",p->data);
    		p=p->next;		
    	}
    	printf("\n");
    } 
    
    int main(){
    	LinkStrNode *s,*s1;
    	//建立串s,s1
    	printf("1、建立串s,s1\n");
    	char cstr[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};
    	char cstr1[]={'x','y','z'};
    	StrAssign(s,cstr);
    	StrAssign(s1,cstr1); 
    	printf("\n");
    	//输出串s
    	printf("2、输出串s:");
    	DispStr(s); 
    	printf("\n");
    	//输出串s的长度
    	printf("3、输出串s的长度:");
    	StrLength(s);
    	printf("%d",StrLength(s));
    	printf("\n");
    	//在串s的第9个字符位置插入s1而产生s2
    	printf("4、在串s的第9个字符位置插入s1而产生s2");
    	LinkStrNode *s2;
    	s2=InsStr(s,9,s1);
    	//输出s2
    	printf("5、输出串s2:");
    	DispStr(s2); 
    	printf("\n"); 
    	//删除串s的第2个字符开始的5个字符而产生的s2
    	printf("6、删除串s的第2个字符开始的5个字符而产生的s2"); 
    	s2=DelStr(s,2,5);
    	printf("\n");
    	//输出s2
    	printf("7、输出串s2:");
    	DispStr(s2); 
    	printf("\n");
    	//将串s的第二个字符开始的5个字符替换成s1而产生s2
    	printf("8、将串s的第二个字符开始的5个字符替换成s1而产生s2"); 
    	s2=InsStr(s,2,5,s1);
    	printf("\n");
    	//输出s2
    	printf("9、输出串s2:");
    	DispStr(s2); 
    	printf("\n");
    	//提取串s的第2个字符开始的10个字符而产生串s3
    	printf("10、提取串s的第2个字符开始的10个字符而产生串s3");
    	LinkStrNode *s3;
    	s3=SubStr(s,2,10); 
    	printf("\n");
    	//输出串s3
    	printf("11、输出串s3:");
    	DispStr(s3); 
    	printf("\n");
    	//将串s1与s2连接起来产生串s4
    	printf("12、将串s1与s2连接起来产生串s4"); 
    	LinkStrNode *s4;
    	s4=Concat(s1,s2);
    	printf("\n");
    	//输出串s4
    	printf("13、输出串s4:");
    	DispStr(s4); 
    	printf("\n");
    	return 0;
    }
    

    截图:
    在这里插入图片描述

    三、实现顺序串的各种模式匹配算法

    #include
    #include
    #define MaxSize 50
    
    
    typedef struct{
    	char data[MaxSize];
    	int length;
    }SqString;
    
    //生成串
    void StrAssign(SqString &s,char cstr[]){
    	int i;
    	for(i=0;cstr[i]!='\0';i++)
    		s.data[i]=cstr[i];
    	s.length=i;
    } 
    
    //销毁串
    void DestroyStr(SqString &s){
    } 
    
    //串的复制
    void StrCopy(SqString &s,SqString t){
    	int i;
    	for(i=0;i<t.length;i++)
    		s.data[i]=t.data[i];
    	s.length=t.length;
    } 
    
    //判断串相等
    bool StrEqual(SqString s,SqString t){
    	bool same=true;
    	int i;
    	if(s.length!=t.length) same=false;
    	else{
    		for(i=0;i<s.length;i++)
    			if(s.data!=t.data){
    				same=false;
    				break;
    			}
    	}
    	return same;
    } 
    
    //求串的长
    int StrLength(SqString s){
    	return s.length;
    } 
    
    //串的连接
    SqString Concat(SqString s,SqString t){
    	SqString str;
    	int i;
    	str.length=s.length+t.length;
    	for(i=0;i<s.length;i++)
    		str.data[i]=s.data[i];
    	for(i=0;i<t.length;i++)
    		str.data[i+s.length]=t.data[i];
    	return str;
    } 
    
    //求子串
    SqString SubStr(SqString s,int i,int j){
    	int k;
    	SqString str;
    	str.length=0;
    	if(i<=0||i>s.length||j<0||i+j-1>s.length)
    		return str;
    	for(k=i-1;k<i+j-1;k++)
    		str.data[k-i+1]=s.data[k];
    	str.length=j;
    	return str;
    } 
    
    //子串的插入
    SqString InsStr(SqString s1,int i,SqString s2){
    	int j;
    	SqString str;
    	str.length=0;
    	if(i<=0||i>s1.length+1)return str;
    	for(j=0;j<i-1;j++) str.data[j]=s1.data[j];
    	for(j=0;j<s2.length;j++) str.data[i+j-1]=s2.data[j]; 
    	for(j=i-1;j<s1.length;j++) str.data[s2.length+j]=s1.data[j];
    	str.length=s1.length+s2.length;
    	return str; 
    }
    
    //子串的删除
    SqString DelStr(SqString s,int i,int j){
    	int k;
    	SqString str;
    	str.length=0;
    	if(i<=0||i>s.length||i+j-1>s.length)return str;
    	for(k=0;k<i-1;k++) str.data[k]=s.data[k];
    	for(k=j+i-1;k<s.length;k++) str.data[k-j]=s.data[k];
    	str.length=s.length-j;
    	return str; 
    }
    
    //子串的替换
    SqString InsStr(SqString s,int i,int j,SqString t){
    	int k;
    	SqString str;
    	str.length=0;
    	if(i<=0||i>s.length||i+j-1>s.length)return str;
    	for(k=0;k<i-1;k++) str.data[k]=s.data[k];
    	for(k=0;k<t.length;k++) str.data[i+k-1]=t.data[k]; 
    	for(k=j+i-1;k<s.length;k++) str.data[k-j+t.length]=s.data[k];
    	str.length=s.length-j+t.length;
    	return str;	
    } 
    
    //输出串
    void DispStr(SqString s){
    	int i;
    	if(s.length>0){
    		for(i=0;i<s.length;i++)
    			printf("%c",s.data[i]);
    		printf("\n");
    	}
    } 
    
    //BF算法
    int BF(SqString s,SqString t){
    	int j=0,i=0;
    	while(i<s.length && j<t.length){
    		if(s.data[i]==t.data[j]){
    			i++;j++;
    		}else{
    			i=i-j+1;j=0;
    		}
    	}
    	if(j>=t.length)
    		return(i-t.length);
    	else return -1;
    } 
    
    //KMP算法
    //求串t的next数组
    void GetNext(SqString t,int next[]){
    	int j,k;
    	j=0;k=-1;
    	next[0]=-1;
    	while(j<t.length-1){
    		if(k==-1 || t.data[j]==t.data[k]){
    			j++;k++;
    			next[j]=k;
    		}
    		else k=next[k];
    	}
    }
    //KMP
    int KMPIndex(SqString s,SqString t){
    	int next[MaxSize],i=0,j=0;
    	GetNext(t,next);
    	while(i<s.length && j<t.length){
    		if(j==-1||s.data[i]==t.data[j]){
    			i++;j++;
    		}
    		else j=next[j];
    	}
    	if(j>=t.length) return(i-t.length);
    	else return -1;
    }
    
    //Nextval 
    void GetNextval(SqString t,int nextval[]){
    	int j,k;
    	j=0;k=-1;
    	nextval[0]=-1;
    	while(j<t.length){
    		if(k==-1 || t.data[j]==t.data[k]){
    			j++;k++;
    			if(t.data[j]!=t.data[k])
    				nextval[j]=k;
    			else
    				nextval[j]=nextval[k];
    		}
    		else k=nextval[k];
    	}
    }
    
    //KMP
    int KMPIndex1(SqString s,SqString t){
    	int nextval[MaxSize],i=0,j=0;
    	GetNextval(t,nextval);
    	while(i<s.length && j<t.length){
    		if(j==-1||s.data[i]==t.data[j]){
    			i++;j++;
    		}
    		else j=nextval[j];
    	}
    	if(j>=t.length) return(i-t.length);
    	else return -1;
    }
    
    
     
    int main(){
    	SqString s,t;
    	//建立串s,t
    	printf("1、建立串s,t\n");
    	char cstr[]={'a','b','c','a','b','c','d','a','b','c','d','e','a','b','c','d','e','f','a','b','c','d','e','f','g'};
    	char cstr1[]={'a','b','c','d','e','a','b','c','d','e','f','a','b'};
    	StrAssign(s,cstr);
    	StrAssign(t,cstr1); 
    	printf("\n");
    	//输出串s
    	printf("2、输出串s:");
    	DispStr(s); 
    	printf("\n");
    	//输出串t
    	printf("3、输出串t:");
    	DispStr(t); 
    	printf("\n");
    	//t的next数组
    	printf("t的next数组:"); 
    	int next[t.length];
    	GetNext(t,next); 
    	for(int i=0;i<t.length;i++)
    		printf("%d\t",next[i]);
    	printf("\n");
    	//t的nextval数组
    	printf("t的nextval数组:"); 
    	int nextval[t.length];
    	GetNextval(t,nextval); 
    	for(int i=0;i<t.length;i++)
    		printf("%d\t",nextval[i]);
    	printf("\n");
    	//BF算法 
    	KMPIndex(s,t);
    	printf("%d\n",KMPIndex(s,t));
    	KMPIndex1(s,t);
    	printf("%d\n",KMPIndex1(s,t));	
    	return 0;
    }
    

    结果:
    在这里插入图片描述

  • 相关阅读:
    车联网技术解决方案与应用案例--智能TBOX车载终端
    JAVA【异常】详解
    计算机视觉与深度学习实战,Python工具,深度学习的视觉场景识别
    Allatori工具混淆jar包class
    async-rdma:使高性能网络应用开发更简单
    ProcessEngineEndpoint
    Python的Matplotlib 设置中文字体,字号
    网络技术在学校是学习网络协议吗
    设计一个缓存策略,动态缓存热点数据
    想用最快的方法从很多名单中搜到符合条件的人
  • 原文地址:https://blog.csdn.net/L093117l/article/details/127089652