数据结构(串)
数据结构(串)
《数据结构教程》第6版 p136页上机作业
exp4-1
//
// Created by Snow on 2023/3/21.
//
#include"sqstring.cpp"
int main()
{
PrintCommand();
exp();
return 0;
}
//
// Created by Snow on 2023/3/21.
//
#include<cstdio>
#include<windows.h>
#define MaxSize 40
typedef struct
{
char data[MaxSize];
int length;
}SqString;
void PrintCommand()
{
printf("1.建立串s=”abcdefghijklmn“和串s1=“xyz” 2.输出串s\n");
printf("3.输出串s的长度 4.在串s的第9个字符位置插入串s1而产生s2\n");
printf("5.输出串s2 6.删除串s的第2个字符开始的5个字符而产生串s2\n");
printf("7.输出串s2 8.将串s的第2个字符开始的5个字符替换成串是而产生串s2\n");
printf("9.输出串s2 10.提取串s的第2个字符开始的10个字符而产生串s3\n");
printf("11.输出串s3 12.将串s1和串s2连接起来而产生的串s4\n");
printf("12.输出串s4\n");
}
void StrAssign(SqString &s,const char str[])
{
int i;
for(i=0;str[i]!='\0';i++)
s.data[i]=str[i];
s.length=i;
}
int StrLength(SqString s)
{
return(s.length);
}
SqString Sub(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 s,int i,SqString t)
{
int j;
SqString str;
str.length=0;
if(i<=0||i>s.length+1)
return str;
for(j=0;j<i-1;j++)
str.data[j]=s.data[j];
for(j=0;j<t.length;j++)
str.data[j+i-1]=t.data[j];
for(j=i-1;j<s.length;j++)
str.data[j+t.length]=s.data[j];
str.length=s.length+t.length;
return str;
}
SqString RepStr(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[k+i-1]=t.data[k];
for(k=i-1+j;k<s.length;k++)
str.data[k+t.length-j]=s.data[k];
str.length=s.length+t.length-j;
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>s.length+1)
return str;
for(k=0;k<i-1;k++)
str.data[k]=s.data[k];
for(k=i+j-1;k<s.length;k++)
str.data[k-j]=s.data[k];
str.length=s.length-j;
return str;
}
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[s.length+i]=t.data[i];
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");
}
else
printf("空串!\n");
}
void exp()
{
char str1[]="abcdefghijklmn",str2[]="xyz";
SqString s,s1,s2,s3,s4;
StrAssign(s,str1);
StrAssign(s1,str2);
printf("\ns=");
DispStr(s);
printf("\n串s的长度为%d\n", StrLength(s));
s2=InsStr(s,9,s1);
printf("\n在串s的第9个字符位置插入串s1而产生s2为 ");
DispStr(s2);
s2=DelStr(s,2,5);
printf("\n删除串s的第2个字符开始的5个字符而产生串s2为 ");
DispStr(s2);
s2=RepStr(s,2,5,s1);
printf("\n将串s的第2个字符开始的5个字符替换成串是而产生串s2为 ");
DispStr(s2);
s3=Sub(s,2,10);
printf("\n提取串s的第2个字符开始的10个字符而产生串s3为 ");
DispStr(s3);
s4=Concat(s1,s2);
printf("\n将串s1和串s2连接起来而产生的串s4为 ");
DispStr(s4);
system("pause");
}
exp4-2
//
// Created by Snow on 2023/3/22.
//
#include"listring.cpp"
int main()
{
PrintCommand();
exp();
return 0;
}
//
// Created by Snow on 2023/3/22.
//
#include<cstdio>
#include<cstdlib>
typedef struct SNode
{
char data;
struct SNode *next;
}LinkStrNode;
void PrintCommand()
{
printf("1.建立串s=”abcdefghijklmn“和串s1=“xyz” 2.输出串s\n");
printf("3.输出串s的长度 4.在串s的第9个字符位置插入串s1而产生s2\n");
printf("5.输出串s2 6.删除串s的第2个字符开始的5个字符而产生串s2\n");
printf("7.输出串s2 8.将串s的第2个字符开始的5个字符替换成串是而产生串s2\n");
printf("9.输出串s2 10.提取串s的第2个字符开始的10个字符而产生串s3\n");
printf("11.输出串s3 12.将串s1和串s2连接起来而产生的串s4\n");
printf("12.输出串s4\n");
}
void StrAssign(LinkStrNode *&s,char const str[])
{
int i;
LinkStrNode *p,*r;
s=(LinkStrNode*)malloc(sizeof(LinkStrNode));
r=s;
for(i=0;str[i]!='\0';i++)
{
p=(LinkStrNode*)malloc(sizeof(LinkStrNode));
p->data=str[i];
r->next=p;
r=p;
}
r->next=nullptr;
}
bool DestroyStr(LinkStrNode *&s)
{
if(s==nullptr)
{
printf("链串不存在!\n");
return false;
}
LinkStrNode *p=s->next,*pre=s;
while(p!=nullptr)
{
free(pre);
pre=p;
p=p->next;
}
free(pre);
return true;
}
int StrLength(LinkStrNode *s)
{
int i=0;
LinkStrNode *p=s->next;
while(p!=nullptr)
{
p=p->next;
i++;
}
return i;
}
LinkStrNode *Concat(LinkStrNode *s,LinkStrNode *t)
{
LinkStrNode *str,*p=s->next,*r,*q;
str=(LinkStrNode*)malloc(sizeof(LinkStrNode));
r=str;
while(p!=nullptr)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
p=t->next;
while(p!=nullptr)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=nullptr;
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=nullptr;
r=str;
if(i<=0||i>StrLength(s)||i+j-1>StrLength(s))
{
printf("参数错误!\n");
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=nullptr;
return str;
}
LinkStrNode *InsStr(LinkStrNode *s,int i,LinkStrNode *t)
{
int k;
LinkStrNode *str,*p1=s->next,*p2=t->next,*q,*r;
str=(LinkStrNode*)malloc(sizeof(LinkStrNode));
str->next=nullptr;
r=str;
if(i<=0||i>StrLength(s)+1)
{
printf("参数错误!\n");
return str;
}
for(k=1;k<i;k++)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p1->data;
r->next=q;
r=q;
p1=p1->next;
}
while(p2!=nullptr)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p2->data;
r->next=q;
r=q;
p2=p2->next;
}
while(p1!=nullptr)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p1->data;
r->next=q;
r=q;
p1=p1->next;
}
r->next=nullptr;
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=nullptr;
r=str;
if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
{
printf("参数错误!\n");
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!=nullptr)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=nullptr;
return str;
}
LinkStrNode *RepStr(LinkStrNode *s,int i,int j,LinkStrNode *t)
{
int k;
LinkStrNode *str,*p1=s->next,*p2=t->next,*q,*r;
str=(LinkStrNode*)malloc(sizeof(LinkStrNode));
str->next=nullptr;
r=str;
if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
{
printf("参数错误!\n");
return str;
}
for(k=1;k<i;k++)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p1->data;
r->next=q;
r=q;
p1=p1->next;
}
for(k=0;k<j;k++)
p1=p1->next;
while(p2!=nullptr)
while(p2!=nullptr)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p2->data;
r->next=q;
r=q;
p2=p2->next;
}
while(p1!=nullptr)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p1->data;
r->next=q;
r=q;
p1=p1->next;
}
r->next=nullptr;
return str;
}
bool DispStr(LinkStrNode *s)
{
if(s==nullptr)
{
printf("链串不存在!\n");
return false;
}
LinkStrNode *p=s->next;
while(p!=nullptr)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
return true;
}
void exp()
{
char str1[]="abcdefghijklmn",str2[]="xyz";
LinkStrNode *s,*s1,*s2,*s3,*s4;
StrAssign(s,str1);
StrAssign(s1,str2);
printf("\ns=");
DispStr(s);
printf("\n串s的长度为%d\n", StrLength(s));
s2=InsStr(s,9,s1);
printf("\n在串s的第9个字符位置插入串s1而产生s2为 ");
DispStr(s2);
DestroyStr(s2);
s2=DelStr(s,2,5);
printf("\n删除串s的第2个字符开始的5个字符而产生串s2为 ");
DispStr(s2);
DestroyStr(s2);
s2=RepStr(s,2,5,s1);
printf("\n将串s的第2个字符开始的5个字符替换成串是而产生串s2为 ");
DispStr(s2);
s3=SubStr(s,2,10);
printf("\n提取串s的第2个字符开始的10个字符而产生串s3为 ");
DispStr(s3);
s4=Concat(s1,s2);
printf("\n将串s1和串s2连接起来而产生的串s4为 ");
DispStr(s4);
DestroyStr(s);
DestroyStr(s2);
DestroyStr(s3);
DestroyStr(s4);
system("pause");
}
exp4-3
//
// Created by Snow on 2023/3/22.
//
#include<cstdio>
#include<windows.h>
#define MaxSize 50
typedef struct
{
char data[MaxSize];
int length;
}SqString;
void StrAssign(SqString &s,char const str[])
{
int i;
for(i=0;str[i]!='\0';i++)
s.data[i]=str[i];
s.length=i;
}
void DispStr(SqString s)
{
int i;
if(s.length>0)
{
for(i=0;i<s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
else
printf("空串!\n");
}
//BF算法
int BF(SqString s,SqString t)
{
int i=0,j=0;
while(i<s.length&&j<t.length)
{
if(s.data[i]==t.data[j])
{
j++;
i++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j>=t.length)
return(i-t.length);
else
return -1;
}
//KMP算法
void GetNext(SqString t,int next[])
{
int j=0,k=-1;
next[0]=-1;
while(j<t.length)
{
if(k==-1||t.data[j]==t.data[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
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;
}
//进阶KMP
void GetNextval(SqString t,int nextval[])
{
int 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];
}
}
int KMPIndex1(SqString s,SqString t)
{
int nextval[MaxSize],i=0,j=0;
GetNextval(t,nextval);
while(i<s.length&&j<t.length)
{
if(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()
{
char str[]="abcabcdabcdeabcdefabcdefg",arr[]="abcdeabcdefab";
SqString s,t;
StrAssign(s,str);
StrAssign(t,arr);
printf("建立目标串s和模式串t\n");
printf("s= ");
DispStr(s);
printf("t= ");
DispStr(t);
printf("BF算法得出位置为:%d\n",BF(s,t));
printf("KMP算法得出位置为:%d\n",KMPIndex(s,t));
printf("进阶KMP算法得出位置为:%d\n", KMPIndex1(s,t));
}
GBK编码