试写出用单链表表示的字符串类及字符串结点类的定义,并依次实现它的构造函数、以及计算串长度、串赋值、判断两串相等、求子串、两串连接、求子串在串中位置等7个成员函数。要求每个字符串结点中只存放-字符。
解 //用单链表表示的字符串类stringl的头文件string1.h#include const int maxLen = 300; //字符串最大长度为300 (理论上可以无限长)class stringl {public: stringl(); //构造空字符串 stringl ( char * obstr ); //从字符数组建立字符串 ~stringl (); //析构函数 int Length () const { return curLen; } //求字符串长度 stringl & operator = ( stringl& ob ); //串赋值 int operator == ( stringl& ob ); //判两串相等 char& operator [] (inti); //取串中字符 stringl& operator ( )( int pos, int len ); //取子串 stringl& operator+= ( stringl& ob ); //串连接 int Find ( stringl& ob ); //求子串在串中位置(模式匹配) friend ostream& operator << ( ostream& os, stringl& ob ); friend istream& operator >>( istream& is, stringl& ob );private: ListNode*chList; //用单链表存储的字符串 int curLen; //当前字符串长度}//单链表表示的字符串类stringl成员函数的实现,在文件string1.cpp中#include #include "stringl.h"stringl : stringl(){ //构造函数 chList = new ListINode ( '\O' ); curLen = 0;}stringl :: stringl( char *obstr ) { //复制构造函数 curLen= 0; ListNode *p = chList = new ListNode ( *obstr ); while ( *obstr!= ^0' ) { obstr++; p= p->link = new ListNode ( *obstr );curLen++; }}stringl& stringl :: operator = ( stringl& ob){ //串赋值 ListNode *p = ob.chList; ListNode *q = chList = new ListNode ( p->data ); curLen = ob,curLen; while(p->data!= °0') { p=p->link; q= q->link = new ListNode (p ->data ); }return *this;}int stringl :: operator == ( stringl& ob ){ //判两串相等 if( curLen != ob.curLen ) return 0; ListNode *p = chList, *q = ob.chList; for( inti=0;i< curLen; i++ ) if( p->data != q->data ) return 0; else{p=p->link; q= q->link; } return 1; } char& stringl :: operator [] ( inti) { //取串中字符 if(i>= 0&& i < curLen) { ListNode *p= chList; int k= 0; while(p != NULL &&klink; k+t; } if(p !- NULL ) return p->data;}return'0';}stringl& stringl :: operator( )( int pos, int len ) { //取子串 stringl temp; if(pos>= 0&& len>= 0 && pos < curLen && pos + len- 1 < curLen){ ListNode *q, *p = chList; for(intk=0;k< pos; k++;)p= p->link; //定位于第pos结点. q = temp.chList = new ListNode( p->data ); . for(inti= 1;i< len;i++ ){ //取长度为len 的子串 p= p->link; q= q->link = new ListNode ( p ->data );} q->link = new ListNode(^0' ); //建立串结束符temp.curLen=len;} else { temp.curLen= 0; temp.chList = new ListNode ('0'); } return *temp;} stringl& stringl :: operator += ( stringl& ob) { //串连接 if( curLen + ob.curLen > maxLen ) len = maxLen - curLen; else len = ob.curLen; //传送字符数 ListNode *q = ob.chList, *p = chList; for(intk= 0;k< curLen- l;k++;)p= p->link; //this串的串尾. k=0; for(k=0;klink = new ListNode ( q->data ); q= q->link; } p->link = new ListNode ( '\0' ); }int stringl :: Find ( stringl& ob) { //求子串在串中位置(模式匹配) int slen = curLen, oblen = ob.curLen, i = slen - oblen; stringl temp = this; while(i>-l) if( temp( i, oblen ) - ob ) break; else i-- ; return i;}
举一反三
- 两个字符串相等的条件是( )。 A: 两串的长度相等 B: 两串包含的字符相同 C: 两串长度相等,并且两串包含的字符相同 D: 两串长度相等,并且对应位置上的字符相同
- 两个字符串相等的条件是()。 A: 两串的长度相等,并且对应位置上的字符相同 B: 两串的长度相等 C: 两串的长度相等,并且两串包含的字符相同 D: 两串包含的字符相同
- strcmp()函数用来()。 A: 求字符串长度 B: 比较字符 C: 求子串 D: 字符串拷贝
- 两个串相等的充分必要条件是() A: 两串长度相等 B: 两串所包含的字符集合相等 C: 两串长度相等且对应位置的字符相等 D: 两串长度相等且包含的字符字符相等
- 字符串采用链表存储方式时,每个节点存储多个字符有助于提高存储密度。若采用节点大小相同的链表存储串,则串比较、求子串、串连接、串替换等串的基本运算中,()。 A: 进行串的比较运算最不方便 B: 进行求子串运算最不方便 C: 进行串连接最不方便 D: 进行串替换最不方便
内容
- 0
两个字符串相等的条件是:两串的长度相等,并且两串包含的字符相同。
- 1
两个字符串相等的充分必要条件是两串的长度相等且两串中对应位置的字符也相等。
- 2
求字符串T在字符串S中首次出现的位置称为()。 A: 串的模式匹配 B: 求子串 C: 求串的长度 D: 串的连接
- 3
两个字符串相等的条件是( )。 A: 两个串的长度相等 B: 两个串的长度相等,并且两个串包含的字符相同 C: 两个串包含的字符相等 D: 两个串的长度相等,并且对应位置上的字符相同
- 4
字符串的长度是()。? 串中不同字母的个数|串中所含字符的个数|串中所含字符的个数且字符个数大于零|串中不同字符的个数