王彬第六次上机实验报告.docx
《王彬第六次上机实验报告.docx》由会员分享,可在线阅读,更多相关《王彬第六次上机实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
王彬第六次上机实验报告
上机实验报告
实验名称
串的运行
系
信管系
姓名
王彬
任课教师
1、实验目的
(1)掌握函数的定义方法、调用方法、参数说明以及返回值;
2、实验内容
(1)编辑、编译、运行实验指导中给出的程序,并分析输出结果。
3、算法描述
4源程序
5#include
6#include
7#defineOVERFLOW-1
8#defineOK1
9#defineERROR0
10typedefintstatus;
11typedefstruct
12{
13char*ch;//按串长分配存储空间
14intlength;//存放串长
15}sstring;
16statusinitstring(sstring&s)
17{//初始化串,堆存储方式
18s.ch=(char*)malloc(sizeof(char));
19if(!
s.ch)returnERROR;//分配存储空间失败
20s.ch=NULL;
21s.length=0;//串长为0
22returnOK;
23}
24statusstrassign(sstring&s,char*chars)
25{//串赋值
26inti=0,j;
27if(s.ch)free(s.ch);
28while(chars[i]!
='\0')
29{
30i++;
31}//求串的长度
32s.ch=(char*)malloc(i*sizeof(char));
33if(!
s.ch)returnERROR;
34for(j=0;j
35{
36s.ch[j]=chars[j];
37}
38s.length=i;
39returnOK;
40}
41statusgetlength(sstrings,int&len)
42{//求串长
43len=s.length;
44returnlen;
45}
46statusinsert(sstring&s1,sstrings2,intpos)
47{//在字符串s1的第pos个字符之前插入字符串s2,并显示
48intj,k;
49if(pos<1||pos>s1.length+1)
50{//pos不合法
51printf("theposisawrongvalue\n");
52returnERROR;
53}
54s1.ch=(char*)realloc(s1.ch,(s1.length+s2.length)*sizeof(char));
55if(!
s1.ch)
56returnERROR;//空间分配失败
57for(j=s1.length-1,k=s1.length+s2.length-1;j>=pos-1;j--)
58{//字符串后移
59s1.ch[k]=s1.ch[j];
60k--;
61}
62for(j=s2.length-1;j>=0;j--)
63{
64s1.ch[k]=s2.ch[j];
65k--;
66}
67s1.length+=s2.length;
68printf("thenewstrings1is%s\n",s1.ch);
69returnOK;
70}
71statusdelstr(sstring&s,intpos,intj)
72{//在串s中删除从第pos个字符起长度为j的字串(此处不显示删除的字串)
73inti,k=pos,m=pos-1;
74if(pos<1||pos+j-1>s.length)
75{
76printf("参数不合法\n");
77returnERROR;
78}
79for(i=k+j-1;i<=s.length-1;i++)
80{
81s.ch[m]=s.ch[i];
82m++;
83}
84s.ch[m]='\0';
85printf("thenewstringsis%s\n",s.ch);
86returnOK;
87}
88intstrcompare(sstrings,sstrings1)
89{//比较串s和s1的大小,如果s>s1,则返回正数;如果s=s1,则返回0;如果s90inti;
91for(i=0;i92{
93if(s.ch[i]!
=s1.ch[i])
94returns.ch[i]-s1.ch[i];
95}
96returns.length-s1.length;
97}
98statusconcat(sstring&t,sstrings,sstrings1)
99{//由串t返回串s和s1联接而成的新串,并显示
100inti,j;
101t.ch=(char*)malloc((s.length+s1.length)*sizeof(char));
102if(!
t.ch)returnERROR;
103for(i=0;i104{
105t.ch[i]=s.ch[i];
106}
107for(i=s.length,j=0;j108{
109t.ch[i]=s1.ch[j];
110}
111t.ch[i]='\0';
112t.length=s.length+s1.length;
113printf("thestringtis%s\n",t.ch);
114returnOK;
115}
116statussubstr(sstring&sub,sstrings,intpos,intl)
117{//求出串s第pos个字符起长为l的字串,并用sub返回
118inti,j=0;
119if(pos<1||pos>s.length||l<1||pos+l-1>s.length)
120{
121printf("参数不合法\n");
122returnERROR;
123}
124sub.ch=(char*)malloc(l*sizeof(char));
125if(!
sub.ch)returnERROR;
126for(i=pos;i<=pos+l-1;i++,j++)
127sub.ch[j]=s.ch[i-1];
128sub.length=l;
129printf("thestringsubis%s\n",sub.ch);
130returnOK;
131}
132voidgetnext(sstringt,intnext[])
133{//求串t的next函数,并存入数组next
134inti=0,j=-1;
135next[0]=-1;
136while(i137{
138if(j==-1||t.ch[i]==t.ch[j])
139{
140++i;++j;next[i]=j;
141}
142elsej=next[j];
143}
144}
145intKMPindex(sstrings,sstringt)
146{//KMP算法,其中s为主串,t为子串
147intnext[50],i=0,j=0,v;
148getnext(t,next);
149while(i150{
151if(j==-1||s.ch[i]==t.ch[j])
152{
153i++;j++;
154}
155elsej=next[j];
156}
157if(j>=t.length)
158v=i-t.length;
159else
160v=-1;
161returnv;
162}
163voidmain()
164{
165sstrings1,s2,t,sub;
166charstr[50];
167intpos,len,next[50],j,v,l;
168initstring(s1);
169printf("**************初始化完毕**************\n");
170
171
172printf("*************字符串s1赋初值*************\n");
173printf("pleaseinputthechars\n");
174scanf("%s",str);
175strassign(s1,str);//字符串赋初值
176
177
178printf("*************输出字符串s1*************\n");
179printf("thestrings1is%s\n",s1.ch);//输出字符串
180printf("************字符串s1的长度为************\n");
181len=getlength(s1,len);
182printf("thelengthofthestrings1is%d\n",len);
183printf("*************字符串s2赋初值*************\n");
184initstring(s2);
185printf("pleaseinputthechars\n");
186scanf("%s",str);
187strassign(s2,str);//字符串赋初值
188printf("*************输出字符串s2*************\n");
189printf("thestrings2is%s\n",s2.ch);//输出字符串
190
191
192printf("*************字符串的插入**************\n");
193printf("在字符串s1的第pos个位置之前插入字符串s2,pos=");scanf("%d",&pos);
194printf("\n");
195insert(s1,s2,pos);
196
197
198printf("*************字符串的删除*************\n");
199printf("删除字符串s2第pos个字符起长为j的字符串\n");
200printf("pos=");scanf("%d",&pos);printf("j=");scanf("%d",&j);
201delstr(s2,pos,j);//串删除
202printf("***************串比较******************\n");
203if(strcompare(s1,s2)>0)//串比较
204printf("s1>s2\n");
205else
206if(strcompare(s1,s2)==0)
207printf("s1=s2\n");
208else
209printf("s1210printf("***************串的合并******************\n");
211printf("将串s1,s2合并于串t后\n");
212initstring(t);
213concat(t,s1,s2);
214printf("***************取子串******************\n");
215printf("取出字符串s1第pos个字符起长为l的子串\n");
216printf("pos=");scanf("%d",&pos);
217printf("l=");scanf("%d",&l);
218substr(sub,s1,pos,l);
219printf("***************求模式串的next******************\n");
220printf("thenextofthestringis");
221getnext(s1,next);
222for(j=0;j223{
224printf("%d",next[j]);
225}
226printf("\n");
227printf("***************串的模式匹配******************\n");
228v=KMPindex(s1,s2);
229if(v!
=-1)
230printf("从主串的第%d个字符起,匹配成功!
\n",v+1);
231else
232printf("匹配失败!
主串中没有与模式串匹配的子串\n");
233
234}
235#include
236#include
237#defineOVERFLOW-1
238#defineOK1
239#defineERROR0
240typedefintstatus;
241typedefstruct
242{
243char*ch;//按串长分配存储空间
244intlength;//存放串长
245}sstring;
246statusinitstring(sstring&s)
247{//初始化串,堆存储方式
248s.ch=(char*)malloc(sizeof(char));
249if(!
s.ch)returnERROR;//分配存储空间失败
250s.ch=NULL;
251s.length=0;//串长为0
252returnOK;
253}
254statusstrassign(sstring&s,char*chars)
255{//串赋值
256inti=0,j;
257if(s.ch)free(s.ch);
258while(chars[i]!
='\0')
259{
260i++;
261}//求串的长度
262s.ch=(char*)malloc(i*sizeof(char));
263if(!
s.ch)returnERROR;
264for(j=0;j
265{
266s.ch[j]=chars[j];
267}
268s.length=i;
269returnOK;
270}
271statusgetlength(sstrings,int&len)
272{//求串长
273len=s.length;
274returnlen;
275}
276statusinsert(sstring&s1,sstrings2,intpos)
277{//在字符串s1的第pos个字符之前插入字符串s2,并显示
278intj,k;
279if(pos<1||pos>s1.length+1)
280{//pos不合法
281printf("theposisawrongvalue\n");
282returnERROR;
283}
284s1.ch=(char*)realloc(s1.ch,(s1.length+s2.length)*sizeof(char));
285if(!
s1.ch)
286returnERROR;//空间分配失败
287for(j=s1.length-1,k=s1.length+s2.length-1;j>=pos-1;j--)
288{//字符串后移
289s1.ch[k]=s1.ch[j];
290k--;
291}
292for(j=s2.length-1;j>=0;j--)
293{
294s1.ch[k]=s2.ch[j];
295k--;
296}
297s1.length+=s2.length;
298printf("thenewstrings1is%s\n",s1.ch);
299returnOK;
300}
301statusdelstr(sstring&s,intpos,intj)
302{//在串s中删除从第pos个字符起长度为j的字串(此处不显示删除的字串)
303inti,k=pos,m=pos-1;
304if(pos<1||pos+j-1>s.length)
305{
306printf("参数不合法\n");
307returnERROR;
308}
309for(i=k+j-1;i<=s.length-1;i++)
310{
311s.ch[m]=s.ch[i];
312m++;
313}
314s.ch[m]='\0';
315printf("thenewstringsis%s\n",s.ch);
316returnOK;
317}
318intstrcompare(sstrings,sstrings1)
319{//比较串s和s1的大小,如果s>s1,则返回正数;如果s=s1,则返回0;如果s320inti;
321for(i=0;i322{
323if(s.ch[i]!
=s1.ch[i])
324returns.ch[i]-s1.ch[i];
325}
326returns.length-s1.length;
327}
328statusconcat(sstring&t,sstrings,sstrings1)
329{//由串t返回串s和s1联接而成的新串,并显示
330inti,j;
331t.ch=(char*)malloc((s.length+s1.length)*sizeof(char));
332if(!
t.ch)returnERROR;
333for(i=0;i334{
335t.ch[i]=s.ch[i];
336}
337for(i=s.length,j=0;j338{
339t.ch[i]=s1.ch[j];
340}
341t.ch[i]='\0';
342t.length=s.length+s1.length;
343printf("thestringtis%s\n",t.ch);
344returnOK;
345}
346statussubstr(sstring&sub,sstrings,intpos,intl)
347{//求出串s第pos个字符起长为l的字串,并用sub返回
348inti,j=0;
349if(pos<1||pos>s.length||l<1||pos+l-1>s.length)
350{
351printf("参数不合法\n");
352returnERROR;
353}
354sub.ch=(char*)malloc(l*sizeof(char));
355if(!
sub.ch)returnERROR;
356for(i=pos;i<=pos+l-1;i++,j++)
357sub.ch[j]=s.ch[i-1];
358sub.length=l;
359printf("thestringsubis%s\n",sub.ch);
360returnOK;
361}
362voidgetnext(sstringt,intnext[])
363{//求串t的next函数,并存入数组next
364inti=0,j=-1;
365next[0]=-1;
366while(i367{
368if(j==-1||t.ch[i]==t.ch[j])
369{
370++i;++j;next[i]=j;
371}
372elsej=next[j];
373}
374}
375intKMPindex(sstrings,sstringt)
376{//KMP算法,其中s为主串,t为子串
377intnext[50],i=0,j=0,v;
378getnext(t,next);
379while(i380{
381if(j==-1||s.ch[i]==t.ch[j])
382{
383i++;j++;
384}
385elsej=next[j];
386}
387if(j>=t.length)
388v=i-t.length;
389else
390v=-1;
391returnv;
392}
393voidmain()
394{
395sstrings1,s2,t,sub;
396charstr[50];
397intpos,len,next[50],j,v,l;
398initstring(s1);
399printf("**************初始化完毕**************\n");
400
401
402printf("*************字符串s1赋初值*************\n");
403printf("pleaseinputthechars\n");
404scanf("