串的基本操作演示实验报告
-
串的基本操作演示实验报告
学号:
姓名:
班级:
第
1
页
共
11
页
一.实验环境问题描述:
如果语
言没有把串作为一个预先定义好的基本类型对待,又需要用该语言写
一个涉及串操作的软
件系统时,用户必须自己实现串类型。试实现串类型,并写一
个串的基本操作的演示系统
。
基本要求:
在教科书
4.2.2
节用堆分配存储表示实现
HString<
/p>
串的最小操作子集的
基础上,
实现串抽象
数据类型的其余基本操作
(不使用
C
语
言本身提供的串函数)
。
参数合法性检查必须严格。
说明:
(在格式中,Φ表示
0
个、
1
个或多个空格所组
成的串。
〈串标识〉表示一个内部名或一个串文字。前者是一个串的唯
一标识,是
一种内部形式的(而不是字符形式的)标识符。后者是两端由单引号括起来的
仅可
打印字符组成的序列。串内每两个连续的单引号表示一个单引号符。
)
利用上述基本操作函数
构造以下系统:它是一个命令解释程序,循环往复地处理用
户键入的每一条命令,直至终
止程序的命令为止。命令定义如下:
(
1
)
p>
赋值。格式:
A
Φ〈串标识〉Φ〈回车〉<
/p>
用〈串标识〉所表示的值建立新串,
并显示新串的内部名和串值。如:
A
′
Hi
!′
(
2
)
判相等。
格式:
E
Φ〈串标识
1
〉Φ〈串标识
p>
2
〉Φ〈回车〉
若两串相等,则显示“
EQUAL
”<
/p>
,否则显示“
UNEQUAL
”
。
(
3
)
联接。
格式:
C
Φ〈串标识
1
〉Φ〈串标识
2
〉Φ〈回车〉
将两串联接产生结果串,它的内部名和串值都显示出来。
(
4
)
求长度
格式:
L
Φ〈串标识〉Φ〈回车〉
显示串的长度。
(
5
)
求子串
格式:
S
Φ〈串标识〉Φ
+
〈数
1
〉Φ
+
〈数
2
〉Φ〈回车〉
p>
如果参数合法,则显示子串的内部名和串值。
〈数〉不带正负号。<
/p>
(
6
)子串定位。
格式:
I
Φ〈串标识
1
〉Φ〈串标识
2
〉Φ〈回车〉
显示第二个串在第一个串中首次出现时的位置。
(
7
)串替换
格式:
R
Φ〈串标识
< br>1
〉Φ〈串标识
2
〉Φ〈串标识
2
〉Φ〈回车〉
将第一个串中出现所有出现的第二个串用第三个串替换,显示
结果串的内部名和串
值,原串不变。
(
0
)退出
格式:
Q
Φ〈回车〉
< br>
结束程序的运行。
二、实验内容
第
2
页
共
11
页
编
写一个程序,实现
顺序串
的各种基本运算,并在此基础上设计一
个主程序。具体如下:
编写栈的基本操作函数
顺序串类型定义如下所示:
typedef struct node
{
char data;
struct node
*next;
}linkstring;
(
1
)串赋值
Assign(s,t)
将一个字符串常量赋给串
s,
即生成一个其值等于
t
的串
s
(
2
)串复制
StrCopy(s,t)
将串
t<
/p>
赋给串
s
(
3
)计算串长度
StrLength(s)
返回串
s
中字符个数
(
4
)判断串相等
StrEqual(s,t)
若两个串
s
与
t
相等则返回
1
;否则返回
0
。
(
5
)串连接
Concat(s,t)
返回由两个串
s
和
t
连接在一起形成的新串。
(
6
)求子串
index(s,j)
返回找到串
t
在串
s
中的位置
(
7
)插入
InsStr
(s,i,t)
将串
t
插入到串
p>
s
的第
i(1
≤<
/p>
i
≤
StrLength(s)+1)<
/p>
个字符中
,
即将
t
的第一个字符作为
s
的第
i
个字符
,
并返回产生的
新串
(
8
)串删除
DelStr (s,i,j)
从串
s
中删去从第
i(1
≤
i
≤
StrLength(s))
个字符开始的长度为
j
的子串
,<
/p>
并返回产生的
新串。
(
9
)串替换
RepStr (s,s1,s2)
在串
s
中
,
将所有出现的子串
s1
均替换成
s2
。<
/p>
(
10
)输出
串
DispStr(s)
输出串
s<
/p>
的所有元素值
(
11
)判断串是否为空
IsEmpty(s)
(
12
)输入串
inputchuan(char
str[100],linkstring
*&s)
输入字符串
str
并将字符串传递给指针
串
s
三:程序
:
#include
#include
#include
typedef
struct node
{
char data;
struct node *next;
}linkstring;
void
assign(linkstring *&s,char t[])//
将字符串
p>
t
赋值给指针串
s,
并返回
s
第
3
页
共
11
页
{
int i=0;
linkstring *q,*tc;
s=(linkstring
*)malloc(sizeof(linkstring));
s->next=NULL;
tc=s;//tc
指向
s
串的最后一个结点
while(t[i]!='0')//
实现字符数组顺序赋值
到串
s
{
}
q=(linkstring
*)malloc(sizeof(linkstring));
q->data=t[i];
tc->next=q;//<
/p>
使得
s
中与
tc
同地址的
next
指向
q,
使
tc
与
q
相连接
tc=q;//tc
直接指向
q
i++;
tc->next=NULL;
}
void strcopy(linkstring *&s,linkstring
*t)//
将
t
串赋值给
s
串并返回
s
{
linkstring
*p=t->next,*q,*tc;
s=(linkstring
*)malloc(sizeof(linkstring));
s->next=NULL;
tc=s;//tc
指向
s
串的最后一个结点
while(p!=NULL)//
实现字符数组顺序赋值到串
s
{
}
q=(linkstring
*)malloc(sizeof(linkstring));
q->data=p->data;
tc->next=q;
//
使得
s
中与
tc
同地址的
next
指向
q,
使
tc
与
q
相连接
tc=q;//tc
直接指向
q
p=p->next;
tc->next=NULL;
}
int
strlength(linkstring *s)//
求
s
的长度
{
}
int n=0;
linkstring *p;
p=s->next;
while(p!=NULL)
{
n++;
p=p->next;
}
return n;
第
4
页
共
11
页
void dispstr(linkstring
*s)//
输出串
s
{
linkstring *p=s->next;
while(p!=NULL)
{
cout<
p=p->next;
}
cout<
}
int
strequal(linkstring *s,linkstring *t)//
判断
s
串和
t
串是否相等
{
linkstring *p,*q;
p=s->next;q=t->next;
while(p!=NULL&&q!=NULL)
{
if(p->data!=q->data)
{
return 0;
}
p=p->next;
q=q->next;
}
if(p!=NULL||q!=NULL)
{
}
return 0;
else
return 1;
}
linkstring
*concat(linkstring *s,linkstring *t)//
将
t
串连接到
s
串后
{
linkstring
*p,*q,*tc,*r;
r=(linkstring
*)malloc(sizeof(linkstring));
r->next=NULL;
tc=r;
p=s->next;
while(p!=NULL)
{
q=(linkstring
*)malloc(sizeof(linkstring));
q->data=p->data;
tc->next=q;
tc=q;
p=p->next;
第
5
页
共
11
页
-