数据结构栈和队列的基本操作.docx
《数据结构栈和队列的基本操作.docx》由会员分享,可在线阅读,更多相关《数据结构栈和队列的基本操作.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构栈和队列的基本操作
《数据结构》课程实验实训报告
实验名称
串
实验序号
学号
姓名
班级
实验日期
2014-12-13
指导教师
成绩
一、实验目的和要求
目的:
掌握栈和队列数据结构的描述,学会针对栈和队列的基本操作。
要求:
实验前了解C语言结构化程序设计思想,结构体及指针的应用。
二、实验具体内容及步骤
1.完成课本p76-P78串的定长顺序存储代码输入和调试。
2.利用以上串的定长顺序存储代码,实现串的模式匹配算法(p83)。
3.利用以上代码,编写算法,从串s中删除所有和串t相同的子串,串采用定长顺序存储。
4.完成课本p79-P81串的堆分配存储代码输入和调试。
5.利用题4代码,编写算法,实现串的基本操作Replace(&S,T,V),串采用堆分配存储。
三、实验结果与分析(程序代码按序粘贴在下面,补充的代码用红色加粗显示,并将运行结果截图)
1.
#include"stdio.h"
#definemaxsize100
typedefstruct
{
charstr[maxsize];
intlen;
}seqstring;
//2.求串的长度
intlenstr(seqstring*s)
{
inti=0;
while(s->str[i]!
='\0')
i++;
returni;
}
//1.创建字符串
seqstring*cseatestr(seqstring*s)
{
gets(s->str);
s->len=lenstr(s);
returns;
}
//3.串连接
voidconcatstr(seqstring*r1,seqstring*r2)
{
inti;
if(r1->len+r2->len>maxsize)
printf("两个串太长,溢出!
");
else
{
for(i=0;ilen;i++)
r1->str[r1->len+i]=r2->str[i];
r1->str[r1->len+i]='\0';
r1->len=r1->len+r2->len;
}
}
//4.求子串
voidsubstr(seqstring*r,inti,intj)
{
seqstring*r1;
intk;
if(i+j-1>r->len)
{
printf("子串超界");
return;
}
else
{
for(k=0;kr1->str[k]=r->str[i+k-1];
r1->len=j;
r1->str[r1->len]='\0';
}
printf("取出字符为:
");
puts(r1->str);
}
//5.串相等的比较
intequalstr(seqstring*r1,seqstring*r2)
{
inti;
for(i=0;ilen&&ilen;i++)
if(r1->str[i]!
=r2->str[i])
return(r1->str[i]-r2->str[i]);
return(r1->len-r1->len);
}
//6.插入子串
seqstring*insstr(seqstring*s,seqstring*s1,inti)
{
intk;
if(i>=s->len||s->len+s1->len>maxsize)
printf("\n不能插入!
\n");
else
{
for(k=s->len-1;k>=i;k--)
s->str[s1->len+k]=s->str[k];
for(k=0;klen;k++)
s->str[i+k]=s1->str[k];
s->len=s->len+s1->len;
s->str[s->len]='\0';
}
returns;
}
//7.删除子串
voiddelstr(seqstring*r,inti,intj)
{
intk;
if(i+j-1>r->len)
printf("所要删除的子串超界!
");
else
{
for(k=i+j;klen;k++,i++)
r->str[i]=r->str[k];
r->len=r->len-j;
r->str[r->len]='\0';
}
}
voidmain(){}
2.
#include"stdio.h"
#include"string.h"
#definemaxsize100
typedefstruct
{
charstr[maxsize];
intlen;
}seqstring;
intindex(seqstrings,seqstringt)
{
inti,j,k,m,n;
m=s.len;
n=t.len;
i=0,k=0;
while((i<=m-n)&&(!
k))
{
j=0,k=1;
while((j<=n-1)&&k)
if(t.str[j]==s.str[i+j])
j++;
else
k=0;++i;
}
if(k)
returni-1;
else
return-1;
}
voidmain()
{
seqstrings,t;
intsum;
printf("请输入主串s:
");
scanf("%s",s.str);
s.len=strlen(s.str);
printf("请输入所需查找的子串t:
");
scanf("%s",t.str);
t.len=strlen(t.str);
sum=index(s,t);
printf("\n");
if(sum==-1)
printf("nofound\n");
else
printf("所需查找子串第一次出现的位置是:
%d",sum+1);
}
3.
#include
#include
#defineMaxsize20
typedefstruct
{
chardata[Maxsize];
intlength;
}SqString;
voidInitString(SqString*&S)
{
S=(SqString*)malloc(sizeof(SqString));
S->length=0;
}
voidCreateString(SqString*&S,charstr[])//初始化字符串
{
inti=0;
printf("创建一个字符串:
\n");
for(i=0;str[i]!
='\0';i++)
{
S->data[i]=str[i];
printf("%c",S->data[i]);
}
S->data[i]='\0';
S->length=i;
printf("\n当前字符串长度:
%d\n",S->length);
}
voidDeleteString(SqString*S)//删除部分字符串
{
SqString*str;
str=(SqString*)malloc(sizeof(SqString));
str->length=0;
inti=0,j=0;
inttemp;
i=rand()%(S->length);
j=rand()%(S->length);
if(i>j)
{
temp=i;
i=j;
j=temp;
}
str->length=S->length-(j-i+1);
j=j+1;
for(intk=0;k
{
str->data[k]=S->data[k];
}
for(k=0;S->data[j+k]!
='\0';k++)
{
str->data[i+k]=S->data[k+j];
}
str->data[i+k]='\0';
printf("当前所删除部分子字符串后的新字符串为:
%s\n其长度为:
%d\n",str->data,str->length);
}
intmain(void)
{
srand((unsigned)time(NULL));
SqString*S;
charstr[25];
printf("请输入任意一个字符串:
\n");
scanf("%s",str);
InitString(S);
CreateString(S,str);
DeleteString(S);
return0;
}
4.
#include"stdio.h"
#include"stdlib.h"
#definenull0
typedefstruct
{
char*str;
intlen;
}hstring;
//1.串的赋值
intstringassgin(hstring*s,char*r)
{
intlen,i=0;
if(s->str!
=null)
free(s->str);
while(r[i]!
='\0')i++;
len=i;
if(len!
=0)
{
s->str=(char*)malloc(len);
if(s->str==null)return(0);
for(i=0;is->str[i]=r[i];
}
elses->str=null;
s->len=len;
return
(1);
}
//2.判断串是否为空
intstringempty(hstring*s)
{
if(s->len==0)return
(1);
elsereturn(0);
}
//3.求串的长度
intlength(hstring*s)
{
returns->len;
}
//4.串连接
hstring*concat(hstring*s1,hstring*s2)
{
intlen,i;
hstring*s;
stringassgin(s,s1->str);
len=s1->len+s2->len;
free(s1->str);
s1->str=(char*)malloc((len+1)*sizeof(char));
if(!
s1)return(0);
for(i=0;i=s->len;i++)
s1->str[i]=s->str[i];
for(i=s->len;ilen+s2->len;i++)
s1->str[i]=s2->str[i-s->len];
s1->len=s->len+s2->len;
free(s);
return(s1);
}
//5.串的插入函数
intstringinsert(hstring*s,intpos,hstring*t)
{
inti;
char*temp;
if(pos<0||pos>s->len||s->len==0)return(0);
temp=(char*)malloc(s->len+t->len);
if(temp==null)return(0);
for(i=0;itemp[i]=s->str[i];
for(i=0;ilen;i++)
temp[i+pos]=s->str[i];
for(i=pos;ilen;i++)
temp[i+t->len]=s->str[i];
s->len+=t->len;
free(s->str);
s->str=temp;
return
(1);
}
//6.删除子串函数
intstrdelete(hstring*s,intpos,intlen)
{
inti;
char*temp;
if(pos<0||pos>(s->len-len))
return(0);
temp=(char*)malloc(s->len-len);
if(temp==null)
return(0);
for(i=0;itemp[i]=s->str[i+len];
s->len=s->len-len;
free(s->str);
s->str=temp;
return
(1);
}
//7.串的定位
intindex(hstring*s1,hstring*s2)
{
intlen1,len2;
inti,j;
len1=length(s1);len2=length(s2);
i=0,j=0;
while(i{
if(s1->str[i]==s2->str[j])
{
i++;
j++;
}
else
i=i-j+1;j=0;
}
if(j==len2)returni-len2+1;
elsereturn0;
}
voidmain(){}
5.
#include"stdio.h"
#include"string.h"
Replace(char*S,intstart,char*T,char*V)
{
inti,j,k,l,n,m,s,count=0,signal=0;
n=strlen(T);/*求字符串长度*/
m=strlen(V);
s=strlen(S);
for(i=start-1;S[i]!
='\0';i++)/*开始查找*/
{k=i;
j=0;
while(S[k]==T[j])/*与子串T对比*/
{
k++;
j++;
}
if(T[j]=='\0')/*判断是否T存在*/
{
if(m-n>0)/*第一种情况,字符串V比T长的情况下*/
{
for(l=s+(m-n)*(count+1)-1;l>=k;l--)
S[l]=S[l-m+n];
for(l=k-n,j=0;jS[l]=V[j];
count++;
}
elseif(m-n<0)/*第二种情况,字符串V比T短的情况下*/
{
for(l=k-n,j=0;jS[l]=V[j];
for(;l
S[l]=S[l+n-m];
count++;
}
else/*第三种情况,T和V一样长*/
{
for(l=k-1;l>=k-n;l--,j--)
S[l]=V[j-1];
}
signal=1;
}
}
S[s+(m-n)*count]='\0';
if(signal)return1;/*返回值*/
elsereturn0;
}
voidmain()
{
chara[100],b[100],c[100];
intn;
printf("请输入字符串S:
");
gets(a);
printf("请输入查找的子串T:
");
gets(b);
printf("请输入替换的子串V:
");
gets(c);
printf("请输入开始查找的位置start:
");
scanf("%d",&n);
if(Replace(a,n,b,c))
printf("替换后的结果是:
%s\n",a);
else
printf("S中不存在子串T!
\n");
}
四、指导老师评语
指导老师签名: