C++BUILDER中去掉字符串中的空格用的什么函数?

peanut2008 2005-06-18 10:12:54
C++BUILDER中去掉字符串中的空格用的什么函数?
...全文
559 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
leonatcs 2005-06-18
  • 打赏
  • 举报
回复
#include <string>

std::string s = " sda df .";
char c = ' ';
int x;
while( (x=s.find(c)) >= 0 ) s.erase(x,1);
ShowMessage(AnsiString(s.c_str()));
zhouhaihe 2005-06-18
  • 打赏
  • 举报
回复
应该没有这个函数,自己写一个就可以了
void __fastcall TForm1::Button6Click(TObject *Sender)
{
String strTemp=" a bc dge dsd ";
for(int i=0;i<strTemp.Length();i++)
if(strTemp.SubString(i,1)!=" ")
Edit1->Text=Edit1->Text+strTemp.SubString(i,1);
}

Sylent 2005-06-18
  • 打赏
  • 举报
回复
自建一个这样的函数,将参数S的所有空格丢弃再返回.
AnsiString StringTrim(AnsiString S)
{
char *D = new char[S.Length()];
for (int i = 0; i < S.Length; i++)
{
if (S[i+1] != ' ') //不是空格的字符直接拷贝
D[i] = S[i+1];
}
AnsiString RetStr(D);
delete []D;
return RetStr;
}
peanut2008 2005-06-18
  • 打赏
  • 举报
回复
有没有把中间空格也去掉的函数?
guanshangming 2005-06-18
  • 打赏
  • 举报
回复
char *pBuf = " abcd ";
char cBuf[100];
String abc = pBuf;
strcpy(cBuf,abc.Trim().c_str());
guanshangming 2005-06-18
  • 打赏
  • 举报
回复
String Abc=" cccc ";
Abc = Abc.Trim();
纯冰糖 2005-06-18
  • 打赏
  • 举报
回复
ok,study
zjt621 2005-06-18
  • 打赏
  • 举报
回复
TO:UNSIGNED

好方法!
顶!
僵哥 2005-06-18
  • 打赏
  • 举报
回复
AnsiString s=" a d dsdf f ";
s=StringReplace(s," ","",TReplaceFlags()<<rfReplaceAll);
PrintDefineFont() 功能定义打印作业使用的字体,对每个打印作业PowerBuilder支持八种字体。 语法PrintDefineFont(printjobnumber,fontnumber,facename,height,weight,fontpitch,fontfamily, italic,underline) 参数printjobnumber:用PrintOpen()函数打开的打印作业号fontnumber:指定赋给当前定义字体的编号,有效值在1到8之间 facename:string类型,指定字体名称,该字体应该是你的打印机支持的字体,比如“宋体”height:Integer类型,使用正值指定字体的高度,以千分之一英寸为单位;使用负值指定字体点数,比如,-18代表18点。一般来说,使用点数更精确些weight:指定字体的磅数,正常字体为400磅,粗体为700磅fontpitch:FontPitch枚举类型,指定字体标准。有效取值为:Default! - 缺省值;Fixed! - 固定形式;Variable! - 可变形式fontfamily:FontFamily枚举类型,指定字体系列。有效取值为:AnyFont!、Decorative!、Modern!、Roman!、Script!、Swiss!italic:boolean类型,指定是否使用斜体样式。有效取值为:TRUE - 使用斜体样式;FALSE - 不使用斜体样式。缺省值为FALSEunderline:boolean类型,指定是否加下划线。有效取值为:TRUE - 加下划线;FALSE - 不加下划线。缺省值为FALSE返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintDefineFont()函数返回NULL。用法在一个打印作业,应用程序能够最多同时定义8种字体。当应用程序需要使用更多的字体时,可以在使用了某个字体号输出内容后使用PrintDefineFont()函数将该字体号对应的字体更换为其它字体。 -------------------------------------------------------------------------------- PrintLine() 功能在当前打印页上绘出指定厚度的一条线。 语法PrintLine ( printjobnumber, x1, y1, x2, y2, thickness ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号x1:integer类型,指定直线起点的x坐标,以千分之一英寸为单位y1:integer类型,指定直线起点的y坐标,以千分之一英寸为单位x2:integer类型,指定直线终点的x坐标,以千分之一英寸为单位y2:integer类型,指定直线终点的y坐标,以千分之一英寸为单位thickness:integer类型,指定直线的厚度,以千分之一英寸为单位返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintLine()函数返回NULL。用法应用程序执行了PrintLine()函数后,该函数并不改变打印光标的位置。 -------------------------------------------------------------------------------- PrintOpen() 功能启动打印作业并返回作业号。 语法PrintOpen ( { jobname } ) 参数jobname:string类型,可选项,指定要打开打印作业的名称,该名称将显示在打印管理器窗口返回值Long。函数执行成功时返回打印作业号,发生错误时返回-1。如果任何参数的值为NULL,PrintOpen()函数返回NULL。用法应用程序执行PrintOpen()函数后,启动新的打印作业并走纸到下一页,同时将打印机缺省字体设置为该打印作业的字体。打印光标的位置位于打印区的左上角。其它同组的打印函数使用PrintOpen()函数返回的作业号来标识作业。需要注意的是,使用PrintOpen()函数打开打印作业、使用同组的其它函数完成打印任务后,必须使用PrintClose()关闭打印作业,或根据需要使用PrintCancel()函数取消打印作业。 -------------------------------------------------------------------------------- PrintOval() 功能在指定位置以指定线宽绘制椭圆或圆。 语法PrintOval ( printjobnumber, x, y, width, height, thickness ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号x:integer类型,指定椭圆或圆外形框左上角的x坐标,以千分之一英寸为单位y:integer类型,指定椭圆或圆外形框左上角的y坐标,以千分之一英寸为单位width:integer类型,指定椭圆或圆外形框的宽度,以千分之一英寸为单位height:integer类型,指定椭圆或圆外形框的高度,以千分之一英寸为单位thickness:integer类型,指定椭圆或圆外边线的厚度,以千分之一英寸为单位返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintOval()函数返回NULL。用法应用程序执行了PrintOval()函数后,该函数并不改变打印光标的位置。PrintOval()函数绘出的椭圆或圆是实心的,也就是说,执行该函数后,椭圆或圆下面的文字或图像将完全被覆盖。如果想在椭圆或圆输出文字或图形,那么应用程序应该首先绘制椭圆或圆,然后使用其它函数在椭圆或圆输出文字或图形。 -------------------------------------------------------------------------------- PrintPage() 功能将当前页发送给打印机或打印池并在当前打印作业启动一个新的打印页。 语法PrintPage ( printjobnumber ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintPage()函数返回NULL。 -------------------------------------------------------------------------------- PrintRect() 功能在指定位置以指定线宽打印矩形。 语法PrintRect ( printjobnumber, x, y, width, height, thickness ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号x:integer类型,指定矩形左上角的x坐标,以千分之一英寸为单位y:integer类型,指定矩形左上角的y坐标,以千分之一英寸为单位width:integer类型,指定矩形的宽度,以千分之一英寸为单位height:integer类型,指定矩形的高度,以千分之一英寸为单位thickness:integer类型,指定矩形边线的厚度,以千分之一英寸为单位返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintRect()函数返回NULL。用法应用程序执行了PrintRect()函数后,该函数并不改变打印光标的位置。PrintRect()函数绘出实心的矩形,也就是说,执行该函数后,矩形下面的文字或图像将完全被覆盖。如果想在矩形输出文字或图形,那么应用程序应该首先绘制矩形,然后使用其它函数在矩形输出文字或图形。 -------------------------------------------------------------------------------- PrintRoundRect() 功能在指定位置以指定线宽打印圆角矩形。 语法PrintRoundRect(printjobnumber,x,y,width,height,xradius,yradius,thickness) 参数printjobnumber:用PrintOpen()函数打开的打印作业号x:integer类型,指定圆角矩形左上角的x坐标,以千分之一英寸为单位y:integer类型,指定圆角矩形左上角的y坐标,以千分之一英寸为单位width:integer类型,指定圆角矩形的宽度,以千分之一英寸为单位height:integer类型,指定圆角矩形的高度,以千分之一英寸为单位xradius:integer类型,指定圆角矩形圆角部分的x半径,以千分之一英寸为单位yradius:integer类型,指定圆角矩形圆角部分的y半径,以千分之一英寸为单位thickness:integer类型,指定圆角矩形边线的厚度,以千分之一英寸为单位返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintRoundRect()函数返回NULL。用法应用程序执行了PrintRoundRect()函数后,该函数并不改变打印光标的位置。PrintRoundRect()函数绘出实心的圆角矩形,也就是说,执行该函数后,圆角矩形下面的文字或图像将完全被覆盖。如果想在圆角矩形输出文字或图形,那么应用程序应该首先绘制圆角矩形,然后使用其它函数在圆角矩形输出文字或图形。 -------------------------------------------------------------------------------- PrintScreen() 功能在打印作业打印屏幕图像。 语法PrintScreen ( printjobnumber, x, y {, width, height } ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号x:integer类型,指定要打印屏幕图像左上角在打印页上的x坐标,以千分之一英寸为单位y:integer类型,指定要打印屏幕图像左上角在打印页上的y坐标,以千分之一英寸为单位width:integer类型,可选项,指定屏幕图像的打印宽度,以千分之一英寸为单位。如果省略了该参数,那么PowerBuilder按屏幕的原始宽度打印屏幕图像。如果指定了该参数,必须同时指定height参数height:integer类型,可选项,指定屏幕图像的打印高度,以千分之一英寸为单位。如果省略了该参数,那么PowerBuilder按屏幕的原始高度打印屏幕图像返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintScreen()函数返回NULL。 -------------------------------------------------------------------------------- PrintSend() 功能直接向打印机发送任意字符串,通常用于发送打印机的控制代码。 语法PrintSend ( printjobnumber, string {, zerochar } ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号string:string类型,指定发送到打印机的字符串。在该字符串,使用非打印字符的ASCII码值表示非打印字符zerochar:integer类型,可选项,指定在string参数用于表示数值0的ASCII码值。有效取值在1到255之间返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintSend()函数返回NULL。用法应用程序使用PrintSend()函数可以直接向打印机发送控制序列(换码序列),比如,设置打印文字的浓淡、打印页的四周空白等。不同类型的打印机使用不同的控制序列,你需要翻一翻你的打印机手册。由于PowerBuilder使用数值0(即ASCII码为0的字符)结束每个字符串,因此,如果打印控制序列包含了数值0,应用程序需要使用其它字符在参数string替代数值0,并用zerochar参数指明这个替代字符。一般来说,应该选择一个打印机控制序列不使用的字符作为0值字符的替代字符。通常情况下,按下述次序组织打印作业:1. 使用PrintOpen()函数打开打印作业2. 使用PrintSend()函数设置打印机特性,比如打印方向、四周空白等3. 使用PrintDefineFont()和PrintSetFont()函数设置该打印作业使用的字体4. 使用该组的其它函数打印输出文字或图形5. 执行PrintClose()函数关闭打印作业 -------------------------------------------------------------------------------- PrintSetFont() 功能设置当前打印作业使用的字体。 语法PrintSetFont ( printjobnumber, fontnumber ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号fontnumber:指定该打印作业使用字体的字体编号,该编号与PrintDefineFont()函数定义的编号应该对应,字体编号的有效取值在1到8之间,0表示使用打印机的缺省字体返回值Integer。函数执行成功时返回当前字体的高度,发生错误时返回-1。如果任何参数的值为NULL,PrintSetFont()函数返回NULL。 -------------------------------------------------------------------------------- PrintSetSpacing() 功能设置行间距因子,打印函数将使用该因子来决定行间距。 语法PrintSetSpacing ( printjobnumber, spacingfactor ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号spacingfactor:指定行间距因子,用字符高度的倍数表示,缺省值为1.2返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintSetSpacing()函数返回NULL。用法在PowerBuilder应用程序,行间距与字符的高度成正比,缺省值为字符高度的1.2倍。当Print组函数生成新行时,系统自动把打印光标的x坐标位置设置为0,y坐标位置在原有基础上增加当前行距值。使用PrintSetSpacing()函数可以改变当前打印作业的行距。 -------------------------------------------------------------------------------- PrintSetup() 功能打开打印机设置对话框。 语法PrintSetup ( ) 返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintSetup()函数返回NULL。用法当系统安装了多种打印机时,在Windows 95PrintSetup()函数打开如图2-1所示的对话框,单击“Setup”按钮设置打印机各种特性。如果系统只有一个打印机,则直接打开该打印机的打印设置对话框。需要注意的是,在Windows95和Windows NT 3.51以后的版本,使用PrintSetup()函数设置的打印机设置只对当前应用起作用,并不影响其它应用的打印机设置。对Windows 3.1来说,使用PrintSetup()函数设置的打印机设置影响系统的所有应用。 -------------------------------------------------------------------------------- PrintText() 功能在指定位置打印一行文本。 语法PrintText ( printjobnumber, string, x, y {, fontnumber } ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号string:string类型,指定要打印的文本x:integer类型,指定文本开始打印位置的x坐标,以千分之一英寸为单位y:integer类型,指定文本开始打印位置的y坐标,以千分之一英寸为单位fontnumber:可选参数,指定打印文本使用的字体号,该编号由PrintDefineFont()函数确定。省略该参数时,以打印作业的当前字体打印文本返回值Integer。函数执行成功时返回文本打印后打印光标的x位置,即参数x的值加上打印文本的宽度。发生错误时返回-1。如果任何参数的值为NULL,PrintText()函数返回NULL。 -------------------------------------------------------------------------------- PrintWidth() 功能确定一个字符串在指定打印作业按当前字体所占的宽度,以千分之一英寸为单位。 语法PrintWidth ( printjobnumber, string ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号string:string类型,指定要决定其打印宽度的字符串返回值Integer。函数执行成功时返回按当前字体计算的字符串打印宽度,以千分之一英寸为单位,发生错误时返回-1。如果任何参数的值为NULL,PrintWidth()函数返回NULL。 -------------------------------------------------------------------------------- PrintX() 功能返回打印光标的x坐标位置。 语法PrintX ( printjobnumber ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号返回值Integer。函数执行成功时返回打印光标的x坐标位置,以千分之一英寸为单位,发生错误时返回-1。如果任何参数的值为NULL,PrintX()函数返回NULL。 -------------------------------------------------------------------------------- PrintY() 功能返回打印光标的y坐标位置。 语法PrintY ( printjobnumber ) 参数printjobnumber:用PrintOpen()函数打开的打印作业号返回值Integer。函数执行成功时返回打印光标的y坐标位置,以千分之一英寸为单位,发生错误时返回-1。如果任何参数的值为NULL,PrintY()函数返回NULL。  LibraryCreate() 功能创建一个空的PowerBuilder应用库,并可根据需要在创建应用库的同时添加库注解。 语法LibraryCreate ( libraryname{, comments } ) 参数libraryname:string类型,指定要创建应用库的名称,可以带上路径,不带路径时在当前目录下创建应用库comments:string类型,可选项,指定要创建的应用库的注解返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,LibraryCreate()函数返回NULL。用法LibraryCreate()函数在指定路径下创建一个空的PowerBuilder应用库(PBL)。如果在指定应用库名称时没有指定文件的扩展名,那么该函数自动加上扩展名.PBL。 -------------------------------------------------------------------------------- LibraryDelete() 功能删除应用库库文件或应用库的数据窗口对象。 语法LibraryDelete ( libraryname{, objectname, objecttype } ) 参数libraryname:string类型,指定库名,可以带上路径,不带路径时在系统搜索路径下查找应用库objectname:string类型,可选项,指定要从库删除的数据窗口对象的名称objecttype:LibImportType类型,可选项,指定要删除对象的类型,目前仅支持ImportDataWindow!返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,LibraryDelete()函数返回NULL。 用法执行LibraryDelete()函数时,如果未指定后两个参数,那么该函数删除指定的应用库;如果指定了后两个参数,那么该函数删除指定应用库指定的数据窗口对象。LibraryDelete()函数只能删除应用库的数据窗口对象,如果想删除其它对象,那么只能在PowerBuilder开发环境使用库管理画笔(Library Painter)来实现了。 -------------------------------------------------------------------------------- LibraryDirectory() 功能 得到应用库指定对象的信息列表,内容包括对象名称、最近修改日期和时间、以及对象的注释。 语法LibraryDirectory ( libraryname, objecttype ) 参数libraryname:string类型,指定PowerBuilder应用库的名称,如果名称未指定路径,那么该函数根据操作系统标准的文件搜索路径查找指定文件objecttype:LibDirType枚举类型,指定希望函数列出的对象类型,有效取值请参看用法。返回值String。函数执行成功时返回一个字符串,每个对象占用一行,行各信息之间使用Tab字符(~t)分隔。行信息格式为:对象名~t修改日期/时间~t注释~n发生错误时函数返回空字符串("")。如果任何参数的值为NULL,LibraryDirectory()函数返回NULL。 用法LibraryDirectory()函数的objecttype参数是个LibDirType枚举类型的量,其有效取值为:DirAll!得到所有对象的信息DirApplication!得到应用对象的信息DirDataWindow!得到所有数据窗口对象的信息DirFunction!得到所有函数对象的信息DirMenu!得到所有菜单对象的信息DirPipeline!得到所有数据管道对象的信息DirProject!得到工程对象的信息DirQuery!得到所有查询对象的信息DirStructure!得到所有结构对象的信息DirUserObject!得到所有用户对象的信息DirWindow!得到所有窗口对象的信息使用LibraryDirectory()函数得到指定对象的名称、修改日期/时间以及可能的注释后,应用程序既可以使用Pos()函数进行定位和字符串分割,也可以使用数据窗口的ImportString()函数将结果显示在数据窗口。 -------------------------------------------------------------------------------- LibraryExport() 功能从指定应用库以对象的语法定义格式卸出对象。 语法LibraryExport ( libraryname, objectname, objecttype ) 参数libraryname:string类型,指定要移出对象的应用库的名称,如果名称未指定路径,那么该函数根据操作系统标准的文件搜索路径查找指定文件objectname:string类型,指定要移出对象的名称objecttype :LibExportType枚举类型,指定要移出对象的类型,具体取值请参看用法返回值String。函数执行成功时返回指定对象的语法,该语法与使用库管理画笔(Library Painter)移出对象时的语法相同,区别在于LibraryExport()函数省略了移出语法的头部。如果发生错误,则函数返回空字符串("")。如果任何参数的值为NULL,LibraryExport()函数返回NULL。 用法LibraryExport()的objecttype参数的可能取值为: ExportApplication!应用对象ExportDataWindow!数据窗口对象ExportFunction!函数对象ExportMenu!菜单对象ExportPipeline!数据管道对象ExportProject!工程对象ExportQuery!查询对象ExportStructure!结构对象ExportUserObject!用户对象ExportWindow!窗口对象 -------------------------------------------------------------------------------- LibraryImport() 功能将以语法格式表示的数据窗口对象装入指定的应用库。 语法LibraryImport(libraryname,objectname,objecttype,syntax,errors{,comments } ) 参数libraryname:string类型,指定要移入对象的应用库的名称,如果名称未指定路径,那么该函数根据操作系统标准的文件搜索路径查找指定文件objectname:string类型,指定要移入的数据窗口对象的名称 objecttype:LibImportType枚举类型,指定要移入对象的类型,目前该函数只支持ImportDataWindow!,表示只能向应用库移入数据窗口对象syntax:string类型,指定要移入数据窗口对象的语法errors:string类型变量,用于在发生错误时保存出错信息comments:string类型,可选项,用于指定移入对象的注解返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,LibraryImport()函数返回NULL。 用法当应用程序在运行过程动态创建数据窗口对象后,可以使用LibraryImport()函数把动态数据窗口对象的定义保存到应用库,以后就可以直接使用该对象了。 FileClose() 功能关闭先前用FileOpen()函数打开的文件。 语法FileClose ( fileno ) 参数fileno:integer,指定要关闭文件的文件句柄,该句柄使用FileOpen()函数打开文件时得到返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果fileno参数的值为NULL,那么FileClose()函数返回NULL。 -------------------------------------------------------------------------------- FileDelete() 功能删除指定的文件。 语法FileDelete ( filename ) 参数filename:string类型,指定要删除文件的文件名,其可以包含路径返回值Boolean。函数执行成功时返回TRUE,发生错误时返回FALSE。如果filename参数的值为NULL,那么FileDelete()函数返回NULL。 -------------------------------------------------------------------------------- FileExists() 功能检查指定的文件是否存在。 语法FileExists ( filename ) 参数filename:string类型,指定要检查存在性的文件的文件名,其可以包含路径返回值Boolean。如果指定文件存在时返回TRUE,不存在时返回FALSE。如果filename参数的值为NULL,那么FileExists()函数返回NULL。用法如果filename参数指定的文件被另一个应用加锁锁住,那么FileExists()函数也将返回FALSE。 -------------------------------------------------------------------------------- FileLength() 功能得到指定文件的长度(以字节为单位)。 语法FileLength ( filename ) 参数filename:string类型,指定要得到其长度的文件的文件名,其可以包含路径返回值Long。函数执行成功时返回指定文件的长度(以字节为单位)。如果指定的文件不存在,函数返回-1。如果filename参数的值为NULL,那么FileLength()函数返回NULL。 -------------------------------------------------------------------------------- FileOpen() 功能以指定的读写方式打开指定的文件,同时返回该文件的句柄。 语法FileOpen(filename{,filemode{,fileaccess{,filelock{,writemode,{creator,filetype}}}}}) 参数filename:string类型,指定要打开文件的名称,其可以包含路径 filemode:FileMode枚举类型,可选项,指定文件打开方式。有效取值为:?LineMode! - 缺省值,行模式;?StreamMode! - 流模式fileaccess:FileAccess枚举类型,可选项,指定文件访问方式。有效取值为:?Read! - 缺省值,只读方式,这样打开的文件只能进行读操作;?Write! - 只写方式,这样打开的文件只能进行写操作?filelock:FileLock枚举类型,可选项,指定文件加锁方式。有效取值为:n LockReadWrite! - 缺省值,只有打开该文件的用户能够访问该文件,其它用 户对该文件的访问均被拒绝;n LockRead! - 只有打开该文件的用户能够读该文件,但其它任何用户均可写该文件;n LockWrite! - 只有打开该文件的用户能够写该文件,但其它任何用户均可读该文件;n Shared! - 所有用户均可读写该文件writemode:WriteMode枚举类型,可选项,当fileaccess参数指定为Write!时,该参数指定在指定文件已经存在时数据的添加方式。有效取值为:?Append! - 缺省值,将数据添加到原文件尾部;?Replace! - 覆盖原有数据creator:可选项,用于Macintosh机,使用四个字符的字符串指定文件的创建者。指定该参数后,必须同时指定filetype参数filetype:可选项,用于Macintosh机,使用四个字符的字符串指定文件类型返回值Integer。函数执行成功时返回打开文件的句柄,随后的文件操作函数利用该句柄完成对文件的操作。发生错误时函数返回-1。如果任何参数的值为NULL,那么FileOpen()函数返回NULL。用法当文件以行模式打开时,每执行一次FileRead()函数读取一行数据;每执行一次FileWrite()函数,该函数自动在写出的字符串末尾增加一个回车(CR)换行(LF)符(这是应用程序在Windows 系统运行时的情况,在UNIX下只加一个换行字符)。当文件以流模式打开时,执行一次FileRead()函数读取32,765个字节的数据,如果余下数据没有这么多,那么FileRead()函数就读取所有余下的数据;执行一次FileWrite()函数时,最多可写入32,765个字节的数据,并且不添加回车换行字符。当文件以写方式使用FileOpen()函数打开时,如果指定的文件不存在,那么FileOpen()函数创建该文件。 -------------------------------------------------------------------------------- FileRead() 功能从指定文件读取数据。 语法FileRead ( fileno, variable ) 参数fileno:integer类型,指定文件句柄(由FileOpen()函数得到)variable:string或blob类型的变量,用于保存读取的数据返回值Integer。函数执行成功时返回读取的字符数或字节数;如果在读取任何字符前读到了文件结束符(EOF),则FileRead()函数返回-100;当指定文件以行模式打开时,如果在读取任何字符之前遇到了回车(CR)或换行(LF)字符,则FileRead()函数返回0。如果发生其它错误,FileRead()函数返回-1。如果任何参数的值为NULL,那么FileRead()函数返回NULL。用法当指定文件以行模式(Line Mode)打开时,FileRead()函数一次读取一行数据,并把它保存到参数variable,然后跳过行结束符(回车换行符,操作系统不同,使用的字符也不同),把文件指针移动到下一行的起始位置。当文件以流模式(Stream Mode)打开时,FileRead()函数或一直读取到文件结尾,或读取32,765字节的数据,决定于两者哪个数据长度更短些。 -------------------------------------------------------------------------------- FileSeek() 功能将文件指针移动到指定位置。读写文件时相应函数会自动移动文件指针。 语法FileSeek ( fileno, position, origin ) 参数fileno: integer类型,指定文件句柄(由FileOpen()函数得到) position:long类型,指定相对于origin参数指定位置的新位置偏移量,以字节为单位 origin:SeekType枚举类型,指定从哪里开始移动文件指针,即指针移动的基准。有效取值为:?FromBeginning! - 缺省值,从文件开头移动指针;?FromCurrent! - 从当前位置移动文件指针;?FromEnd! - 从文件结尾处移动文件指针返回值Long。函数执行成功时返回指针移动后的指针位置。如果任何参数的值为NULL,那么FileSeek()函数返回NULL。 -------------------------------------------------------------------------------- FileWrite() 功能向指定文件写数据。 语法FileWrite (fileno , variable ) 参数fileno:integer类型,指定文件句柄(由FileOpen()函数得到)variable:string或blob类型,其值将写入fileno参数指定的文件返回值Integer。函数执行成功时返回写入文件的字符或字节数,发生错误时返回-1。如果任何参数的值为NULL,那么FileWrite()函数返回NULL。用法FileWrite()函数从当前文件指针开始写入指定数据,写入之后,将文件指针调整到刚刚写入数据的下一个字节位置。当文件以writemode参数设置为Replace!方式打开时,文件指针最初位于文件的开头位置;当文件以writemode参数设置为Append!方式打开时,文件指针最初位于文件的结尾位置。当文件以行模式打开时,执行FileWrite()函数时,该函数自动在每次写入数据的后面加上回车换行符,并把文件指针移动到回车换行符后面。当文件以流模式打开时,FileWrite()函数一次最多写入32,765个字节。如果variable参数数据的长度超过了32,765个字节,那么FileWrite()函数只向文件写入前32,765个字符并返回32,765。 -------------------------------------------------------------------------------- GetFileOpenName() 功能显示打开文件对话框,让用户选择要打开的文件。 语法GetFileOpenName(title,pathname,filename{,extension{,filter}}) 参数title:string类型,指定对话框的标题pathname:string类型变量,用于保存该对话框返回的文件路径及文件名filename:string类型变量,用于保存该对话框返回的文件名extension:string类型,可选项,使用1到3个字符指定缺省的扩展文件名 filter:string类型,可选项,其值为文件名掩码,指定显示在该对话框的列表框供用户选择的文件名满足的条件(比如*.*,*.TXT,*.EXE等)返回值Integer。函数执行成功时返回1;当用户单击了对话框上的“Cancel”按钮时函数返回0;发生错误时返回-1。如果任何参数的值为NULL,那么GetFileOpenName()函数返回NULL。 用法filter参数的格式为:description,*. ext缺省值为:"All Files (*.*),*.*"其,description说明扩展名的意义,比如“所有文件”、“文本文件”等。你可以根据需要指定在打开文件对话框显示的文件名类型。当需要指定多种文件类型时,各类型之间使用逗号分隔,例如:"PIF 文件, *.PIF, 批处理文件, *.BAT"需要注意的是,该函数只是得到一个文件名,而并没有打开文件,需要打开文件时,依然需要使用FileOpen()函数。 -------------------------------------------------------------------------------- GetFileSaveName() 功能显示保存文件对话框,让用户选择要保存到的文件。 语法GetFileSaveName(title,pathname,filename{,extension{,filter}}) 参数title:string类型,指定对话框的标题pathname:string类型变量,用于保存该对话框返回的文件路径及文件名filename:string类型变量,用于保存该对话框返回的文件名extension:string类型,可选项,使用1到3个字符指定缺省的扩展文件名filter:string类型,可选项,其值为文件名掩码,指定显示在该对话框的列表框供用户选择的文件名满足的条件(比如*.*,*.TXT,*.EXE等)返回值Integer。函数执行成功时返回1;当用户单击了对话框上的“Cancel”按钮时函数返回0;发生错误时返回-1。如果任何参数的值为NULL,那么GetFileSaveName()函数返回NULL。 用法filter参数的格式为:description,*. ext缺省值为:"All Files (*.*),*.*"其,description说明扩展名的意义,比如“所有文件”、“文本文件”等。你可以根据需要指定在打开文件对话框显示的文件名类型。当需要指定多种文件类型时,各类型之间使用逗号分隔,例如:"PIF 文件, *.PIF, 批处理文件, *.BAT"需要注意的是,该函数只是得到一个文件名,而并没有打开文件,需要打开文件时,依然需要使用FileOpen()函数。 GetCommandDDE() 功能得到DDE客户应用发送的命令。 语法GetCommandDDE ( string ) 参数string:string类型的变量,用于保存DDE客户应用发送的命令返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果string参数的值为NULL, GetCommandDDE()函数返回NULL。用法当DDE客户应用向DDE服务器应用发送一条命令时,这个动作将触发DDE服务器应用活动窗口的RemoteExec事件,在这个事件的事件处理程序,可以使用GetCommandDDE()函数得到DDE客户应用发送的命令。 -------------------------------------------------------------------------------- GetCommandDDEOrigin() 功能确定哪一个DDE客户应用向服务器发送了命令。 语法GetCommandDDEOrigin ( applstring ) 参数applstring:string变量,用于保存发送命令的DDE客户应用的名称返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果applstring参数的值为 NULL,GetCommandDDEOrigin()函数返回NULL。 -------------------------------------------------------------------------------- GetDataDDE() 功能得到DDE客户应用发送的数据。 语法GetDataDDE ( string ) 参数string:string类型变量,用于保存接收到的数据返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL, GetDataDDE()函数返回NULL。 -------------------------------------------------------------------------------- GetDataDDEOrigin()功能确定哪个DDE客户应用发送了数据。 语法GetDataDDEOrigin ( applstring, topicstring, itemstring ) 参数applstring:string类型变量,用于保存客户应用的名称topicstring:string类型变量,用于保存主题(比如,在Excel,主题可以是REGION.XLS)itemstring:string类型变量,用于保存数据项标识(比如,在Excel,数据项标识可能是R1C2)返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,GetDataDDEOrigin()函数返回NULL。 -------------------------------------------------------------------------------- RespondRemote() 功能向客户端应用指明最近的命令或数据是否已经接收。 语法RespondRemote ( boolean ) 参数boolean:其值为boolean量的逻辑表达式,TRUE表示接收先前收到的命令或数据,FALSE表示不接收先前收到的命令或数据返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果boolean参数的值为NULL,RespondRemote()函数返回NULL。 -------------------------------------------------------------------------------- SetDataDDE() 功能向DDE客户应用发送数据。 语法SetDataDDE ( string {, applname, topic, item } ) 参数string:指定要发送到DDE客户应用的数据applname:string类型,可选项,指定接收数据的客户应用的DDE名称topic:string类型,可选项,指定基础数据组item:string类型,可选项,指定基础数据组的数据项返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1函数调用的环境不对-2数据未被接收如果任何参数的值为NULL,SetDataDDE()函数返回NULL。 -------------------------------------------------------------------------------- StartServerDDE() 功能将当前应用设置为DDE服务器。 语法StartServerDDE ( { windowname, } applname, topic {, item } ) 参数windowname:可选项,指定服务器窗口名,缺省值为当前窗口applname:当前应用的DDE名称topic:string类型,指定DDE客户应用能够引用的基本数据组item:由逗号(,)分隔的一个或多个字符串,指定服务器应用支持的数据项返回值Integer。函数执行成功时返回1,发生错误时返回-1,表示当前应用已经设置为DDE服务器。如果任何参数的值为NULL,StartServerDDE()函数返回NULL。 -------------------------------------------------------------------------------- StopServerDDE() 功能停止当前应用的DDE服务器功能。执行该函数后,发给该应用的任何DDE客户应用请求都将失败。 语法StopServerDDE ( { windowname, } applname, topic ) 参数windowname:可选项,指定要关闭服务器功能的服务器窗口名,缺省值为当前窗口,如果当前应用有多个服务器窗口,那么必须指定该参数applname:当前应用的DDE名称topic:string类型,应该与StartServerDDE()对应参数相同返回值Integer。函数执行成功时返回1,发生错误时返回-1,表示当前应用未曾作为DDE服务器启动。如果任何参数的值为NULL,StopServerDDE()函数返回NULL。 CPU() 功能得到自当前应用程序启动后开始CPU所消耗的时间,以毫秒为单位。 语法CPU() 返回值Long。返回自当前应用程序启动后开始CPU所消耗的时间,以毫秒为单位。 -------------------------------------------------------------------------------- Idle() 功能该函数在用户每次活动(例如,按键盘、移动鼠标等)后重置定时器,n秒后触发应用对象的Idle事件。 语法Idle ( n ) 参数n:指定空闲时间间隔,以秒为单位。该参数的值设置为0时,停止空闲检测,不再触发应用对象的Idle事件返回值Integer。函数执行成功时返回1,此时启动定时器。如果不能启动定时器或定时器未启动而n的值指定为0时,函数返回-1。如果任何参数的值为NULL,Idle()函数返回NULL。用法利用Idle()函数,应用程序可以构造自己的屏幕保护程序,避免安全数据的泄露。当使用Idle()函数已经启动了定时器后,如果再次以非0参数调用Idle()函数,那么该函数重设时间间隔,但并不启动新的定时器。Idle()函数启动定时器后,如果在指定的时间间隔(从用户最近一次操作算起)内没有操作应用程序,那么就触发应用对象的Idle事件,在这个事件可以编写关闭窗口、退出数据库登录等一系列代码,然后使用Restart()函数重新启动应用程序,起到保密的目的。发生下述任何情况时,系统自动重置定时器(即重新开始计时):n 用户在该应用程序的任何窗口内移动鼠标或单击鼠标(双击鼠标时首先触发单击事件)n 在该应用程序的某个窗口是当前窗口时用户按下了任意一个或多个键n 在该应用程序的窗口最小化时,用户在该应用的图标上单击鼠标或移动鼠标n 在该应用程序的窗口最小化并且该应用程序是当前应用程序(应用名称被加亮显示)时,用户按了任何按键n 可视数据窗口检索数据时引起的编辑控件(指漂浮在数据窗口当前行/列上的编辑控件)重绘操作 -------------------------------------------------------------------------------- Timer() 功能 在指定的时间间隔内反复触发指定窗口的定时器事件。 语法Timer ( interval {, windowname } ) 参数interval:指定两次触发Timer事件之间的时间间隔,有效值在0到65之间。如果该参数的值指定为0,那么关闭定时器,不再触发指定窗口的Timer事件windowname:窗口名,指定时间间隔到时要触发哪个窗口的Timer事件。省略该参数时,触发当前窗口的Timer事件返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,Timer()函数返回NULL。用法使用Timer()函数可以周期性地触发指定窗口的Timer事件,这样,每当时间间隔过去时,应用程序都可以完成一些周期性的工作,比如绘制简单动画等。将Timer()的interval参数设置为非0值时启动定时器并开始计时;将该函数的interval参数设置为0时关闭定时器,终止计时任务。需要注意的是,在Microsoft Windows系统,该函数能够计时的最小时间间隔为0.055秒(约1/18秒),如果把interval参数的值设置小于0.055,那么该定时器将每隔0.055秒触发一次窗口的Timer事件。Microsoft Windows 3.x最多只支持系统同时启动16个定时器。 RegistryDelete() 功能删除Windows系统注册库的一个键或键的某个值。 语法RegistryDelete ( key, valuename ) 参数key:string类型,指定键名,将删除该键或删除该键的某个值valuename:string类型,指定要删除的值的名称。如果想删除键、键的值、以及其下的所有子键,那么将该参数指定为空字符串返回值Integer。函数执行成功时返回1,发生错误时返回-1。用法为了唯一地标识某个键,在key参数,可以从根键开始依次指定各级父键,各键之间使用反斜杠(\)分隔。 -------------------------------------------------------------------------------- RegistryGet() 功能从系统注册库得到指定键的值。 语法RegistryGet ( key, valuename, valuetype, valuevariable ) 参数key:string类型,指定键名valuename:string类型,指定要访问值的名称。每个键可以有一个未命名的值和多个命名的值。要访问未命名的值,把该参数指定为空字符串("")valuetype:RegistryValueType枚举类型,指定值的数据类型。有效取值请参看用法valuevariable:用于保存键值的变量,其数据类型应该与valuetype参数指定的类型相匹配返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果valuevariable的数据类型与valuetype参数指定的类型不匹配,将引发运行错误。 用法valuetype的可能取值为:RegString!以空字符结束的字符串RegExpandString!以空字符结束的字符串,其包括了对环境变量的非扩展应用RegBinary!二进制数据ReguLong!32位数据ReguLongBigEndian!32位大数据RegLink!Unicode符号链RegMultiString!动态字符串数组为了唯一地标识某个键,在key参数,可以从根键开始依次指定各级父键,各键之间使用反斜杠(\)分隔。 -------------------------------------------------------------------------------- RegistryKeys() 功能从系统注册库得到指定键的有效子键。 语法RegistryKeys ( key, subkeys ) 参数key:string类型,指定键名subkeys:字符串数组变量,用于保存各子键返回值Integer。函数执行成功时返回1,发生错误时返回-1。用法在subkeys参数可以使用定长数组,也可以使用动态数组。使用动态数组时,数组的上界反映了能够得到的子键个数。当使用定长数组时,其数组元素个数必须足够多,保证能够容纳所有子键,但是,在具体得到子键之前,没有办法能够预先知道实际子键个数。为了唯一地标识某个键,在key参数,可以从根键开始依次指定各级父键,各键之间使用反斜杠(\)分隔。 -------------------------------------------------------------------------------- RegistrySet() 功能在系统注册库设置或创建指定键。 语法RegistrySet ( key, valuename, valuetype, value ) 参数key:string类型,指定键名valuename:string类型,指定要访问值的名称。每个键可以有一个未命名的值和多个命名的值。要访问未命名的值,把该参数指定为空字符串("")。如果注册库不存在指定值名,该函数将创建新的值名valuetype:RegistryValueType枚举类型,指定值的数据类型。有效取值请参看用法value:要设置的值,其数据类型应该与valuetype参数指定的类型相匹配返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果valuevariable的数据类型与valuetype参数指定的类型不匹配,将引发运行错误。用法valuetype的可能取值为:RegString!以空字符结束的字符串RegExpandString!以空字符结束的字符串,其包括了对环境变量的非扩展应用RegBinary!二进制数据ReguLong!32位数据ReguLongBigEndian!32位大数据RegLink!Unicode符号链RegMultiString!动态字符串数组为了唯一地标识某个键,在key参数,可以从根键开始依次指定各级父键,各键之间使用反斜杠(\)分隔。 -------------------------------------------------------------------------------- RegistryValues() 功能得到与指定键相关的一组值名。该函数在Windows 3.1无效。 语法RegistryValues ( key, valuename ) 参数key:string类型,指定键名valuename:字符串数组变量,用于保存值名返回值Integer。函数执行成功时返回1,发生错误时返回-1。用法在valuename 参数可以使用定长数组,也可以使用动态数组。使用动态数组时,数组的上界反映了能够得到的值名个数。当使用定长数组时,其数组元素个数必须足够多,保证能够容纳所有值名,但是,在具体得到值名之前,没有办法能够预先知道实际值名个数。为了唯一地标识某个键,在key参数,可以从根键开始依次指定各级父键,各键之间使用反斜杠(\)分隔。  Clipboard() 功能提取或替换Windows系统剪贴板的文本内容。 语法Clipboard ( { string } ) 参数string:string类型,可选项,指定要复制到系统剪贴板上的文本。如果剪贴板上已有内容的话,该文本将取代剪贴板的当前内容返回值String。函数执行成功时,如果剪贴板上包含文本数据,那么函数返回剪贴板的当前内容;如果剪贴板上包含非文本数据(比如位图)或不包含任何数据,那么函数返回空字符串("")。如果string参数的值为NULL,Clipboard()函数返回NULL。用法无论是否指定string参数,Clipboard()都将返回剪贴板的当前内容。当指定string参数时,剪贴板的原有内容被string参数的值取代;省略string参数时,仅仅得到剪贴板的内容。 -------------------------------------------------------------------------------- CommandParm() 功能得到应用程序运行时指定的命令参数。 语法CommandParm ( ) 返回值String。函数执行成功时返回应用程序运行时的命令行参数,函数执行错误或没有命令行参数时函数返回空字符串("")。用法命令行参数是应用程序启动时跟在应用程序名称后面的任何参数,比如,在运行窗口输入了下述命令:MyAppl C:\EMPLOYEE\EMPLIST.TXT那么MyAppl应用程序使用CommandParm()函数得到的命令行参数为:C:\EMPLOYEE\EMPLIST.TXT当应用程序的命令行包含几个参数时,CommandParm()函数作为一个字符串返回所有参数。利用字符串操作函数可以分离各参数。在应用对象的Open事件没有必要执行CommandParm()函数。此时,Open事件的argument参数包含了命令行参数。 -------------------------------------------------------------------------------- DoScript() 功能执行AppleScript程序段,该函数只在Macintosh平台上有效。 语法DoScript ( script, result ) 参数script:string类型,指定要运行的程序段(script)result:string类型,由AppleScript程序段返回的结果信息或出错信息返回值Integer。返回由AppleScript返回的结果代码。如果任何参数的值为NULL,DoScript()函数返回NULL。 -------------------------------------------------------------------------------- GetApplication() 功能得到当前应用对象的句柄,这样你可以查询或设置应用对象的属性(通常用于编写通用代码)。 语法GetApplication ( ) 返回值Application。返回当前应用对象的句柄。 -------------------------------------------------------------------------------- GetEnvironment() 功能得到操作系统、处理器、屏幕显示等与系统相关的信息。 语法GetEnvironment ( environmentinfo ) 参数environmentinfo:Environment对象名,用于保存系统环境信息返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数environmentinfo的值为NULL,GetEnvironment()函数返回NULL。用法当开发交叉平台项目时,利用GetEnvironment()函数,应用程序能够得到当前运行的操作系统、使用的CPU类型、操作系统的版本、屏幕的大小以及颜色数等信息,这些信息的具体表示请参阅本书环境对象(Environment Object)的介绍。 -------------------------------------------------------------------------------- GetFocus() 功能确定当前焦点位于哪个控件上。 语法GetFocus ( ) 返回值GraphicObject。函数执行成功时返回当前得到焦点控件的引用,发生错误时返回无效引用。用法应用程序利用IsValid()函数可以检测GetFocus()是否返回有效的控件引用。同时,使用TypeOf()函数可以确定控件的类型。 -------------------------------------------------------------------------------- Post() 功能将指定消息加入到某个窗口的消息队列,这个窗口既可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。 语法Post( handle, messageno, word, long ) 参数handle:long类型,指定窗口的系统句柄,将向该窗口邮寄消息messageno:UnsignedInteger类型,指定要邮寄的消息号 word:long类型,指定与消息一起邮寄的word类参数值。如果messageno参数指定的消息不使用该参数,那么将这个参数的值设置为0long:long类型或string,指定与消息一起邮寄的long型参数值或字符串返回值Boolean。如果任何参数的值为NULL,Post()函数返回NULL。 用法Post()函数用于向窗口发送非PowerBuilder预定义事件的消息,这个窗口可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。Post()函数把发送的消息放置在指定窗口消息队列的尾部,然后返回到应用程序,它并不等待相应事件事件处理程序的执行。这一点与Send()函数不同,Send()函数直接触发指定窗口相应的事件,执行事件处理程序后返回到调用应用。因此,我们说Post()函数采用的是异步方式,Send()函数采用的是同步方式。Post()函数的参数handle指定接收消息的窗口句柄,对PowerBuilder窗口来说,使用Handle()函数可以得到该句柄。对其它应用程序的窗口来说,可以调用系统API函数查找窗口并得到相应窗口的句柄。如果应用程序要邮寄PowerBuilder定义事件(包括预定义事件和用户定义事件),那么使用PostEvent()函数既简单有方便。当应用程序在long参数位置指定一个字符串时,Post()函数复制一个该字符串的副本,然后将副本的地址传送给指定窗口。 -------------------------------------------------------------------------------- ProfileInt() 功能从初始化文件(.ini)读取整型设置值。 语法ProfileInt ( filename, section, key, default ) 参数filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件section:string类型,指定要得到的值所在的节(Section)key:string类型,指定要得到的值的名称,不用区分大小写default:integer类型,当指定的文件、节名、项目名不存在或不能转换为整数时,函数返回该参数指定的值返回值Integer。函数执行成功时,在指定的文件、节名、项目名不存在任何错误的情况下,函数返回相应项的值;如果指定的文件、节名、项目名不存在或不能转换为整数时,函数返回default参数指定的缺省值。如果发生错误,函数返回-1。如果任何参数的值为NULL,ProfileInt()函数返回NULL。 -------------------------------------------------------------------------------- ProfileString() 功能从初始化文件(.ini)读取字符串型设置值。 语法ProfileString ( filename, section, key, default ) 参数filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件section:string类型,指定要得到的值所在的节(Section)key:string类型,指定要得到的值的名称,不用区分大小写default:string类型,当指定的文件、节名、项目名不存在时,函数返回该参数指定的值返回值String。函数执行成功时,在指定的文件、节名、项目名不存在任何错误的情况下,函数返回相应项的值;如果指定的文件、节名、项目名不存在,函数返回default参数指定的缺省值。如果发生错误,函数返回空字符串。如果任何参数的值为NULL,ProfileString()函数返回NULL。 -------------------------------------------------------------------------------- Restart() 功能停止所有程序段的执行、关闭所有窗口、提交事务、断开与数据库的连接,然后重新启动应用程序。 语法Restart() 返回值Integer。函数执行成功时返回1,发生错误时返回-1。 -------------------------------------------------------------------------------- Run() 功能运行指定的应用程序。 语法Run ( string {, windowstate } ) 参数string:string类型,指定要运行的应用程序的名称,其可以包括路径以及相应的参数,就像在命令行键入的那样windowstate:WindowState枚举类型,可选项,指定程序运行时的窗口状态。有效取值为:Maximized! - 最大化窗口;Minimized! - 最小化窗口;Normal! - 缺省值,正常窗口返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,Run()函数返回NULL。 用法使用Run()函数,应用程序能够启动操作系统的任何程序。当在Run()参数指定了要启动应用程序的参数时,参数的意义、格式、个数等由具体的应用程序确定。如果在Run()函数的string参数指定了文件名但没有给出扩展名时,PowerBuilder认为该文件的扩展名为.EXE。要运行扩展名不是.EXE的应用程序(比如.BAT, .COM, 或.PIF),必须在Run()函数的参数指定文件的扩展名。 -------------------------------------------------------------------------------- Send() 功能向窗口发送指定的消息并立即执行相应的事件处理程序。 语法Send( handle, messageno, word, long ) 参数handle:long类型,指定窗口的系统句柄,将向该窗口发送消息messageno:UnsignedInteger类型,指定要发送的消息号word:long类型,指定与消息一起发送的word类参数值。如果messageno参数指定的消息不使用该参数,那么将这个参数的值设置为0long:long类型或string,指定与消息一起发送的long型参数值或字符串返回值Long。函数执行成功时返回Windows系统调用SendMessage()的返回值,发生错误时返回-1。如果任何参数的值为NULL,Send()函数返回NULL。 用法Send()函数用于向窗口发送非PowerBuilder预定义事件的消息,这个窗口可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。Send()函数直接触发指定窗口相应的事件,执行事件处理程序后返回到调用应用,这一点与Post()函数不同,Post()函数把发送的消息放置在指定窗口消息队列的尾部,然后返回到应用程序,它并不等待相应事件事件处理程序的执行。因此,我们说Post()函数采用的是异步方式,Send()函数采用的是同步方式。Send()函数的参数handle指定接收消息的窗口句柄,对PowerBuilder窗口来说,使用Handle()函数可以得到该句柄。对其它应用程序的窗口来说,可以调用系统API函数查找窗口并得到相应窗口的句柄。实际上,Send()函数把它的各个参数直接传送给Windows的系统调用SendMessage()。在各种C++开发工具的WINDOWS.H文件可以查到各消息编号。如果应用程序要发送PowerBuilder定义事件(包括预定义事件和用户定义事件),那么使用TriggerEvent()函数既简单有方便。当应用程序在long参数位置指定一个字符串时,Send()函数复制一个该字符串的副本,然后将副本的地址传送给指定窗口。 -------------------------------------------------------------------------------- SetProfileString() 功能设置初始化文件指定项的值。 语法SetProfileString ( filename, section, key, value ) 参数filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件section:string类型,指定要设置的值所在的节(Section)key:string类型,指定要设置的值的名称,不用区分大小写default:string类型,指定要设置项的值返回值Integer。函数执行成功时返回1,指定的文件未找到或指定的文件不能访问时函数返回-1。如果任何参数的值为NULL,SetProfileString()函数返回NULL。 -------------------------------------------------------------------------------- ShowHelp() 功能显示应用程序帮助,该帮助使用Microsoft Windows帮助系统进行操作。 语法ShowHelp ( helpfile, helpcommand {, typeid } ) 参数helpfile:string类型,指定帮助文件的名称helpcommand:HelpCommand枚举类型,指定显示帮助的格式。有效取值为:Index! - 显示目录主题,使用该值时不要指定typeid参数;Keyword! - 转移到由指定关键字确定的主题;Topic! - 显示指定主题的帮助typeid:可选项,指定帮助主题返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,ShowHelp()函数返回NULL。 -------------------------------------------------------------------------------- SignalError() 功能触发应用对象的SystemError事件,通常用于代码调试。 语法SignalError ( { number }, { text } ) 参数number:integer类型,可选项,其值将保存到Error对象的number属性text:string类型,可选项,其值将保存到Error对象的text属性返回值Integer。函数执行成功时返回1,发生错误时返回-1。 -------------------------------------------------------------------------------- Yield() 功能将控制权转移给其它图形对象,包括非PowerBuilder对象。该函数检测消息队列,如果有消息,就把消息取出。利用该函数可以在执行耗时较长的操作时把控制权转让给其它应用。 语法Yield() 返回值Boolean。如果在消息队列提取到了消息,那么函数返回TRUE,否则返回FALSE。用法正常情况下,PowerBuilder应用程序在执行一段代码(比如函数或事件处理程序)的过程不响应用户的操作。对耗时短暂的代码段来说,这种处理方式没有什么不妥的地方,但是,如果某个代码段的执行耗时较长,应用程序又希望为用户提供更多的控制权,那么需要在这段代码插入Yield()函数,让用户能够进行其它操作,特别在循环执行的代码更应该如此。应用程序执行Fill() 功能建立一个由指定字符串填充的指定长度的字符串。 语法Fill ( chars, n ) 参数chars:string类型,指定用于重复填充的字符串n:long类型,指定由该函数返回的字符串的长度返回值String。函数执行成功时返回n个字符的字符串,该字符串以参数chars字符串重复填充而成。如果参数chars的字符个数多于n个,那么使用chars字符串的前n个字符填充函数返回的字符串;如果参数chars的字符个数少于n个,那么使用chars字符串反复填充,直到返回的字符串长度达到n为止。如果任何参数的值为NULL,Fill()函数返回NULL。 -------------------------------------------------------------------------------- Left() 功能得到字符串左部指定个数的字符。 语法Left ( string, n ) 参数string:string类型,指定要提取子串的字符串n:long类型,指定子串长度返回值String。函数执行成功时返回string字符串左边n个字符,发生错误时返回空字符串("")。如果任何参数的值为NULL,Left()函数返回NULL。如果n的值大于string字符串的长度,那么Left()函数返回整个string字符串,但并不增加其它字符。 -------------------------------------------------------------------------------- LeftTrim() 功能返回指定字符串删除了左部空格后的字符串。 语法LeftTrim ( string ) 参数string:string类型,指定要删除左部空格字符串返回值String。函数执行成功时返回删除了string字符串左部空格字符串,发生错误时返回空字符串("")。如果任何参数的值为NULL,LeftTrim()函数返回NULL。 -------------------------------------------------------------------------------- Len() 功能得到字符串的长度。 语法Len (string) 参数string:string类型变量返回值Long。函数执行成功时返回字符串的长度,发生错误时返回-1。如果任何参数的值为NULL,则Len()函数返回NULL。 -------------------------------------------------------------------------------- Lower() 功能将字符串的大写字母转换为小写字母。 语法Lower ( string ) 参数string:要将其的大写字母转换为小写字母的字符串返回值String。函数执行成功时返回将大写字母转换为小写字母后的字符串,发生错误时返回空字符串("")。如果string参数的值为NULL,Lower()函数返回NULL。 -------------------------------------------------------------------------------- Match() 功能确定字符串是否包含指定模式的字符。 语法Match ( string, textpattern ) 参数string:string类型,指定要检查是否匹配指定模式的字符串textpattern:string类型,指定文本匹配模式返回值Boolean:如果字符串string与模式textpattern相匹配,则函数返回TRUE,否则返回FALSE。如果指定的匹配模式无效或上述两个参数的任何一个未曾赋值,那么Match()函数返回FALSE。如果任何参数的值为NULL,Match()函数返回NULL。 用法textpattern参数的写法与正则表达式十分相似,它由元字符和普通字符组成。每个元字符都有不同的匹配含义,普通字符则与其自身相匹配。下面是匹配模式使用的元字符及其意义: ^指示字符串的开始,例如,^asd表示以asd开头的字符串字符串asdfgh与模式^asd匹配,而字符串basdfg与模式^asd不匹配。 $指示字符串的结束,例如,red$表示所有以red结束的字符串均与该模式匹配,而redo与模式red$不匹配。 .匹配任意单个字符,例如,^&&$匹配任何六个字符组成的字符串。 []匹配括号列出的字符,例如,^[ABC]$匹配由一个字符组成的字符串,其值只能是A或B或C。 -与方括号一起,指定匹配字符的范围,例如,^[A-Z]$只匹配那些由一个大写字母组成的字符串。方括号里还可以使用^字符,表示匹配不在指定范围内的任何字符,例如,[^0-9]匹配除数字外的任何字符。 *,+,?这些符号跟在一个字符后面表示该字符可以出现的次数。星号(*)表示可以出现0次或任意次;加号(+)表示可以出现多次,但至少出现一次;问号(?)表示出现0次或一次。例如,A*匹配0个或多个A(没有A、A、AA、AAA、AAAA、**);A+匹配1个或多个A(A、AA、AAA、AAAA、**);A?匹配空串或1个A。 \斜杠(\)是转义字符,它去掉特殊字符的特殊含义,比如,模式\$匹配字符$,模式\\匹配字符\。 -------------------------------------------------------------------------------- Mid() 功能取字符串的子串。 语法Mid ( string, start {, length } ) 参数string:string类型,指定要从提取子串的字符串start:long类型,指定子串第一个字符在string字符串的位置,第一个位置为1length:long类型,可选项,指定子串的长度返回值String。函数执行成功时返回string字符串从start位置开始、长度为length的子串。如果start参数的值大于string字符个数,那么Mid()函数返回空字符串。如果省略了length参数或length参数的值大于从start开始、string字符串余下字符的长度,那
实验一 复习C++有关知识
实验目的:
通过实验掌握下列知识:
1、复习C++有关基本知识;
2、熟悉VC编程、编译和调试环境;
内容及步骤:
编写一个类Complex,定义复数的加法、减法、乘法和除法运算,要求在编写该类时重载这些运算操作符,并重载I/O操作符,以便输入和输出复数;
实验报告要求:
按要求写出完整的实验代码;

实验二 单链表结构及计算
实验目的:
通过实验掌握下列知识:
1、熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现;
2、继续熟悉VC编程、编译和调试环境;
内容及步骤:
1、 设有一个线性表(e0,e1,e2,e3,…,en-2,en-1)存放在一个一维数组A[arraySize]的前n个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前n个原地址内容置换为(en-1,en-2,…,e3,e2,e1,e0)。
2、 针对带附加头结点的单链表,试编写下列函数
A. 定位函数Locate:在单链表寻找第i个结点。若找到,则函数返回第i个结点的地址;若找不到,则函数返回NULL;
B. 球最大值函数max:通过单链表的一趟遍历,在单链表确定值最大的结点;
C. 统计函数number:统计单链表具有给定值x的所有元素数量;
D. *建立函数create:根据一维数组a[n]建立一个单链表,使单链表各元素的次序与a[n]各元素的次序相同,要求该程序的时间复杂度为O(n)。
E. *整理函数tideup:在非递减有序的单链表删除值相同的多余结点。
实验报告要求:
按要求写出完整的实验代码;

实验三 堆栈结构与递归
实验目的:
通过实验掌握下列知识:
1、掌握堆栈的结构和运算应用;
2、掌握并运用递归的概念进行编程;
内容及步骤:
1、 借助堆栈实现单链表上的逆置运算;
要求: a. 用C++编程;
b. 首先用C++实现单链表编程,再基于编写好的单链表类,实现堆栈类的定义和实现。
c. 链表类和堆栈类都要包含必要的成员函数(按照教材要求)。
2、 已知a[n]为整数数组,试写出实现下列运算的递归代码(C或C++代码均可):
要求: a. 求数组的最大整数;
b. 求n个数的和;
c. 利用堆栈类,将本题a和b的代码改成非递归的方式。
实验报告要求:
按要求写出完整的实验代码;

实验四 综合(课程设计)
内容及步骤:
1、假定一维数组a[n]的每个元素值均在[0,200]区间内,用C++编写一个算法,分别统计出落在[0,20],[21,50],[51,80],[81,130],[131,200]等各区间内的元素个数。
2、 请用C++编写一个算法,完成以下功能:
a. 从键盘输入一段文字,以$作结束符号;
b. 统计文字的文本行数,字母,数字以及其他符号的数量,并在屏幕上显示;
3、 请用C++编写一个算法,完成矢量的加法与成法运算,运算规则如下:
a. 矢量加法:(a1,a2,……,an)+(b1,b2,……,bn)=(a1+b1,a2+b2,……,an+bn);
b. 矢量减法:(a1,a2,……,an)-(b1,b2,……,bn)=(a1-b1,a2-b2,……,an-bn);
c. 矢量点积:(a1,a2,……,an)*(b1,b2,……,bn)=(a1*b1,a2*b2,……,an*bn);
d. 矢量与实数相乘:a*(b1,b2,……,bn)=(a*b1,a*b2,……,a*bn);
4、 请用C++结合链表编写一个简单的机票订票程序,要求完成以下功能:
a. 允许出现多个班机;
b. 创建一个班机链表,每个节点都包含指向一个乘客链表的指针;
c. 该程序要有顾客购票,查询班机起飞降落时间,班机订票情况等3个功能,并实现菜单选项
5、 用C++编写一个简单的行编辑器,每个结点保存一行文本,程序以E file开始,然后显示行数和提示符,如果输入I,后面跟着一个数字n,就在第n行之前插入后续文本,如果I后面没有跟数字,就在当前行之前插入文本,如果输入D,后面跟着m,n,一个数字n或者没有数字,就分别删除m到n行,第n行或者当前行,命令L用于显示文本;
6、 用C++编写求多项式的和与积的算法,要求如下:
a. 要求从键盘分别输入2个多项式的系数以及最高次幂;
b. 通过重载操作符+和*,完成多项式的和与积的计算;
c. 输出运算结果;
7、 编写一个程序,将10进制数转换为其它(2-9)进制数。可以将要转换的数重复除以基数,然后讲除的余数按反方向排列来实现;
8、 已知A[n]为正数数组,试写出实现下列运算的递归算法;
a. 求数组A的最大整数;
b. 求n个数的平均值;
c. 求n个整数的平均值;
9、 已知f为单链表的表头指针,链表存储的都是整型数据,试写出实现下列运算的递归算法:
a. 求链表的最大整数;
b. 求链表的结点个数;
c. 求所有整数的平均数;
告要求:
写出能运行的完整的代码。

实验五 二叉树(一)
实验目的:
通过实验掌握下列知识:
1、熟悉二叉树的存储结构和遍历算法;
2、通过二叉树遍历操作了解递归的本质和方法;
内容及步骤:
1、 试建立一个二叉搜索树,并实现以下成员函数
a. 默认构造函数和带数据域、左子树指针、右子树指针的构造函数
b. 按照二叉搜索树的要求设计插入函数Insert(int Info);
c. 用递归的方法设计前序遍历和后续遍历函数,遍历时要输出遍历的每个结点;
d. 设计一个构造函数,当对象结束时,要释放整个二叉搜索树所占的内存空间(提示,通过后序遍历算法找到叶结点,并删除叶结点,不断重复此过程,直到整科树为空);
2、实现1所要求的代码后,运行设计好的代码,将以下的几组整数序列建成搜索二叉树,并记录下它们的前序遍历序列和后序遍历序列:
a. 1、3、5、7、9;
b. 1、13、35、13、27;
c. 50、25、78、13、44、99、66。
实验报告要求:
1、 按要求记录下二叉搜索树的完整实验代码;
2、 按要求记录下要求的输出结果。


实验六 二叉树(二)
实验目的:
通过实验掌握下列知识:
1、继续熟悉二叉树的存储结构和遍历算法;
2、熟悉二叉搜索树的应用,并做一个小型的课程设计;
内容及步骤:
1、 在前一个实验的基础上,继续增加搜索函数Search(int Info)(如果找到结点,返回指向该结点的指针,如果没有,则返回空指针)和删除函数bool Delete(int Info),如果找到结点,则删除该结点,并保持二叉搜索树的基本结构,并返回true,否则返回false;
2、利用二叉搜索树实现一个音像商店(小型书店、小型超市、或小型药店)的交易管理系统,要求实现以下功能:
a. 该系统应该有一个字符型的主菜单;
b. 能按字母顺序显示库存商品的名称和数量;
c. 能添加和删除新的商品;
d. 当输入一个商品时,能显示该商品是否在库存,如存在库存,则显示其名称和数量,否则显示“未找到”。
e. 如有可能,请建立一个存储商品名称和数量的文本文件,并为二叉搜索树建立一个成员函数SetupInventory(),用于从该文本文件读取库存商品的数据,
实验报告要求:
1、 按要求记录下二叉搜索树的完整实验代码;
2、 按要求记录下要求的输出结果。

实验六 图(课程设计)
实验目的:
通过实验掌握下列知识:
1、熟悉图的存储结构和遍历算法;
2、熟悉图的应用,并做一个小型的课程设计;
内容及步骤:
1、 设计一个图的类,采用临接表法进行存储,该图每个结点的数据类型类模板的模板参数进行定义(注:需先设计一个结点类Node);
2、 为该类分别设计一个实现深度优先搜索和广度优先搜索的成员函数,并要输出搜索结果;
注: 1、为了让你设计的图类拥有数据,可以设计一个成员函数,用于构造你自己预先设计好的图;
2、要求的图如下,也可以自己构造图,但是需要注意的是,图不能是退化的单链表:

实验报告要求:
1、 按要求记录下图的类的完整实验代码;
2、 纪录你所使用的图;
3、 按要求记录下要求的输出结果;


实验八 综合实验
内容及步骤:
1、请使用C++编写班级学生学籍管理程序
每个学生的信息包括:姓名、学号和英语、数学、程序设计及体育成绩。从键盘输入数据,建立数据文件student.dat,然后,利用C++编程完成如下处理:
(1)对学生姓名或学号进行查询,显示其信息 。
(2)对所有学生,按班级计算每一科平均成绩。
(3)分别按英语、数学、程序设计及体育成绩排序并输出到文件。
注:要用面向对象的方法来设计程序,每个班是一个类的实例;
2、用链表建立通讯录。通讯录内容有:姓名、通讯地址、电话号码。
(1)通讯录是按姓名项的字母顺序排列的;
(2)能查找通讯录某人的信息;
(3)能添加和删除通讯录的指定项。
注:要用面向对象的方法来设计程序,每个通讯录是一个类的实例;
3、从终端读入字符集大小为n(即字符的个数),逐一输入n个字符和相应的n个权值(即字符出现的频度),建立哈夫曼树,进行编码并且输出。
注:可用C或C++编写。
4、用邻接矩阵或邻接图实现一个有向图的存储,并实现单源最短路径算法的实现(这个类的一个成员函数),并能输出该图的关键路径。
注:1、要用面向对象的方法设计代码;
2、一个图是一个类的实例;
3、类要指出该图的起点。
实验报告要求:
写出完整的代码。



习题1 绪论------------------------------------------------------------------------------------6
习题2 线性表---------------------------------------------------------------------------------8
习题3 栈和队列------------------------------------------------------------------------------11
习题4 串---------------------------------------------------------------------------------------13
习题5 数组------------------------------------------------------------------------------------15
习题6 树与二叉树---------------------------------------------------------------------------17
习题7 图---------------------------------------------------------------------------------------24
习题8 查找------------------------------------------------------------------------------------31
习题9 排序------------------------------------------------------------------------------------34

第1部分 C++基本知识
各种数据结构以及相应算法的描述总是要选用一种语言工具。在计算机科学发展过程,早期数据结构教材大都采用PASCAL语言为描述工具,后来出现了采用C语言为描述工具的教材版本、至今又出现了采用C++语言为描述工具的多种教材版本。本教实验指导书是为已经学习过C++语言的学生而编写。编写实验指导书目的为了配合理论教学。程序要求在C++ Builder开发环境之下调试运行,采用面向对象方法进行设计。典型的数据结构被设计成为类(class),典型算法设计成为类的函数成员,然后在主函数声明创建类对象,根据实际需要调用重要的算法。
由于C++的使用具有一定的难度,为了同学更好的学习数据结构自身的知识内容,减轻描述工具所带来的困难,这里针对数据结构上机实验所必须的C++基本知识(结构体、类等等)做补充介绍。
一、 源程序组成

这部分内容详细参见本指导书的第3部分的程序实例。
二、结构体及运用
数据结构课程所研究的问题均运用到“结构体”和“类”。在C++语言结构体和函数又是理解和掌握“类”的语法基础。定义结构体的一般格式:
struct 结构体类型名
{ 类型名1 变量名1; //数据子域
类型名2 变量名2;……
类型名n 变量名n;
}
struct是保留字。结构体类型名由用户自己命名。在使用时必须声明一个具体的结构体类型的变量,声明创建一个结构体变量的方法是:
结构体类型名 结构体变量名;
一个结构体可以包含多个数据子域。数据子域的类型名一般指基本数据类型(int char 等),也可是已经定义的另一结构体名。数据子域变量名可以是简单变量,也可以是数组。它们也可以称为结构体的数据成员,它们的访问控制具有‘公有’属性。
1. 通过“结构体变量名.数据子域” 可以访问数据子域。
// 设计Student结构体,在主程序运用。
#include
#include
#include
struct Student //定义结构体Student
{ long num; // 学号
int x; // 成绩
char name[10]; // 姓名
}
int main( )
{ Student s1; //声明创建一个结构体变量s1
//为s1的数据子域提供数据
s1.num=1001 ;
s1. x=83;
strcpy( s1.name, “ 李 明”);
//输出结构体变量s1 的内容
cout<< “ 姓名: ”<< s1.name <cout<< “ 学号: ”<< s1.num<cout<< “ 成绩:”<< s1.x <_getch(); return 0;
}
2. 设计一维数组,每个数组元素是Student结构体类型,通过以下语句段可以说明结构体数组的一般用法:通过“结构体数组名[下标].数据子域”访问数据域。
Student a[5]; //声明创建一个结构体数组a
for(int i=0, i<5, i++)
{ cout<<“学号:”; cin>>a[i].num; //输出数组元素a[i]的学号域
cout<<“姓名:”; cin>> a[i].name; //输出数组元素a[i]的姓名域
cout<<“成绩:”; cin>>a[i].x; //输出数组元素a[i]的成绩域
}
以上是关于结构体的基本概念和简单运用。


三、 类的基本概念及运用
类的是面向对象程序的基本单位。类是由数据成员和相关的函数成员组成。从面向对象的角度考虑“学生”这个类,它不仅包括“学生”的一般属性:学号、姓名、成绩等等,还应包括对于这些属性的操作:输入/输出、听课、实验、等等。
类定义的一般格式:
class 类名
{ 若干数据成员;
若干函数成员;
};
类的数据成员和函数成员均存在访问控制权限问题。访问控制分为三种:公有(public)、私有(private)和受护(protected)。
数据成员的定义和结构体的数据域定义是相似的。不同的是它们必须明确访问控制。而公有数据成员,可以认为与结构体的数据域的访问权限相同。
成员函数的定义又和一般函数的定义基本相同。不同的是类成员函数也必须明确访问控制权限。如果在类之定义成员函数函数体,并未有什么特殊之处。如果在类之仅有成员函数的原型声明,当在类定义之外定义函数体时,需要加上类限定标识“类名::”。下面是“学生”类的定义:
class Students //定义类结构体Students
{ private: //私有成员
long num; // 学号
int x; // 成绩
char name[10]; // 姓名
public: //公有成员
Students();
~Students() { };
void SetDat( long n, int x0, char *na0 )
{ num=n; x=x0; strcpy( name,na0);
}
void PrintOut( ); //输出函数的原型声明
…….;
};
void Students::PrintOut( ) // 输出函数前加Students::
{ cout<< “ 姓名: ”<< name <cout<< “ 学号: ”<< num<cout<< “ 成绩:”<< x < }
在主程序运用类 Students。
int main( )
{ Students s; //声明创建一个类对象s,调用构造函数
s.PrintOut( ); //输出s的内容
long m; int y; char xname[10];
cout<< “ 输入学号,成绩,姓名:” ;
cin>>m>>y>>xname;
s. SetDat( m, y, xname ) ; //修改对象s数据
s. PrintOut(); //输出改变后s的内容
_getch(); return 0;
}
运行结果:
姓名:O
学号:0
成绩:0
输入学号,成绩,姓名:1001 90 WangMing
姓名:WangMing
学号:1001
成绩:90
这个例题数据成员全部定义为私有(private),以便保证数据安全性。
函数成员全部定义为公有(public)成员函数,可以作为类对外部的的接口。 通过s. SetDat( m, y, xname ) ; 直接访公有函数成员SetDat( ), 将实参(主函数的局部变量m, y, xname) 的数据赋给私有数据成员 num,x,name。 通过 s.PrintOut( );直接访公有函数成员PrintOut( ),间接访问输出私有成员num,x,name。
四、 结构体在类的使用
1.结构体数组做类的数据成员
const int MAXSIZE=100; // 数组的容量
struct ElemType // 数据元素的类型
{ int numb;
char name[20];
long tel;
};
class Sqlist
{ private:
ElemType elem[MAXSIZE]; //结构体ElemType类型的数组elem[ ]做数据成员
int length;
public:
Sqlist( void);
~Sqlist(){ };
//其他函数……
};
2.结构体指针变量做类的数据成员
struct NodeType // 结点的结构定义
{ int data; // 数据域
NodeType *next; // 指针域
};
class Link //类声明
{ private:
NodeType *Head; //指向结构构体NodeType的指针变量Head做数据成员
public:
Link ( ){ Head=new NodeType; // 为头结点申请空间
Head->next=Head; // 头结点Head 形成空环
};
~ Link (){ };
void creat();
void outs();
};



















第2部分 书面练习题
习题1 绪论
1.1 单项选择题
1. 数据结构是一门研究非数值计算的程序设计问题,数据元素的① 、数据信息在计算机的② 以及一组相关的运算等的课程。
① A.操作对象   B.计算方法  C.逻辑结构  D.数据映象
② A.存储结构 B.关系 C.运算 D.算法
2. 数据结构DS(Data Struct)可以被形式地定义为DS=(D,R),其D是① 的有限集合,R是D上的② 有限集合。
① A.算法 B.数据元素 C.数据操作 D.数据对象
② A.操作 B.映象 C.存储 D.关系
3. 在数据结构,从逻辑上可以把数据结构分成 。
A.动态结构和静态结构 B.紧凑结构和非紧凑结构
C.线性结构和非线性结构 D.内部结构和外部结构
4. 算法分析的目的是① ,算法分析的两个主要方面是② 。
① A. 找出数据结构的合理性 B. 研究算法的输入和输出的关系
C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性
② A. 空间复杂性和时间复杂性 B. 正确性和简明性
C. 可读性和文档性 D. 数据复杂性和程序复杂性
5. 计算机算法指的是① ,它必具备输入、输出和② 等五个特性。
① A. 计算方法 B. 排序方法
C. 解决问题的有限运算序列 D. 调度方法
② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性
C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性

1.2 填空题(将正确的答案填在相应的空
1. 数据逻辑结构包括 、 和 三种类型,树形结构和图形结构合称为 。
2. 在线性结构,第一个结点 前驱结点,其余每个结点有且只有 个前驱结点;最后一个结点 后续结点,其余每个结点有且只有 个后续结点。
3. 在树形结构,树根结点没有 结点,其余每个结点有且只有 个直接前驱结点,叶子结点没有 结点,其余每个结点的直接后续结点可以 。
4. 在图形结构,每个结点的前驱结点数和后续结点数可以 。
5. 线性结构元素之间存在 关系,树形结构元素之间存在 关系,图形结构元素之间存在 关系。
6. 算法的五个重要特性是__ __ , __ __ , ___ _ , __ __ , _ ___。
7. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。
for (i=0;i for (j=0;j A[i][j]=0;
8. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。
for (i=0;i for (j=0; jA[i][j]=0;
9. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。
s=0;
for (i=0;i for (j=0;j for (k=0;k s=s+B[i][j][k];
sum=s;
10. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。
i=s=0;
while (s{ i++;
s+=i; //s=s+i
}
11. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。
i=1;
while (i<=n)
i=i*2;
1.3 算法设计题
1. 试写一算法,自大到小依次输出顺序读入的三个数X,Y和Z的值.
2. 试写一算法,求出n个数据的最大值。写出最大语句频度,该算法的时间复杂度。
习题答案
1.1 1. C , A 2. B,D 3. C 4. C, A 5. C,B
1.2 1. 线性结构、树形结构、图形结构,非线性结构
2. 没有、1、没有、1
3. 前驱、1、后续、任意多个
4. 任意多个
5. 一对一、一对多、多对多
6. 有穷性、确定性、可行性、输入、输出
7. 最大语句频度:n2 , 时间复杂度:. O (n2)
8. 最大语句频度:n (n+1)/2 , 时间复杂度:. O (n2)
9. 最大语句频度:n3 , 时间复杂度:. O (n3)
10. 最大语句频度:n , 时间复杂度:. O (n )
11. 最大语句频度:log2n, 时间复杂度:. O (log2n )




习题2 线性表
2.1 单项选择题
1. 一个向量(即一批地址连续的存储单元)第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是__ __。
A. 110 B. 108 C. 100 D. 120
2. 线性表的顺序存储结构是一种__ _的存储结构,而链式存储结构是一种__ _的存储结构。
A.随机存取 B.索引存取 C.顺序存取 D.散列存取
3. 线性表的逻辑顺序与存储顺序总是一致的,这种说法__ _。
A. 正确 B. 不正确
4. 线性表若采用链式存储结构时,要求内存可用存储单元的地址__ _。
A. 必须是连续的 B. 部分地址必须是连续的
C. 一定是不连续的 D. 连续或不连续都可以
5. 在以下的叙述,正确的是__ _。
A. 线性表的顺序存储结构优于链表存储结构
B. 线性表的顺序存储结构适用于频繁插入/删除数据元素的情况
C. 线性表的链表存储结构适用于频繁插入/删除数据元素的情况
D. 线性表的链表存储结构优于顺序存储结构
6. 每种数据结构都具备三个基本运算:插入、删除和查找,这种说法__ _。
A. 正确 B. 不正确
7. 不带头结点的单链表head为空的判定条件是____。
A. head= =NULL B. head->next= =NULL
C. head->next= =head D. head!=NULL
8. 带头结点的单链表head为空的判定条件是____。
A. head= =NULL B. head->next= =NULL
C. head->next= =head D. head!=NULL
9. 非空的循环单链表head的尾结点(由p所指向)满足____。
A. p->next= =NULL B. p= =NULL
C. p->next= =head D. p= =head
10. 在双向循环链表的p所指结点之后插入s所指结点的操作是____。
A. p->right=s; s->left=p; p->right->left=s; s->right=p->right;
B. p->right=s; p->right->left=s; s->left=p; s->right=p->right;
C. s->left=p; s->right=p->right; p->right=s; p->right->left=s;
D. s->left=p; s->right=p->right; p->right->left=s; p->right=s;
11. 在一个单链表,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入s结点,则执行____。
A. s->next=p->next; p->next=s; B. p->next=s->next; s->next=p;
B. q->next=s; s->next=p; C. p->next=s; s->next=q;
12. 在一个单链表,若p所指结点不是最后结点,在p之后插入s所指结点,则执行____。
A. s->next=p; p->next=s; B. s->next=p->next; p->next=s;
C. s->next=p->next; p=s; C. p->next=s; s->next=p;
13. 在一个单链表,若删除p所指结点的后续结点,则执行____。
A. p->next= p->next->next; B. p= p->next; p->next= p->next->next;
C. p->next= p->next; D. p= p->next->next;
14. 从一个具有n个结点的单链表查找其值等于x结点时,在查找成功的情况下,需平均比较____个结点。
A. n B. n/2 C. (n-1)/2 D. (n+1)/2
15. 在一个具有n个结点的有序单链表插入一个新结点并仍然有序的时间复杂度是__ __。
A. O(1) B. O(n) C. O (n2) D. O (nlog2n)
16. 给定有n个元素的向量,建立一个有序单链表的时间复杂度是__ __。
A. O(1)) B. O(n) C. O (n2) D. O (n*log2n)
2.2 填空题(将正确的答案填在相应的空
1. 单链表可以做__ __的链接存储表示。
2. 在双链表,每个结点有两个指针域,一个指向____ __,另一个指向___ __。
3. 在一个单链表p所指结点之前插入一个s (值为e)所指结点时,可执行如下操作:
q=head;
while (q->next!=p) q=q->next;
s= new Node; s->data=e;
q->next= ; //填空
s->next= ; //填空
4. 在一个单链表删除p所指结点的后继结点时,应执行以下操作:
q= p->next;
p->next= _ ___; //填空
delete ; //填空
5. 在一个单链表p所指结点之后插入一个s所指结点时,应执行s->next=__ __和p->next=____的操作。
6. 对于一个具有n个结点的单链表,在已知p所指结点后插入一个新结点的时间复杂度是__ __;在给定值为x的结点后插入一个新结点的时间复杂度是__ __。
2.3 算法设计题:
1.设顺序表va的数据元数递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。
2.试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1, a2,…. an)逆置为(an, an-1,…., a1)。
3. 已知线性表的元素以值递增有序排列,并以单链表作存储结构。试写一算法,删除表所有大于x且小于y的元素(若表存在这样的元素)同时释放被删除结点空间。
4. 试写一算法,实现单链表的就地逆置(要求在原链表上进行)。
习题答案
2.1 1. B 2. A, C 3. B 4. D 5. C 6. A 7. A 8. B
9. C 10. D 11.B 12.B 13.A 14.D 15.B 16.C
2.2 1. 线性结表 2. 前驱结点、后继结点
3. s, p 4. q->next, q
5. p->next, s 6. O (1) , O (n)

习题3 栈和队列
3.1 单项选择题
1. 一个栈的入栈序列a,b,c,d,e,则栈的不可能的输出序列是____。
A. edcba B. decba C. dceab D. abcde
2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为____。
A. i B. n=i C. n-i+1 D. 不确定
3. 栈结构通常采用的两种存储结构是____。
A. 顺序存储结构和链式存储结构
B. 散列方式和索引方式
C. 链表存储结构和数组
D. 线性存储结构和非线性存储结构
4. 判定一个顺序栈ST(最多元素为m0)为空的条件是____。
A. top !=0 B. top= =0 C. top !=m0 D. top= =m0-1
5. 判定一个顺序栈ST(最多元素为m0)为栈满的条件是____。
A. top!=0 B. top= =0 C. top!=m0 D. top= =m0-1
6. 栈的特点是____,队列的特点是____。
A. 先进先出 B. 先进后出
7. 向一个栈顶指针为HS的链栈插入一个s所指结点时,则执行__ __。
(不带空的头结点)
A. HS—>next=s;
B. s—>next= HS—>next; HS—>next=s;
C. s—>next= HS; HS=s;
D. s—>next= HS; HS= HS—>next;
8. 从一个栈顶指针为HS的链栈删除一个结点时,用x保存被删结点的值,则执行__ __。(不带空的头结点)
A. x=HS; HS= HS—>next; B. x=HS—>data;
C. HS= HS—>next; x=HS—>data; D. x=HS—>data; HS= HS—>next;
9. 一个队列的数据入列序列是1,2,3,4,则队列的出队时输出序列是____ 。
A. 4,3,2,1 B. 1,2,3,4
C. 1,4,3,2 D. 3,2,4,1
10. 判定一个循环队列QU(最多元素为m0)为空的条件是____。
A. rear - front= =m0 B. rear-front-1= =m0
C. front= = rear D. front= = rear+1
11. 判定一个循环队列QU(最多元素为m0, m0= =Maxsize-1)为满队列的条件是____。
A. ((rear- front)+ Maxsize)% Maxsize = =m0
B. rear-front-1= =m0 C. front= =rear
D. front= = rear+1
12. 循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列的元素个数是____。
A. (rear-front+m)%m B. rear-front+1
C. rear-front-1 D. rear-front
13. 栈和队列的共同点是____。
A. 都是先进后出 B. 都是先进先出
C. 只允许在端点处插入和删除元素 D. 没有共同点
3.2 填空题(将正确的答案填在相应的空
1. 向量、栈和队列都是____结构,可以在向量的____位置插入和删除元素;对于栈只能在____插入和删除元素;对于队列只能在____插入元素和____删除元素。
2. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动____个元素。
3. 向一个长度为n的向量删除第i个元素(1≤i≤n)时,需向前移动____个元素。
4. 向栈压入元素的操作是____。
5. 对栈进行退栈时的操作是____。
6. 在一个循环队列,队首指针指向队首元素的____。
7. 从循环队列删除一个元素时,其操作是____。
8. 在具有n个单元的循环队列,队满时共有____个元素。
9. 一个栈的输入序列是12345,则栈的输出序列43512是____。
10. 一个栈的输入序列是12345,则栈的输出序列12345是____。
3.3 算法设计题:
1. 输入一个任意的非负十进制整数,输出与其等值的八进值数。
2. 按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,并仿照教科书3.2节例3—1的格式,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:
A-B*C/D+E↑F
3. 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。

习题答案
3.1 1. C 2. C 3. A 4. B 5.D 6. BA 7.C 8. B 9. C 10. C
11. A 12. A 13.C
3.2 1. 线性、任何、栈顶、队尾、队首 2. n-i+1 3. n-i
4.先移动栈顶指针,后存入元素 5. 先取出元素,后移动栈顶指针
6.前一个位置 7. 先移动队首元素,后取出元素
8. n-1 9. 不可能的 10. 可能的


习题4 串
4.1 单项选择题
1.以下叙述正确的是 。
A.串是一种特殊的线性表 B.串的长度必须大于零
C.串无素只能是字母 D.空串就是空白串
2.空串与空格串是相同的,这种说法____。
A. 正确 B. 不正确
3.串是一特殊的线性表,其特殊性体现在____。
A. 可以顺序存储 B. 数据元素是一个字符
C. 可以链接存储 D. 数据元素可以是多个字符
4.设有两个串p和q,求q在p首次出现的位置的运算称作____。
A. 连接 B. 模式匹配
C. 求子串 D. 求串长
5.设串s1=’ABCDEFG’,s2=’PQRST’,函数con (x,y)返回x和y串的连接串,subs(s,i,j)返回串s的从序号i的字符开始的j个字符组成的子串,len(s)返回串s的长度,则con (subs (s1,2,len (s2)), subs (s1,len (s2),2))的结果串是____。
A. BCDEF B. BCDEFG
C. BCPQRST D. BCDEFEF
6.设串的长度为n,则它的子串个数为 。
A.n B.n(n+1) C.n(n+1)/2 D.n(n+1)/2+1
4.2 填空题(将正确的答案填在相应的空
1.串的两种最基本的存储方式是____。
2.两个串相等的充分必要条件是____。
3.空串是____,其长度等于____。
4.空格串是____,其长度等于____。
5.设s=’I︺AM︺A︺TEACHER’,其长度是____。
4.3 判断题
1.串是由有限个字符构成的连续序列,串长度为串字符的个数,子串是主串
符构成的有限序列。 ()
2.子串定位函数的时间复杂度在最坏情况下为O(n*m),因此子串定位函数没有实际使用的价值。 ()
3.KMP算法的最大特点是指主串的指针不需要回溯。 ()
4.设模式串的长度为m,目标串的长度为n;当n≈m且处理只匹配一次的模式时,朴素的匹配(即子串定位函数)算法所花的时间代价也可能会更为节省。 ()
5.如果一个串的所有字符均在另一串出现,则说前者是后者的子串。 ()
4.3 算法设计题
1.编写算法,从串s 删除所有和串 t相同的子串。
2.编写算法,实现串的基本操作Replace(&S,T,V)。
3.写一个递归算法来实现字符串逆序存储,要求不另设存储空间。
习题答案
4.1 1.A 2.B 3.B 4.B 5.D 6.C
4.2
1.顺序存储方式和链接存储方式
2.两个串的长度相等且对应位置的字符相同
3.零个字符的串、零
4.由一个或多个空格字符组成的串、其包含的空格个数
5.14
4.3 × × √ √ ×
4.4
3. void reverse(char arr[])
{char ch;
int i=1;
do{cin>>ch;
reverse(arr);
arr[i]=ch;
i++;
}while(ch!=’#’&&i}

习题5 数组和广义表
5.1 单项选择题
1. 常对数组进行的两种基本操作是____。
A. 建立与删除 B. 索引和修改
C. 对数据元素的存取和修改 D. 查找与索引
2. 二维数组M的成员是6个字符(每个字符占一个存储单元,即一个字节)组成的串,行下标i的范围从0到8,列下标j的范围从0到9,则存放M 至少需要①_ _个字节;M数组的第8列和第5行共占②____个字节。
① A. 90 B. 180 C. 240 D. 540
② A. 108 B. 114 C. 54 D. 60
3. 二维数组A,每个元素的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,存放该数组至少需要的字节数是____。
A. 80 B. 100 C.240 D. 270
4. 二维数组A,每个元素A的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,该数组按行存放时,数组元素A[7][4]的起始地址为____。
A. SA+141 B. SA+144 C. SA+222 D. SA+225
5. 二维数组A,每个元素A的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,该数组按列存放时,元素A[4][7]的起始地址为____。
A. SA+141 B. SA+180 C. SA+222 D. SA+225
5.2 填空题(将正确的答案填在相应的空
1. 已知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A[0][0]),则A[i][j]的地址是_______。
2. 二维数组A[10][20]采用列序为主方式存储,每个元素占一个存储单元并且A[0][0]的存储地址是200,则A[6][12]的地址是____。
3. 二维数组A[10..20][5..10]采用行序为主方式存储,每个元素占4个存储单元,并且A[10][5]的存储地址是1000,则A[18][9]的地址是____。
4.求下列广义表操作的结果:
(1) GetTail[GetHead[((a,b),(c,d))]];
(2) GetTail[GetHead[GetTail[((a,b),(c,d))]]]
5.利用广义表的GetHead和GetTail操作写出如上题的函数表达式,把原子banana分别从下列广义表分离出来.
(1) L1=(((apple)),((pear)),(banana),orange);
(2) L2=(apple,(pear,(banana),orange));
5.3 算法设计题:
1. 假设稀疏矩阵A和B均以三元组顺序表作为存储结构。试写出矩阵相加的算法,另设三元组表C存放结果矩阵。
2. 假设系数矩阵A和B均以三元组顺序表作为存储结构。试写出满足以下条件的矩阵相加的算法:假设三元组顺序表A的空间足够大,将矩阵B加到矩阵A上,不增加A,B之外的附加空间,你的算法能否达到O(m+n)的时间复杂度?其m和n分别为A,B矩阵非零元的数目。
3.试编写一个以三元组形式输出用十字链表表示的稀疏矩阵非零元素及其下标的算法。
习题答案
5.1 1. C 2. D,A 3.C 4. C 5. B
5.2 1. LOC (A[0][0])+(n*i+j)*k 2. 200+(6*20+12)= 326
3. 1000+((18-10)*6 +(9-5))*4 = 1208
4.(1). (b) (2). (d)
5. (1) GetHead [GetHead[GetTail[GetTail[L1]]]];
(2) GetHead [GetHead [GetHead[GetTail[L2 ]]]];

习题6 树和二叉树
6.1 单项选择题
1. 由于二叉树每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法____。
A. 正确 B. 错误
2. 假定在一棵二叉树,双分支结点数为15,单分支结点数为30个,则叶子结点数为 个。 A.15 B.16 C.17 D.47
3. 按照二叉树的定义,具有3个结点的不同形状的二叉树有____种。
A. 3 B. 4 C. 5 D. 6
4. 按照二叉树的定义,具有3个不同数据结点的不同的二叉树有____种。
A. 5 B. 6 C. 30 D. 32
5. 深度为5的二叉树至多有____个结点。
A. 16 B. 32 C. 31 D. 10
6. 设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树所包含的结点数至少为_ ___。
A. 2h B. 2h-1 C. 2h+1 D. h+1
7. 对一个满二叉树,m个树叶,n个结点,深度为h,则____ 。
A. n=h+m B. h+m=2n C. m=h-1 D. n=2 h-1
8. 任何一棵二叉树的叶结点在先序、序和后序遍历序列的相对次序____。
A.不发生改变 B.发生改变 C.不能确定 D.以上都不对
9. 如果某二叉树的前根次序遍历结果为stuwv,序遍历为uwtvs,那么该二叉树的后序为____。 A. uwvts B. vwuts C. wuvts D. wutsv
10. 二叉树的前序遍历序列,任意一个结点均处在其子女结点的前面,这种说法____。 A. 正确 B. 错误
11. 某二叉树的前序遍历结点访问顺序是abdgcefh,序遍历的结点访问顺序是dgbaechf,则其后序遍历的结点访问顺序是____。
A. bdgcefha B. gdbecfha C. bdgaechf D. gdbehfca
12. 在一非空二叉树的序遍历序列,根结点的右边____。
A. 只有右子树上的所有结点 B. 只有右子树上的部分结点
C. 只有左子树上的部分结点 D. 只有左子树上的所有结点
13. 如图6.1所示二叉树的序遍历序列是____。
A. abcdgef B. dfebagc C. dbaefcg D. defbagc












图6.1
14. 一棵二叉树如图6.2所示,其序遍历的序列为__ __。
A. abdgcefh B. dgbaechf C. gdbehfca D. abcdefgh
15.设a,b为一棵二叉树上的两个结点,在序遍历时,a在b前的条件是 。
A.a在b的右方 B.a在b的左方
C.a是b的祖先 D.a是b的子孙
16. 已知某二叉树的后序遍历序列是dabec,序遍历序列是debac,它的前序遍历序列是____。 A. acbed B. decab C. deabc D. cedba
17. 实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用____存储结构。
A. 二叉链表 B. 广义表存储结构 C. 三叉链表 D. 顺序存储结构
18. 如图6.3所示的4棵二叉树,____不是完全二叉树。








19. 如图6.4所示的4棵二叉树,____是平衡二叉树。










20. 在线索化二叉树,t所指结点没有左子树的充要条件是____。
A. t—>left=NULL B. t—>ltag=1
C. t—>ltag=1且t—>left=NULL D. 以上都不对
21. 二叉树按某种顺序线索化后,任一结点均有指向其前驱和后续的线索,这种说法____。 A. 正确 B. 错误
22. 二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值、小于其右孩子的值。这种说法____。 A. 正确 B. 错误
23. 具有五层结点的二叉平衡树至少有____个结点。
A. 10 B. 12 C. 15 D. 17
24. 树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、序遍历和后序遍历。这里,我们把由树转化得到的二叉树叫做这棵数对应的二叉树。结论____是正确的。
A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同
B.树的后根遍历序列与其对应的二叉树的后序遍历序列相同
C.树的先根遍历序列与其对应的二叉树的序遍历序列相同
D.以上都不对
25. 树最适合用来表示____。
A. 有序数据元素 B. 无序数据元素
C. 元素之间具有分支层次关系的数据 D. 元素之间无联系的数据
6.2 填空题(将正确的答案填在相应的空
1. 有一棵树如图6.5所示,回答下面的问题:
⑴ 这棵树的根结点是____;
⑵ 这棵树的叶子结点是____;
⑶ 结点k3的度是____;
⑷ 这棵树的度是____;
⑸ 这棵树的深度是____;
⑹ 结点k3的子女是____;
⑺ 结点k3的父结点是____;

2. 指出树和二叉树的三个主要差别____、____、____。
3. 从概念上讲,树与二叉树是两种不同的数据结构,将树转化为二叉树的基本目的是___ _。





4. 一棵二叉树的结点数据采用顺序存储结构,存储于数组t,如图6.6所示,则该二叉树的链接表示形式为__ __。
5. 深度为k的完全二叉树至少有____个结点。至多有____个结点,若按自上而下,从左到右次序给结点编号(从1开始),则编号最小的叶子结点的编号是____。
6. 在一棵二叉树,度为零的结点的个数为n 0,度为2的结点的个数为 n 2,则有n0=____。
7. 一棵二叉树的第i(i≥1)层最多有____个结点;一棵有n(n>0)个结点的满二叉树共有____个叶子和____个非终端结点。
8. 结点最少的树为____,结点最少的二叉树为____。
9. 现有按序遍历二叉树的结果为abc,问有____种不同形态的二叉树可以得到这一遍历结果,这些二叉树分别是____。
10. 由如图6.7所示的二叉树,回答以下问题:
⑴ 其序遍历序列为____;
⑵ 其前序遍历序列为____;
⑶ 其后序遍历序列为____;




6.3 简答题
1. 根据二叉树的定义,具有三个结点的二叉树有5种不同的形态,请将它们分别画出。
2. 假设一棵 二叉树的先序序列为EBADCFHGIKJ和序序列为ABCDEFGHIJK。
请画出该树。
3. 由如图6.7所示的二叉树,回答以下问题:
(1)画出该二叉树的序线索二叉树;
(2)画出该二叉树的后序线索二叉树;
(3)画出该二叉树对应的森林。
4. 已知一棵树如图6.8所示,转化为一棵二叉树,表示为____。



5. 以数据集{4,5,6,7,10,12,18}为结点权值,画出构造Huffman树的每一步图示,计算其带权路径长度为。
6. 一棵含有N个结点的k叉树,可能达到的最大深度和最小深度各为多少?
7. 证明:一棵满k叉树上的叶子结点数n 和非叶子结点数n 之间满足以下关系:
n =(k-1)n +1
6.4 算法设计题
1. 编写按层次顺序(同一层自左至右)遍历二叉树的算法。
2.试编写算法,对一棵二叉树,统计叶子的个数。
3.试编写算法,对一棵二叉树根结点不变,将左、右子树进行交换,树每个结点的左、右子树进行交换。
7. 假设用于通讯的电文仅有八个字母(a,b,c,d,e,f,g,h)组成,字母在电文出现的频率分别为0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10。试为这八个字母设计哈夫曼编码。
使用0-7的二进制表示形式是另一种编码方案。对于上述实例,比较两种方案的优缺点。
8. 试编写算法,对一棵以孩子-兄弟链表表示的树统计叶子的个数。假设一棵 二叉树的先序序列为EBADCFHGIKJ和序序列为ABCDEFGHIJK。请画出该树。
习题答案
6.1 1. B 2. B 3. C 4. C 5. C 6. A 7. D 8. A 9. C 10. A
11. D 2. A 13. B 14. B 15. B 16. D 17. C 18. C
19. B 20. B 21. B 22. B 23. B 24. A 25. C
6.2
1. ⑴ k1 ⑵ k2,k5,k7,k4 ⑶ 2 ⑷ 3 ⑸ 4 ⑹ k5,k6 ⑺ k1
2. 树的结点个数至少为1(不同教材规定不同),而二叉树的结点个数可以为0;
结点的最大度数没有限制,而二叉树结点的最大度数为2;
树的结点无左、右之分,而二叉树的结点有左、右之分;
3. 树可采用孩子-兄弟链表(二叉链表)做存储结构,目的并利用二叉树的已有算法解决树的有关问题。
4. 如图6.9所示
5. 2 k-1 、 2 k-1 、 2 k-2+1
6. n2+1
7. 2 i-1 2[log2n+1]-1 2[log2n+1] –1
8. 只有一个结点的树;空的二叉树
9. 5;如图6.10所示
10. dgbaechif 、abdgcefhi 、gdbeihfca 、
6.3 1. 5种, 图6.11
2. 二叉树如图6.12所示。





3. 序线索二叉树如图6.13(左)所示;后序线索二叉树如图6.13(右)所示;
该二叉树转换后的的森林如图6.14所示。












4. 图6.8的树转化为一棵二叉树如下,图6.15:








5. 画出构造Huffman树如图6.16所示,计算其带权路径长度为 。




6. 一棵含有N个结点的k叉树,可能达到的最大深度 h=N-k+1 ,
最小深度各为: logkN+1。

习题7 图
7.1 单项选择题
1.在一个图,所有顶点的度数之和等于所有边数的____倍。
A. 1/2 B. 1 C. 2 D. 4
2.任何一个无向连通图的最小生成树 。
A.只有一棵 B.有一棵或多棵 C.一定有多棵 D.可能不存在
3.在一个有向图,所有顶点的入度之和等于所有顶点的出度之和的____倍。
A. 1/2 B. 1 C. 2 D. 4
4.一个有n个顶点的无向图最多有____条边。
A. n B. n(n-1) C. n(n-1)/2 D. 2n
5.具有4个顶点的无向完全图有____条边。
A. 6 B. 12 C. 16 D. 20
6.具有6个顶点的无向图至少应有____条边才能确保是一个连通图。
A. 5 B. 6 C. 7 D. 8
7.在一个具有n个顶点的无向图,要连通全部顶点至少需要____条边。
A. n B. n+1 C. n-1 D. n/2
8.对于一个具有n个顶点的无向图,若采用邻接矩阵表示,则该矩阵的大小是____。
A. n B. (n-1)2 C. n-1 D. n2
9.对于一个具有n个顶点和e条边的无向图,若采用邻接表表示,则表头向量的大小为_①___;所有邻接表的接点总数是_②___。
① A. n B. n+1 C. n-1 D. n+e
② A. e/2 B. e C.2e D. n+e
10.已知一个图如图7.1所示,若从顶点a出发按深度搜索法进行遍历,则可能得到
的一种顶点序列为__①__;按宽度搜索法进行遍历,则可能得到的一种顶点序列
为__②__。
① A. a,b,e,c,d,f B. e,c,f,e,b,d C. a,e,b,c,f,d D. a,e,d,f,c,b
② A. a,b,c,e,d,f B. a,b,c,e,f,d C. a,e,b,c,f,d D. a,c,f,d,e,b









11.已知一有向图的邻接表存储结构如图7.2所示。










⑴ 根据有向图的深度优先遍历算法,从顶点v1出发,所得到的顶点序列是____。
A. v1,v2,v3,v5,v4 B. v1,v2,v3,v4,v5
C. v1,v3,v4,v5,v2 D. v1,v4,v3,v5,v2
⑵ 根据有向图的宽度优先遍历算法,从顶点v1出发,所得到的顶点序列是____。
A. v1,v2,v3,v4,v5 B. v1,v3,v2,v4,v5
C. v1,v2,v3,v5,v4 D. v1,v4,v3,v5,v2
12.采用邻接表存储的图的深度优先遍历算法类似于二叉树的____。
A. 先序遍历 B. 序遍历 C. 后序遍历 D. 按层遍历
13.采用邻接表存储的图的宽度优先遍历算法类似于二叉树的____。
A. 先序遍历 B. 序遍历 C. 后序遍历 D. 按层遍历
14.判定一个有向图是否存在回路除了可以利用拓扑排序方法外,还可以利用____。
A. 求关键路径的方法 B. 求最短路径的Dijkstra方法
C. 宽度优先遍历算法 D. 深度优先遍历算法
15.关键路径是事件结点网络
A.从源点到汇点的最长路径 B.从源点到汇点的最短路径
C.最长的回路 D.最短的回路
16.下面不正确的说法是 。
(1)在AOE网,减小一个关键活动上的权值后,整个工期也就相应减小;
(2)AOE网工程工期为关键活动上的权之和;
(3)在关键路径上的活动都是关键活动,而关键活动也必在关键路径上。
A.(1) B.(2) C.(3) D.(1)、(2)
17.用DFS遍历一个无环有向图,并在DFS算法退栈返回时打印出相应的顶点,则输出的顶点序列是 。
A.逆拓朴有序的 B.拓朴有序的 C.无序的
18.在图7.3所示的拓朴排列的结果序列为 。
A.125634 B.516234 C.123456 D.521634


19.一个有n个顶点的无向连通图,它所包含的连通分量个数为 。
A.0 B.1 C.n D.n+1
20.对于一个有向图,若一个顶点的入度为k1,、出度为k2,则对应邻接表该顶点单链表的结点数为 。
A.k1 B.k2 C.k1-k2 D.k1+k2
21.对于一个有向图,若一个顶点的入度为k1,、出度为k2,则对应逆邻接表该顶点单链表的结点数为 。
A.k1 B.k2 C.k1-k2 D.k1+k2
7.2 填空题(将正确的答案填在相应饿空
1.n个顶点的连通图至少____条边。
2.在无权图G的邻接矩阵A,若(vi,vj)或<vi,vj>属于图G的边集合,则对应元素A[i][j]等于____,否则等于____。
3.在无向图G的邻接矩阵A,若A[i][j]等于1,则A[j][i ]等于____。
4.已知图G的邻接表如图7.4所示,其从顶点v1出发的深度有限搜索序列为____,其从顶点v1出发的宽度优先搜索序列为____。










图7.4 图G的邻接表
5.已知一个有向图的邻接矩阵表示,计算第i个结点的入度的方法是____。
6.已知一个图的邻接矩阵表示,删除所有从第i个结点出发的边的方法是____。
7.如果含n个顶点的图形成一个环,则它有 棵生成树。
8.一个非连通无向图,共有28条边,则该图至少有 个顶点。
9.遍历图的过程实质上是 。BFS遍历图的时间复杂度为 ,DFS遍历图的时间复杂度为 ,两者不同之处在于 ,反映在数据结构上的差别是 。
10.一个图的 表示法是唯一的,而 表示法是不唯一的。
11.有向图的结点前驱后继关系的特征是 。
12.若无向图G的顶点度数最小值大于等于 时,G至少有一条回路。
13.根据图的存储结构进行某种次序的遍历,得到的顶点序列是 的。
7.3 综合题
1.已知如图7.5所示的有向图,请给出该图的:
(1)每个顶点的入/出度;
(2)邻接距阵;
(3)邻接表;
(4)逆邻接表;
(5)强连通分量。





2.请用克鲁斯卡尔和普里姆两种算法分别为图7.6、图7.7构造最小生成树:
(1)




图7.6
(2)






图7.7
3.试列出图7.8全部的拓扑排序序列。






图7.8


4.请用图示说明图7.9从顶点a到其余各顶点之间的最短路径。








图7.9


5.已知AOE网有9个结点:V1,V2,V3,V4,V5,V6,V7,V8,V9,其邻接矩阵如下:
(1)请画出该AOE图。
(2)计算完成整个计划需要的时间。
(3)求出该AOE网的关键路径。
∝ 6 4 5 ∝ ∝ ∝ ∝ ∝
∝ ∝ ∝ ∝ 1 ∝ ∝ ∝ ∝
∝ ∝ ∝ ∝ 1 ∝ ∝ ∝ ∝
∝ ∝ ∝ ∝ ∝ 2 ∝ ∝ ∝
∝ ∝ ∝ ∝ ∝ ∝ 9 7 ∝
∝ ∝ ∝ ∝ ∝ ∝ ∝ 4 ∝
∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ 2
∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ 4
∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝


习题答案
7.1 1. C 2.B 3.B 4. C 5. A 6. A 7.C
8.D 9. AC 10.DB 11. CB 12. A 13. D 14.D 15.A 16.A 17.A 18.B 19.B 20.B 21.A
7.2 1.n-1 2. 1;0 3. 1
4.v1,v2,v3,v6,v5, v4;v1,v2,v5,v4,v3, v6
5.求矩阵第i列非零元素之和
6. 将矩阵第i行全部置为零
7.n
8.9
9.对每个顶点查找其邻接点的过程;O(e)(e为图的边数);O(e);
遍历图的顺序不同;DFS采用栈存储访问过的结点,BFS采用队列存储访问过
的结点。
10.邻接矩阵 邻接表
11.一个结点可能有若干个前驱,也可能有若干个后继
12.2
13.唯一

7.3 1.








2.
(1).









(2)







3.
152364
152634
156234
561234
516234
512634
512364
4.









5.(1)该AOE图为:

(2)完成整个计划需要18天。
(3)关键路径为:(V1,V2,V5,V7,V9)和(V1,V2, V5,V8,V9,)

习题8 查找
8.1 单项选择题
1.顺序查找法适合于存储结构为____的线性表。
A. 散列存储 B. 顺序存储或链接存储
C. 压缩存储 D. 索引存储
2.对线性表进行二分查找时,要求线性表必须____。
A. 以顺序方式存储 B. 以链接方式存储
C. 以顺序方式存储,且结点按关键字有序排序
D. 以链接方式存储,且结点按关键字有序排序
3.采用顺序查找方法查找长度为n的线性表时,每个元素的平均查找长度为____.
A. n B. n/2 C. (n+1)/2 D. (n-1)/2
4.采用二分查找方法查找长度为n的线性表时,每个元素的平均查找长度为____。
A.O(n2) B. O(nlog2n) C. O(n) D. O(log2n)
5.二分查找和二叉排序树的时间性能____。
A. 相同 B. 不相同
6.有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当二分查找值82为的结点时,____次比较后查找成功。
A. 1 B. 2 C. 4 D. 8
7.设哈希表长m=14,哈希函数H(key)=key%11。表已有4个结点:
addr (15)=4; addr (38)=5; addr (61)=6; addr (84)=7
如用二次探测再散列处理冲突,关键字为49的结点的地址是____。
A. 8 B. 3 C. 5 D. 9
8.有一个长度为12的有序表,按二分查找法对该表进行查找,在表内各元素等概率情况下查找成功所需的平均比较次数为____。
A. 35/12 B. 37/12 C. 39/12 D. 43/12
9.对于静态表的顺序查找法,若在表头设置岗哨,则正确的查找方式为 。
A.从第0个元素往后查找该数据元素
B.从第1个元素往后查找该数据元素
C.从第n个元素往开始前查找该数据元素
D.与查找顺序无关
10.解决散列法出现的冲突问题常采用的方法是 。
A.数字分析法、除余法、平方取
B.数字分析法、除余法、线性探测法
C.数字分析法、线性探测法、多重散列法
D.线性探测法、多重散列法、链地址法
11.采用线性探测法解决冲突问题,所产生的一系列后继散列地址 。
A.必须大于等于原散列地址
B.必须小于等于原散列地址
C.可以大于或小于但不能等于原散列地址
D.地址大小没有具体限制
12.对于查找表的查找过程,若被查找的数据元素不存在,则把该数据元素插入到集合。这种方式主要适合于 。
A.静态查找表 B.动态查找表
C.静态查找表与动态查找表 D两种表都不适合
13.散列表的平均查找长度 。
A.与处理冲突方法有关而与表的长度无关
B.与处理冲突方法无关而与表的长度有关
C.与处理冲突方法有关而与表的长度有关
D.与处理冲突方法无关而与表的长度无关
8.2 填空题(将正确的答案填在相应的空
1.顺序查找法的平均查找长度为____;折半查找法的平均查找长度为____;哈希表查找法采用链接法处理冲突时的平均查找长度为____。
2.在各种查找方法,平均查找长度与结点个数n无关的查找方法是____。
3.折半查找的存储结构仅限于____,且是____。
4. 假设在有序线性表A[1..20]上进行折半查找,则比较一次查找成功的结点数为____,则比较二次查找成功的结点数为____,则比较三次查找成功的结点数为____,则比较四次查找成功的结点数为____,则比较五次查找成功的结点数为____,平均查找长度为____。
5. 对于长度为n的线性表,若进行顺序查找,则时间复杂度为____;若采用折半法查找,则时间复杂度为____;
6.已知有序表为(12,18,24,35,47,50,62,83,90,115,134),当用折半查找90时,需进行 次查找可确定成功;查找47时,需进行 次查找成功;查找100时,需进行 次查找才能确定不成功。
7.二叉排序树的查找长度不仅与 有关,也与二叉排序树的 有关。
8.一个无序序列可以通过构造一棵 树而变成一个有序树,构造树的过程即为对无序序列进行排序的过程。
9.平衡二叉排序树上任一结点的平衡因子只可能是 、 或 。
10. 法构造的哈希函数肯定不会发生冲突。
11.在散列函数H(key)=key%p,p应取____。
12.在散列存储,装填因子 的值越大,则____; 的值越小,则____。
8.3 综合练习题:
1. 画出对长度为10的有序表进行折半查找的判定树,并求其等概率时查找成功的平均查找长度。
2.含九个叶子结点的3阶B-树至少有多少个非叶子结点?含10个叶子结点的3阶B-树至多有多少个非叶子结点?
3.试从空树开始,画出按以下次序向2-3树即3阶B-树插入关键码的建树过程:20,30,50,52,60,68,70.如果此后删除50和68,画出每一步执行后2-3树的状态。
4. 选取哈稀函数H(k)=(3k)MOD 11。用开放定址法处理冲突,di=i((7k)MOD 10+1)(I=1,2,3,…).试在0-10的散列地址空间对关键字序列(22,41,53,46,30,13,01,67)造哈希表,并求等概率情况下查找成功时的平均查找长度。
5. 已知一组关键字{49,38,65,97,76,13,27,44,82,35,50},画出由此生成的二叉排序树,注意边插入边平衡。
习题答案
8.1 1.B 2.C 3.C 4.D 5.B 6.C 7.D 8.B
9.C 10.D 11.C 12.B 13.C

8.2 1. (n+1)/2 、((n+1)*log2(n+1))/n-1 、1+ ( 为装填因子)
2. 哈希表查找法
3. 顺序存储结构、有序的
4. 1、2、4、8、5、3.7
(依题意,构造一棵有序二叉树,共12个结点,第一层1个结点,第二层2个结点,第三层4个结点,第四层5个结点,则:ASL=(1*1+2*2+3*4+4*5)/12=37/12)
5. O(n)、O(log2n)
6.2、4、3
7.结点个数n、生成过程
8.二叉排序树
9.0、1、-1
10.直接定址
11.素数
12.存取元素时发生冲突的可能性就越大、存取元素时发生冲突的可能性就越小




习题9 排序
9.1 单项选择题
1. 在所有排序方法,关键字比较的次数与记录的初始排列次序无关的是____。
A. 希尔排序 B. 起泡排序 C. 插入排序 D. 选择排序
2. 设有1000个无序的元素,希望用最快的速度挑选出其前10个最大的元素,最好选用____排序法。
A. 起泡排序 B. 快速排序 C. 堆排序 D. 基数排序
3. 在待排序的元素序列基本有序的前提下,效率最高的排序方法是____。
A. 插入排序 B. 选择排序

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧