标题:想问数据结构中几个疑惑的问题
只看楼主
309705759
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-11-6
 问题点数:0 回复次数:1 
想问数据结构中几个疑惑的问题

1。关于以&打头的参数为引用参数。我经常看见类如:
int index(sstring &s,sstring t,int pos) //取自串的简单模式匹配
concat(sstring &t,sstring s1,sstring s2) //用定长顺序储存表示的串连接操作
这样的代码,其中sstring类型的s,t,s1,s2应该都是引用参数啊,为什么只有s和t加上了"&"?都不加行吗?

2.类似如下代码:
int initlist_sq(sqlist &l)
{
l.elem=(int *)malloc(list_init_size*sizeof(int));
if(!l.elem)
exit(overflow);
l.length=0;
l.listsize=list_init_size;
return ok;
}
在动态分配内存之后有: if(!l.elem) exit(overflow);其中 if(!l.elem) 用书面的语言来说到底什么意思啊?


3。在做串的实验遇到些问题比如
cout<<"输入S1的长度:"<<endl;
scanf("%d",&s1[0]);
要是想把scanf改成cin,后面我该怎么写?





以上相关代码如下:
串的简单模式匹配:
#include<iostream.h>
#include<stdio.h>
#define maxstrlen 255
typedef unsigned char sstring[maxstrlen+1];
int index(sstring &s,sstring t,int pos)
{
int i,j;
i=pos;
j=1;
while(i<=s[0]&&j<=t[0])
{
if(s[i]==t[j])
{
++i;
++j;
}
else
{
i=i-j+2;//**
j=1;
}
}
if(j>t[0])
{
return i-t[0];//**
}
else
{
return 0;
}
}

//////////////////
void main()
{
int re,i,pos;
sstring s1,s2;
cout<<"输入S1的长度:"<<endl;
scanf("%d",&s1[0]);
cout<<"输入S1的数据:"<<endl;
for(i=1;i<=s1[0];i++)
{
cin>>s1[i];
}
cout<<"输入模式串的长度:"<<endl;
scanf("%d",&s2[0]);
cout<<"输入S2的数据:"<<endl;
for(i=1;i<=s2[0];i++)
{
cin>>s2[i];
}
cout<<"输入开始匹配的位置:"<<endl;
cin>>pos;
re=index(s1,s2,pos);
if(re!=0)
{
cout<<"从s1的第"<<re<<"位开始匹配成功!"<<endl;
}
else
{
cout<<"没有发现可以匹配的串!"<<endl;
}
}





用定长顺序储存表示的串连接操作:
#include <stdio.h>
#include <iostream.h>
#define maxstrlen 255///////定义串最大长度
#define true 1
#define false 0
typedef unsigned char sstring[maxstrlen+1];
concat(sstring &t,sstring s1,sstring s2)
{
//concat为自定义的串连接函数;既将s1与s2连接为串t
int i,uncut;
if (s1[0]+s2[0]<=maxstrlen)
{
for(i=1;i<=s1[0];i++)
{
t[i]=s1[i];
}
for(i=s1[0]+1;i<=s1[0]+s2[0];i++)
{
t[i]=s2[i-s1[0]];
}
t[0]=s1[0]+s2[0];
uncut=true;
}
else
if (s1[0]<maxstrlen)
{
for(i=1;i<=s1[0];i++)
{
t[i]=s1[i];
}
for(i=s1[0]+1;i<=maxstrlen;i++)
{
t[i]=s2[i-s1[0]];
}
t[0]=maxstrlen;
uncut=false;
}
else
{
for(i=1;i<=s1[0];i++)
t[i]=s1[i];
uncut=false;
}
return uncut;
}
////////////////////////////
void main()
{
sstring st1,st2,t;
int i,len;
cout<<"输入串1的长度:"<<endl;
scanf("%d",&st1[0]);///////////////////????????????????
cout<<"输入串1的数据:"<<endl;

for(i=1;i<=st1[0];i++)
{
cin>>st1[i];
}
cout<<"输入串2的长度:"<<endl;
scanf("%d",&st2[0]);/////////////////??????????????????
cout<<"输入串2的数据:"<<endl;

for(i=1;i<=st2[0];i++)
{
cin>>st2[i];
}
len=concat(t,st1,st2);
if(len!=0)//////////串没有切断过
{
cout<<"新的串的长度是:"<<t[0]<<endl;//????
cout<<"新的串的数据为:"<<endl;
for(i=1;i<=t[0];i++)
{
cout<<t[i];
}
}
else
{
cout<<"串有部分被切断:"<<"这个串为:"<<endl;
for(i=1;i<=t[0];i++)
{
cout<<t[i];
}
}
}

搜索更多相关主题的帖子: 数据结构 int sstring 参数 
2005-11-24 17:50
fool_man
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2005-12-5
得分:0 
&打头的参数为引用参数,引用就是别名,也就是说这种定义时,如果对引用做改变会引起该变量的数值的改变,
以concat(sstring &t,sstring s1,sstring s2) 为例
将S1,S2连接后放到t中,实际上S1,S2不需要做值的改变,因此不需要引用类型;而串t的值需要由初始值变为S1S2连接后得出的串,故此需用引用类型
引用类型实际上是为了进行数值传递而在这里使用

较为简单的判别是否使用引用类型的方法,是看该变量的值是否改变,改变后是否需要传回主函数,如果需要则使用引用类型,否则只将值传递到函数内而不需要传出的话,那么不需要使用引用类型。

在tc中因为不存在引用类型所以使用的是指针,在某些教材里面是用的*t,其实功能和引用是一样的,引用和指针都是有数据传入也有传出,而其他的没有传出数据

因为l.elem=(int *)malloc(list_init_size*sizeof(int));为分配空间
如果分配成功则l.elem是该存储空间的首地址。

if(!l.elem)
exit(overflow);
实际用处就是如果分配空间失败则退出 ,

cout<<"输入S1的长度:"<<endl;
scanf("%d",&s1[0])???

你在下面不是写了 cin>>s1[i]么?
cin>>s1[0];?
2005-12-05 22:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-35041-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.182568 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved