??xml version="1.0" encoding="utf-8" standalone="yes"?> [1] 1 复制 char* strcpy (char *s1, const char *s2); char* strncpy (char *s1, const char *s2, size_t len); void* memmove (void *s1, const void *s2, size_t len); size_t strxfrm (char *s1, const char *s1, size_t len); char* strcat (char *s1, const char *s2); char* strncat (char *s1, const char *s2, size_t len); int strcmp (const char *s1, const char *s2); int strncmp (const char *s1, const char *s2, size_t len); int strcoll (const char *s1, const char *s2); ?/span>s中查扄定字W?/span>(字节?/span>)chW一ơ出现的位置 char* strrchr (const char *s, int ch); char* strstr (const char *s1, const char *s2); size_t strspn (const char *s1, const char *s2); size_t strcspn (const char *s1, const char *s2); char* strpbrk (const char *s1, const char *s2); char* strtok (char *s1, const char *s2); size_t strlen (const char *s); void* memset (void *s, int val, size_t len); char* strerror (int errno);
在本文中我们不想涉及到很_深的技术,ME微懂一点电脑和Internet知识的h都可以理解本的内容。Micorosoftqؓ那些希望掌握
.NET
的公司执行官、IT领导和程序员?
提供了更多的资源?
什么是Microsoft
.NET
?
Microsoft
.NET
是Microsoft?/font>
XML
Web服务q_?/font>
.NET
包含了徏立和q行Z
XML
?/font>
软g
所需要的全部部g?
Microsoft
.NET
解决了下面这些当?/font>
软g
开发中的一些核心问题:
●互操作?Interoperability)、集成?Integration)和应用程序的可扩展?extensibility)太难实现而且代h很高。Microsoft
.NET
依靠
XML
(一个由World Wide Web Consortium(W3C)理的开放标?消除了数据共享和
软g
集成的障?
●无数具有相当竞争力的私?/font>
软g
技术?/font>
软g
的集成变得非常复杂。而Microsoft
.NET
建立在一个开攄标准上,它包含了所?/font>
~程
语言?
●当l端用户使用
软g
Ӟ他们总觉得不够简ѝ有时甚x到很沮Q因Z们无法在E序之间方便地共享数据或是无法对能访问的数据q行操作?/font>
XML
使数据交换变得容易了Qƈ?/font>
.NET
软g
可以使得用户只要一得到数据p对它们进行操作?
●终端用户们在用Web的时候,无法对自q个h信息和数据进行控Ӟq导致了个h隐私和安全泄漏问题。而Microsoft
.NET
提供了一套服务,使用户可以管理他们的个h信息Qƈ且控制对q些信息的访问?
?COM公司和Web站点开发者们很难为用户们提供_的有价值的数据Q至有一部分原因是由于他们的应用E序和服务无法很好地和其他程序和服务合作Q只是一个不和外界连接的信息孤岛。而Microsoft
.NET
的设计宗旨就是ؓ了来自于多个站点和公司的数据或服务能够整合h?
如同MS-DOS和Windows一P
.NET
大大改变我们的计算领域。MS-DOS使得个h电脑在商业和家庭中广为接受;Windows增强了用L囑Ş界面Q其成为首选的?/font>
软g
交互方式Q最l得图形界面成Z人电脑的L。?/font>
.NET
则要?/font>
XML
Web服务变成日后的主计模式?
XML
Web服务是徏立在
XML
数据交换基础上的
软g
模型Q它帮助应用E序、服务和讑֤一起工作。用
XML
q行׃n的数据,彼此之间独立Q但同时又能够松耦合地连接到一个执行某特定d的合作组?
想了?/font>
XML
Web服务如何工作Q最方便的方法就是把它和D
游戏
作比较?/font>
XML
Web服务和拼?/font>
游戏
的拼块一h一些独立的单元。后者用一个标准的Ҏ怺咬合在一P
XML
Web服务与这cMQ但它是通过
XML
message实现怺交互的。当你把拼块拼在一hQ你得C一个对象:一q房子、一艘船或一枉机。同P当你?/font>
XML
Web服务l合在一hQ你得C一个完成某特定d?/font>
软g
解决Ҏ。同一拼块可以用在很多不同对象中,而一?/font>
XML
Web服务同样也可以用在不同的Ҏl中Q作Z同Q务解x案的一个组成部分?
XML
Web服务使开发者能够对他们所要的E序的来源进行选择Q可以自己创建或购买E序的功能块Q同样也可以选择是让自己的方案用其他的
XML
Web服务Q还是让其他的程序用自q服务。这意味着一个公怸必ؓ了给客户一个完整的解决Ҏ而不得不提供Ҏ的每一个组成部分?
XML
Web服务除了个服务相互之间独立以外,对访问它们的讑֤而言也是独立的。与独立应用E序不同的是Q?/font>
XML
Web服务q没有束~于某一特定?/font>
~程
语言或商业应用程序或者是某一在线服务。这l了l端用户_的自由,使其可以使用M讉K讑֤Q从台式电脑到移动电话都可以?
.NET
战略
Microsoft
.NET
E序员们设计~写的是
XML
Web服务Q而不是服务器或客L的独立应用程序。他们把q些服务l合成松耦合Q相互协作的
软g
,
XML
Web服务之间使用
XML
messagingq行通讯。ؓ了做到这一点,E序员需要:
1.一?/font>
软g
q_Q用于徏立一U新的完整的个h用户l验?
2.一?/font>
~程
模型和工P用以建立和整?/font>
XML
Web服务?
3.一套能为应用程序和服务提供基础的可
~程
的服?
Microsoft?/font>
.NET
战略q准了q三炏V?
.NET
包括Q?
?/font>
.NET
q_Q这是一?/font>
~程
工具和基本构Ӟ用来创徏、发布、管理和整合
XML
Web服务
?/font>
.NET
体验Q这是终端用L以和
.NET
交互的手D?br />
.NET
q_
Microsoft的^台是q于创建和q行
XML
Web服务l成的。它包含了下面四个组Ӟ
.NET
框架和Visual Studio
.NET
:q些是开发h员用来生?/font>
XML
Web服务的工兗?/font>
.NET
框架是Microsoft
.NET
q_核心中的一?/font>
~程
接口QVisual Studio
.NET
是一套多语言pd?
~程
工具?
服务器基本结?Server Infrastructure):
.NET
的服务器基本l构是一pd用于生成、发布和操作
XML
Web服务的基E序Q包括Windows和各U?/font>
.NET
企业服务器。主要的技术包括对
XML
、scale-out及跨E序和服务的商务程(business process orchestration)的支持。这些服务器包括有:
●Application Center 2000Q用于scale-out solutions
●BizTalk Server 2000Q用于创建和理Z
XML
的跨E序和服务的商务程(business process orchestration across applications and services)
●Host Integration Server 2000Q用来访问主Z的数据和应用E序
●Mobile Information 2001 ServerQɿUd讑֤Q比如移动电话,也能使用q些应用E序
?/font>
SQL
Server
2000储存和检索结构化?a class="Channel_KeyLink" >XML数据
Building Block Services: Building Block Services是一套以用户Z心的XML Web服务Q它把用h据的控制权从应用E序Ud了用h上,使Web有了一个翻天覆地的变化Q做CE序、服务和讑֤之间的简单性及一致性,q保证了所有的交易都必d到用L同意。这些服务包含了Passport(用于用户w䆾验证)、服务之间的消息传递、文件存储、用户个性设|的理、日历管理和其他一些功能。Microsoft在那些?/font>.NET基本l构赯关重要作用的领域内提供一些块构徏服务(building block services)。大量的合作伙伴和开发商对q些块构建服务作重要的扩展?
讑֤(smart device): .NET利用软g使智能设备,诸如手提电脑、轻便电话?/font>游戏操纵台等都能够在.NET世界中得以用?
一个智能设备应该:
●对用户要智能:能根据用L.NETw䆾、档?profile)和有x据简化用L工作Q另外要对用L存在_的智能,能根据你的在与不在对通知(notification)作出调整?
●对|络要智能:负责带宽的限Ӟ支持应用E序的在U和U下两种使用模式Q知道有哪些有效的服务?
●对信息要智能:能在M地方、Q何时间访问、分析和操作数据?
●对其他的设备要Q能发现和报告其他智能设备、服务和Internet的存在;知道如何为其他设备提供服务;能够灉|方便CPC上访问信息?
●对软g和服务要Q能Ҏ表单的情况,最恰当地表现应用和数据Qؓl端用户提供合适的输入Ҏ和连接;?/font>XML、SOAP和UDDI来用Web服务Q对开发者来_要具有可~程性和扩展?
Microsoft的一?/font>软g使能够在讑֤上运行的Q它们包括Windows XP、Windows Me、Windows CE、嵌入式Windows?/font>.NET框架以及.NET Compact框架?
.NET体验(.NET experiences)
l端用户是通过.NET体验讉KXML Web服务的,q和现有的独立应用程序有点类|但在下列q些重要的方面是不同的:
?/font>.NET体验可用于多种讑֤我们无需为可能用的每一个设备编写一个不?/font>XML Web服务和不同的.NET体验Q?/font>.NET体验能够d用户选取讑֤的特征,l出一个恰当界面?
?/font>.NET体验使用XML Web服务?/font>.NET体验q入|络后就能有效地利用XML Web服务为用户带来额外的价|以更好地解决问题?
?/font>.NET体验是以用户Z心的.NET体验的焦点在l端用户Q用基于n份验证的块构建服务来为用户验证、参数设定、通知机制和用h据提供服务。因为用h据是由块构徏服务理的,而不是应用程序本w,所以用户就能控制他们自q数据Q能保障它的正确性,q且可以在不同的E序和服务之间协调数据?
Microsoft正在使最受欢q的四个产品q渡?/font>.NET体验。Microsoft Office XP为用h?/font>.NET体验斚w跨出了第一步。另外,MSNQ包括MSN Explorer本地客户端的使用Q正在创Z个基于消费者的.NET体验。Microsoft bCentral的小型商务入?business portal)正努力ؓ型事务(比如商品目录理)提供必要?/font>XML Web服务Q同时也使用一些重要的XML Web服务(比如eBay)。Visual Studio开发系l将为开发者们提供.NET体验Q可以在q些开发工具中直接得到MSDN信息?
.NET的好?
Microsoft .NET为程序员、商业领对{IT部门以及消费者带来了很多好处?
●相Ҏ_E序员是比较~Z的,雇用的费用也很高。然而Microsoft .NET?/font>~程工作变得更加ҎQ开发投资的回报率也最大化。开发者们可以创徏能重用的XML Web服务Q而不再是一个单一的程序;q些Web服务易于~程和调试,彼此之间怺独立Q通过XML message通讯及合作。所以对某一个服务的修改不会影响到其他的服务?
׃XML Web服务可以被很?/font>.NET体验共同使用Q所以对一个服务模块的有效更新Q也xC所有用这个模块的.NET体验。Q?/font>~程语言都可以用来编?/font>XML Web服务(如:C?/font>C++、Visual Basic、COBOL、Perl、Python和Java{?Q所以你的程序员可以选择他们最熟悉的语a?/font>~程Q这大大提高了开发效率。更值得一体的是,他们q没有因使用了不同的语言而失去跨服务或跨lg的调试能力?
●Microsoft .NET减少了程序员要写的代码量。一?/font>XML Web服务能适用于所以的讑֤Q不必再Mؓ每一个设备编写一个不同的版本。另外,显C特性与.NET体验分开以便以后加入新的接口技术,比如语音或手写识别,而不必去重写E序?
●Microsoft .NET开创了全新的商业模型,它得一个公司可以用多种Ҏ来把自己的技术商品化。据个例子来_一个通讯公司可以使用XML Web服务的方式提供语音信件和呼叫者ID的访问,让用户从一个即时消息程序、电子邮件或用户所选的其他信息~译器中讉KCqC息。技术提供商可以把他们现有的软g包{变ؓXML Web服务Qƈ把这些服务出售给需要这些功能第三方Q或是给.NET体验提供商,用以构徏新的软g包?br />
●Microsoft .NET允许IT部门使用其他提供商的XML Web服务Q减内部研发的开销Qƈ能提高工作效率?
●Microsoft .NET?用户界面友好"作了重新定义。终端用戯够徜徉于一个智能化的、个性化的InternetQ它能记住用L个h讄Qƈ在适当的时候,向用户用的讑֤上发送适当的数据?br />.NET如何改变计算
Microsoft .NET从Ҏ上改变我们的思考和使用电脑的方式。目?服务??桌面电脑"q两U概念占据了计算领域的统d位。然而Microsoft .NET是一U分布式计算范例Q它没有了传l上的服务器和桌面电脑的区别Q取而代之的是,计算的处理被攑֜最合适的地方q行Q可能是服务
器,或是PCQ也有可能是手提电脑以及其他讑֤。这是计算?
.NET的计模型对商务和终端用户都产生了重要媄响,但方法不同。对l端用户来说Q这个新计算模式更具个性化、综合程度更高,会给他们带来一U史无前例的C验。对商务来说Q这个模式改变了刉和销?/font>软g的方法,使IT成ؓ一个公司成功的重要贡献者,q徏立v新的商务模型?
对终端用L改变
q里有一个例子,说明?/font>.NET体验是如何对一个终端用户生媄响的?
BobQ一个不安的商务旅行者,在芝加哥下了飞机Q突然想起他竟忘了带上他的那部智能电话。这下完了,没了q电话他无法知道晚宴在哪里进行,无法知道原本打算在晚宴上见面的h的电话号码,更惨的是Q他无法在这个关键的会议之前再看一下重要的文g。但不用急,他从机场的租了一部智能电话,插入了自q卡。很快通过内置的Internetq接Q各U相关的重要数据全部被下载了下来Q现在他能访问他的所有信息,不光是日E安排和电话,q有所有通常用他的PC讉K到的所以文件?
不幸的是Q他在离开机场时不心在自动扶梯上l了一跤,脚踝严重扭伤Q这个月q已l是W二ơ了。无奈,他强忍疼痛要求电话接Rogerȝ的办公室Q听电话的是接待员Mildred姐。Bob通过电话认了自qw䆾Q他授权于Mildred姐Q让她访问自q所在位|和其他一些信息,以便使她可以在附q找一家整形外U诊所。Mildred能够知道哪家诊所正在营业Q有多远Q是否接受Bob的保险。Bob所要做的就是轻按电话上的按钮授权给她,Mildred在找到诊所后便会和ȝU时间?
与Mildred通话l束后,Bob用他的智能电话访问出UR服务Q查扄他最q的出租车,q确认目的地。接下来Bob只需爬进车内Q轻按电话的昄屏确认支付的费用卛_?
从用戯度来Ԍ.NET提供的好处即过了现在的独立的程序,也胜q了Ua的Web站点?/font>XML Web服务拥有传统?/font>软g功能Q如创徏文档、计数字、存储数据等。而且在下U后也能提供服务Q比如呼叫出URQ这q不需要CPU的参与?
从上面的例子我们可以看到Q?/font>XML Web服务使终端用户得C更ؓ个性化的、综合性的体验Q同时便捷也?/font>.NETl我们带来的一大好处?
对企业的改变
Bob那不走运的商务旅行结束了Q他y跚地回C?虽然那个晚宴非常成功Q但现在他不得不面对六个星期的n体治?。接下来QBob要提交费用报告。他拿出了他的PDAQ验明n份后QPDA列出了其信用卡上的支付纪录。他标出了与q次芝加哥之行有关的费用Q至于那些止痛药和寄Uh信g的费用,他标Z人开销。信用卡公司ؓ其生成必要的账单?
因ؓBob标记了一些个用,所以信用卡公司根据他指定的方法ؓBob生成一张个人帐单。在q个例子中,Bob使用的是直接从他银行账号中提qҎQ但同时他也要一份药费开支报告的拷贝。根据他的选择Q信用卡公司会Email发给他一个PDF文档QBob只需它打印出来卛_?
对于那些业务上的开支,信用卡公怼lBob的公司发Z张电子帐单,它被送到公司的会计部门,由公怼计Chris来处理。电子帐单到达时QChris会收C自动生成的EmailQ随后他d会计pȝ打开q䆾帐单。他仔细查每一W费用,没问题后Q他q行支付Q这也就是授权将一W金从公司的账户转移C用卡公司的̎户上?
从企业角度讲Q?/font>.NET能够自动地处理很多Q务,节约了员工的大量旉。当?/font>XML系l和XML Web服务q接h后,数据交换变得非常方便Q数据处理也变得轻而易举。在q个例子中,员工Bob和Chris分别只要单击一?同意"和启动一个事务处理,无需花大量的旉d写报销单或是往会计pȝ中手工录入数据,一切都变得非常之简单?
对企业和企业l端用户来说Q?/font>.NET预示q些?/font>XML Web服务衍生出来的应用程序有着很强的个性化和高度的整合性的特点Q同时它们适用于各U智能设备,h相当的灵zL?
什么东西没有变
管Microsoft .NETl计带来了一些翻天覆地的变化Q但q有很多东西依然没有改变.
●终端用户将依然使用熟悉的界面,像.NET体验中的Microsoft Office一栗这可以减少再培训的开支,也意味着用户可以马上开始?/font>.NET软g?
?/font>g上运行的q是象Windows、Unix、Windows CE和Palm OS一L操作pȝ。实际上Q?/font>.NET增加?/font>软g的运行场所Q但同时减少了开发的负担。由?/font>XML Web服务只?/font>XML与设备通信Q所以Q何智能设备都可以享用XML Web服务?
●对E序员来_他们依然可以使用他们原先熟悉?/font>~程语言?/font>.NETq_借助?/font>.NET框架的公paq行旉?CLR)使得用不同语a开发的XML Web服务之间也可以相互操作。有没有.NET体验问题不大Q你依旧可以用Visual Basic、Java、甚xCOBOL创徏XML Web服务。这U对~程语言的中立性意味着不用Zq入.NET世界而抛弃已有的投资?
●原先系l无需被替换。一部分的Microsoft .NET产品是Z能方便地现有的pȝ整合到新Q的XML Web服务?/font>.NET体验中去而设计的。Host Integration Server是个例子,它简化了对主机的讉K。再比如是BizTalk Server,它管理的商务程(business process orchestration)包括了对现有pȝ和数据格式的支持Qƈ会执行一些必要的转换Q将数据转成XML?
所以这U下一代的分布式计是建立在目前这一代基上的。Microsoft .NET不是我们所惌的那P对现在的应用软g作大规模的替换,而是一个自然的q化q程Q在原先的技术孤岛之间徏立了协作关系Q协同工作能力逐渐加强Q我们也从中受益无I?
ȝ
Microsoft .NET是Microsoft?/font>XML Web服务的^台。这是下一代的Internet计算模型Q各?/font>XML Web服务之间彼此是松耦合的,通过XMLq行通讯Q协同完成某一特定的Q务。Microsoft .NET战略提供了一个用以徏立新.NET体验?/font>软gq_、一?/font>~程模型、用以徏立和整合XML Web服务的工具以及一套可~程的Web接口?
现在我们正处于向.NET转变的过E中。Microsoft已经宣布?/font>.NET框架的第一个部?-.NETq_、Visual Studio.NET和一些块构徏服务以及最初的.NET体验。Microsoft在今q和明年中将会提供更多的工具和服务?/font>
]]>
用法Q?include <string.h>
功能Q由src所指内存区域复制count个字节到dest所指内存区域?br />
说明Qsrc和dest所指内存区域不能重叠,函数q回指向dest的指针?br />
举例Q?br />
// memcpy.c
#include <syslib.h>
#include <string.h>
main()
{
char *s="Golden Global View";
char d[20];
clrscr();
memcpy(d,s,strlen(s));
d[strlen(s)]=0;
printf("%s",d);
getchar();
return 0;
}
原型Qextern char *strchr(char *s,char c);
用法Q?include <string.h>
功能Q查扑֭W串s中首ơ出现字Wc的位|?br />
说明Q返回首ơ出现c的位|的指针Q如果s中不存在c则返回NULL?br />
举例Q?br />
// strchr.c
#include <syslib.h>
#include <string.h>
main()
{
char *s="Golden Global View";
char *p;
clrscr();
strchr(s,'V');
if(p)
printf("%s",p);
else
printf("Not Found!");
getchar();
return 0;
}
字W串s2复制?/span>s1指定的地址
void* memcpy (void *s1, const void *s2, size_t len);
?/span>s2的前len个字W?/span>(字节)复制?/span>s1中指定的地址, 不加'\0'
当源单元和目的单元缓冲区交P时?/span>
ҎE序当前的区域选项, ?/span>s2的前len个字W?/span>(字节)复制?/span>s1中指定的地址, 不加'\0'
2 q接
字W串s2q接?/span>s1N
字W串s2的前len个字W连接到s1N, 不加'\0'
3 比较
比较字符?/span>s1?/span>s2
int memcmp (const void *s1, const void *s2, size_t len);
?/span>s1?/span>s2的前len个字W?/span>(字节)作比?/span>
ҎE序当前的区域选项中的LC_COLLATE, 比较字符?/span>s1?/span>s2
4 查找
void* memchr (const void *s, int ch, size_t len);
在串s中查扄定字W?/span>ch最后一ơ出现的位置, r表示从串ּ?/span>
在串s1中查找指定字W串s2W一ơ出现的位置
q回s1中第一个在s2中不存在的字W的索引(find_first_not_of)
q回s1中第一个也?/span>s2中存在的字符的烦?/span>(find_first_of)
?/span>strcspncM, 区别是返回指针而不是烦?/span>
从串s1中分d׃s2中指定的分界W分隔开的记?/span>(token)
W一ơ调用时s1为需分割的字?/span>, 此后每次调用都将s1|ؓNULL,
每次调用strtokq回一个记?/span>, 直到q回NULL为止
5 其他
求字W串s的长?/span>
从s开始的len个字节置?/span>val
q回指向错误信息字符串的指针
]]>
Qi nclude <stdlib.h>
Qi nclude <string.h>
Qi nclude <time.h>
//获得prefix数组
int* GetPrefixValue(char* strPattern, int iPatternLen)
{
int i, j; /* i runs through the string, j counts the hits*/
int* prefix = (int*)malloc(iPatternLen*sizeof(int));
i = 1; j = 0;
prefix[0] = 0;
while(i<iPatternLen)
{
if(strPattern[i] == strPattern[j])
{
prefix[i] = ++j;
}
else
{
j = 0;
prefix[i] = j;
}
i++;
}
return prefix;
}
//q回target串在pattern串中W一ơ匹配的index
int KMPStringMatch(char* strPattern, int iPatternLen, char* strTarget, int iTargetLen, int* prefix)
{
int i = 0;
int j = 0;
while(i<iPatternLen && j<iTargetLen)
{
if(j==0 || strPattern[i]==strTarget[j])
{
i++; j++;
}
else
{
j = prefix[j];
}
}
free(prefix);
if(j==iTargetLen)
{
return i-j;
}
else
{
return -1;
}
}
int KMP(char* strPattern, char* strTarget)
{
int* prefix = GetPrefixValue(strPattern, strlen(strPattern));
int index = KMPStringMatch(strPattern, strlen(strPattern), strTarget, strlen(strTarget), prefix);
return index;
}
//在文本文件中查找target串出现的行数
int SearchInTxtFile(char* fileName, char* strTarget)
{
FILE* hFile = fopen(fileName, "r");
char str[1024];
int count = 0;
while(fgets(str, 1024, hFile))
{
if(KMP(str, strTarget)!=-1)
{
count++;
}
}
fclose(hFile);
hFile=NULL;
return count;
}
int main()
{
char ch;
char str1[] = "abcabcabctasksb,abTo";
char str2[] = "abc";
double t=clock();
printf("%d\n", KMP(str1,str2));
printf("耗时Q?f毫秒Q\n", (clock()-t));
t=clock();
printf("find %d \n", SearchInTxtFile("c:\\txt.txt", "NULL"));
printf("耗时Q?f毫秒Q\n", (clock()-t));
scanf("%c", &ch);
return 0;
}
#include <iostream>
using namespace std;
template<class T>
class Chain;
template<class T>
class ChainNode
{
friend class Chain<T>;
friend ostream& operator<<(ostream& out, const Chain<T>& x);
private:
T data;
ChainNode<T> *link;
};
template<class T>
class Chain{
public:
Chain(int p) {first = 0;};
~Chain();
bool IsEmpty() const {return first == 0;}
int Length() const;
bool Find(int k, T& x) const;
int Search(const T& x) const;
//Chain<T>& Delete(int k, T& x);
Chain<T>& Insert(int k, const T& x);
void Output(ostream& out = cout) const;
private:
ChainNode<T> *first; // 指向W一个节点的指针
};
template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x);
#endif // _CHAIN
在Chain.cpp中对Chain.h中声明的函数q行了定义,具体内容如下Q?br />
#include "Chain.h"
#include <iostream>
using namespace std;
template<class T>
Chain<T>::~Chain()
{
//链表的析构函?用于删除链表中的所有节?br /> ChainNode<T> *ptr = first;
while (ptr)
{
first = ptr->link;
delete ptr;
ptr = first;
}
}
template<class T>
int Chain<T>::Length() const
{
//q回链表中的元素L
int count = 0;
ChainNode<T> *ptr = first;
while (ptr)
{
++count;
ptr = ptr->link;
}
return count;
}
template<class T>
bool Chain<T>::Find(int k, T& x) const
{
//L链表中的Wk个元素,q将其传送至x
//如果不存在第k个元素,则返回falseQ否则返回true
if (k < 1)
{
return false;
}
int count = k;
ChainNode<T> *ptr = first;
while (count && ptr)
{
--count;
ptr = ptr->link
}
if (!ptr)
{
return false;
}
x = ptr->data;
return true;
}
template<class T>
int Chain<T>::Search(const T& x) const
{
//LxQ如果发现xQ则q回x的地址
//如果x不在链表中,则返?
int count = 1;
ChainNode<T> *ptr = first;
while(ptr && (ptr->data!=x))
{
++count;
ptr = ptr->link;
}
if (ptr)
{
return count;
}
else
{
return 0;
}
}
template<class T>
void Chain<T>::Output(ostream& out = cout) const
{
ChainNode<T> *ptr = first;
while (ptr)
{
out<<ptr->data<<" ";
ptr = ptr->link;
}
}
//重蝲<<q算W?br />template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
{
x.Output(out);
return out;
}
template<class T>
Chain<T>& Chain<T>::Insert(int k, const T& x)
{
ChainNode<T> *ptr = first;
int count = 0;
while (ptr && count < k)
{
++count;
ptr = ptr->link;
}
if (!ptr) //如果没到Wk个节?br /> {
}
else
{
//要插入的新节?br /> ChainNode<T>* cn = new ChainNode<T>;
cn->data = x;
cn->link = 0;
if (ptr->link==0) //到达了链表的l尾
{
ptr->link = cn;
}
else //没到辄?br /> {
cn->link = ptr->link;
ptr->link = cn;
}
}
return *this
}
在main.cpp中进行测试,试的内容很,但是刚开始就q行不了了。main.cpp内容如下Q?br />
#include "Chain.h"
using namespace std;
int main()
{
Chain<int> c;
cout<<c.Length();
return 0;
}
~译的时候没有问题,但是在连接的时候就出现了问题,报错如下Q?br />--------------------Configuration: Chain - Win32 Debug--------------------
Linking...
main.obj : error LNK2001: unresolved external symbol "public: __thiscall Chain<int>::~Chain<int>(void)" (??1?$Chain@H@@QAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall Chain<int>::Length(void)const " (?Length@?$Chain@H@@QBEHXZ)
Debug/Chain.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
Chain.exe - 3 error(s), 0 warning(s)
但是从报错信息来看,应该是在main.cpp中没有找到所用到的函?~Chain<int>(void)和Length()的定义,在main.cpp中一qC三个函数Q构造函数Chain()Q但是构造函数是在Chain.h中定义的Q所以编译器扑ֈ了其定义Q但是另外两个函数是在Chain.cpp中定义的Q而且目前报错没有扑ֈQ但是如果在main.cpp中引?include "Chain.cpp"Ӟ~译和连接就没有问题Q这p实了原来的估计是没有错的。我实在是不知道问题出现在哪里,所以希望哪位高手看出问题来的话Q请告诉我,多谢了!
#ifndef _CHAIN
#define _CHAIN
template<class T>
class ChainNode
{
friend class Chain<T>;
private:
T data;
ChainNode<T> *link;
};
template<class T>
class Chain{
public:
Chain()
{
first = 0;
};
~Chain();
bool IsEmpty() const {return first == 0;}
int Length() const;
bool Find(int k, T& x) const;
int Search(const T& x) const;
//Chain<T>& Delete(int k, T& x);
Chain<T>& Insert(int k, const T& x);
void Output(ostream& out = cout) const;
private:
ChainNode<T> *first; // 指向W一个节点的指针
};
#endif // _CHAIN
l果报错Q?br />--------------------Configuration: Chain - Win32 Debug--------------------
Compiling...
Chain.cpp
g:\work plan\c++ code practice\chain\chain.h(17) : error C2059: syntax error : '<'
g:\work plan\c++ code practice\chain\chain.h(21) : see reference to class template instantiation 'ChainNode<T>' being compiled
g:\work plan\c++ code practice\chain\chain.h(17) : error C2238: unexpected token(s) preceding ';'
g:\work plan\c++ code practice\chain\chain.h(21) : see reference to class template instantiation 'ChainNode<T>' being compiled
g:\work plan\c++ code practice\chain\chain.h(40) : error C2989: 'Chain' : template class has already been defined as a non-template class
g:\work plan\c++ code practice\chain\chain.h(17) : see declaration of 'Chain'
g:\work plan\c++ code practice\chain\chain.cpp(6) : error C2059: syntax error : '<'
g:\work plan\c++ code practice\chain\chain.cpp(6) : error C2588: '::~Chain' : illegal global destructor
g:\work plan\c++ code practice\chain\chain.cpp(6) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.
Chain.obj - 6 error(s), 0 warning(s)
感觉从代码来看应该是没有问题的,如果哪个高手看出问题来了请一定告诉我啊,如果知道~译不通过的原因也请一定要告诉我啊。没办法Q最后采用解决的办法是修改ChainNode的定义了Q定义ؓl构?)
template<class T>
struct ChainNode
{
T data;
ChainNode<T> *link;
};
反正l构体中的数据成员都是public的,至于讉K限制的实现就依靠q代器来实现了,g++的STL中的树结点不也是l构体吗Q?)