《數(shù)據(jù)結(jié)構(gòu)教程習(xí)題答案 李蓉蓉 安楊等編著第三版 第四章練習(xí)題答案》由會(huì)員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)教程習(xí)題答案 李蓉蓉 安楊等編著第三版 第四章練習(xí)題答案(9頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、4.1
/*********************************************
題目:采用順序結(jié)構(gòu)存儲(chǔ)串,編寫(xiě)一個(gè)實(shí)現(xiàn)串通配符匹配的算法,pattern_index()其中的通配符只有“?”它可以和任意一字符匹配成功,例如pattern_index("?re", "there are")返回的結(jié)果是2
實(shí)踐;狼影
時(shí)間:2012.9.23
************************************************************/
/*********************************************
2、*
若發(fā)現(xiàn)源碼有錯(cuò)或高人有更好的方式,請(qǐng)留言本人的空間,你的留言將是對(duì)我學(xué)習(xí)的最大幫助,感激不盡
******************************************************/
# include
# include
# include
# define size 256
typedef struct
{
char string[size];
int length;
}STRING;
//函數(shù)的聲明
STRING *init_string(void);
3、
void creat_string(STRING *st);
int pattern_index(STRING *t, STRING *s);
main()
{
STRING *s, *t;
int n;
s = init_string();
t = init_string();
//輸入字符串
printf("輸入主串,\n");
creat_string(s);
fflush(stdin);
printf("輸入模式串\n");
creat_string(t);
n = pattern_index(t, s);
if
4、(0 == n)
printf("沒(méi)有匹配的字符串\n");
else
printf("匹配的有%d個(gè)\n", n);
}
//初始化字符串
STRING *init_string(void)
{
STRING *st;
st = (STRING *)malloc(sizeof(STRING));
if(NULL == st)
{
printf("內(nèi)存分配錯(cuò)誤\n");
exit(-1);
}
st->length = 0;
return st;
}
//輸入字符串
void creat_string(STRI
5、NG *st)
{
gets(st->string);
st->length = strlen(st->string);
}
//字符串匹配
int pattern_index(STRING *t, STRING *s)
{
int i = 0, j = 0;
int n = 0;
while(ilength)
{
if(s->string[i] == t->string[j] || '?' == t->string[j])
{
i++;
j++;
}
else
{
i = i-j+1
6、;
j = 0;
}
//計(jì)算符合要求字串的個(gè)數(shù)
if(j>=t->length)
{
n++;
j = 0;
}
}
return n;
}
/*********************************
輸入主串,
there are many boy are are
輸入模式串
?re
匹配的有4個(gè)
Press any key to continue
***********************************************/
4.2
/*****************
7、*******************
題目:有兩個(gè)串s1和s2,設(shè)計(jì)一個(gè)算法求一個(gè)這樣的串,該串的字符是s1和s2中公共字符
設(shè)計(jì);狼影
時(shí)間:2012.9.23
*****************************************/
/*****************************************************************************************
若發(fā)現(xiàn)源碼有錯(cuò),或高人有更好的方法,請(qǐng)?jiān)诒救税俣瓤臻g留言,感激不盡,,你的留言將是對(duì)我學(xué)習(xí)的最大幫助??!
******************
8、*******************************************************************/
# include
# include
# include
# define size 256
typedef struct
{
char string[size];
int length;
}STRING;
//函數(shù)的聲明
STRING *init_string(void);
void creat_string(STRING *st);
int
9、find_same(STRING *s1, STRING *s2, STRING *s3);
main()
{
STRING *s1, *s2, *s3;
int n;
//申請(qǐng)空間
s1 = init_string();
s2 = init_string();
s3 = init_string();
//輸入字符串
creat_string(s1);
fflush(stdin);
creat_string(s2);
//尋找相同的字符
n = find_same(s1, s2, s3);
if(0 != n)
{
10、 printf("相同的字符是\n");
printf("%s\n", s3->string);
}
else
printf("沒(méi)有相同的字符\n");
}
//初始化字符串
STRING *init_string(void)
{
STRING *st;
st = (STRING *)malloc(sizeof(STRING));
if(NULL == st)
{
printf("內(nèi)存分配錯(cuò)誤\n");
exit(-1);
}
st->length = 0;
return st;
}
//創(chuàng)建字符串
voi
11、d creat_string(STRING *st)
{
printf("輸入字符串\n");
gets(st->string);
st->length = strlen(st->string);
}
//發(fā)現(xiàn)相同的字符
int find_same(STRING *s1, STRING *s2, STRING *s3)
{
int i, j, k = 0, d;
int find = 0;
//下面的三重循環(huán)尋找相同的字符,并保證輸入的字符不重復(fù)有些麻煩,若有好的方法,希望告知!
for(i = 0; ilength; i++)
{
12、
for(j = 0; jlength; j++)
{
if(s1->string[i] == s2->string[j])
{
for(d = 0; d<=k; d++)
if(s3->string[d] == s1->string[i])
{
find = 1;
goto end;
}
s3->string[k++] = s1->string[i];
}
end: if(1 == find)
{
find = 0;
break;
13、 }
}
}
s3->string[k] = '\0';
return k;
}
/***********************************
輸入字符串
asdfghdffsafg
輸入字符串
asfd
相同的字符是
asdf
Press any key to continue
*****************************************************/
4.3
/***************************************
題目:設(shè)目標(biāo)串為t = 'abcaabbab
14、cabaacbacba' 模式p = 'abcabaa'
(1):計(jì)算p的nextval函數(shù)值
(2):不寫(xiě)算法,只畫(huà)出KMP算法進(jìn)行模式匹配時(shí),每一趟的匹配過(guò)程(?。〈祟},讀者自己去畫(huà),下面只是KMP算法的代碼實(shí)現(xiàn))
(課本上喲相關(guān)的畫(huà)法,大可參照課本111頁(yè)來(lái)畫(huà))
實(shí)踐;狼影
時(shí)間:2012.9.23
*****************************************/
/*************************************************
若發(fā)現(xiàn)源碼錯(cuò)誤,請(qǐng)?jiān)诒救税俣瓤臻g留言,你的留言將是對(duì)我學(xué)習(xí)的最大幫助
15、,感激不盡!!
*******************************************************************************/
# include
# include
# include
# define size 256
typedef struct
{
char string[size];
int length;
}STRING;
//函數(shù)的聲明
STRING *init_string(char *p);
int KMP(STRING
16、*s1, STRING *s2);
void call_nextval(STRING *s, int *nextval);
main()
{
STRING *s1, *s2;
int n;
char *t = "abcaabbabcabaacbacba";
char *p = "abcabaa";
//初始化字符數(shù)組
s1 = init_string(t);
s2 = init_string(p);
n = KMP(s1, s2);
if(-1 == n)
printf("沒(méi)有匹配的字串\n");
else
printf("
17、匹配字串起始的下標(biāo)是%d\n", n);
}
//初始化字符數(shù)組
STRING *init_string(char *p)
{
int i = 0;
STRING *st = (STRING *)malloc(sizeof(STRING));
if(NULL == st)
{
printf("內(nèi)存分配錯(cuò)誤\n");
exit(-1);
}
while(p[i] != '\0')
{
st->string[i] = p[i];
i++;
}
st->string[i] = '\0';
st->length = i;
18、return st;
}
//KMP算法的實(shí)現(xiàn)
int KMP(STRING *s1, STRING *s2)
{
int nextval[size];
int differ = 0;
int i = -1, j = -1;
call_nextval(s2, nextval);
while(ilength && jlength)
{
if(j == -1 || s1->string[i]==s2->string[j])
{
i++;
j++;
}
else
j = nextval[j
19、];
}
if(j>=s2->length)
return (i-s2->length);
else
return -1;
}
//求nextval數(shù)組
void call_nextval(STRING *s, int *nextval)
{
int i = 0, j = -1;
nextval[0] = -1;
//求nextval的值
while(ilength)
{
if(-1==j || s->string[i] == s->string[j])
{
i++; j++;
if(s->stri
20、ng[i] != s->string[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
//輸出nextval的值
printf("nextval的值是\n");
for(i = 0; ilength; i++)
{
printf("%d ", nextval[i]);
}
printf("\n");
}
/**********************************
nextval的值是
-1 0 0 -1 0 2 1
匹配字串起始的下標(biāo)是7
Press any key to continue
*************************************************/