源程序如下:
#以下源程序编译环境为VC 2005
**使用链表结构编写此练习**
BaseString.h
#pragma once
struct Node // 链表中的节点结构
{
char item;
Node * next;
};
class BaseString
{
protected: // 派生类可以使用这些指针成员
Node * front; // 头节点指针
Node * rear; // 尾节点指针
Node * current; // 当前节点指针
public:
BaseString(void);
BaseString(BaseString & bs);
virtual ~BaseString(void);
BaseString & operator=(BaseString & bs); // 赋值操作符重载不能定义成friend
void Get();
void Show();
};
BaseString.cpp
#include <iostream>
#include "BaseString.h"
using std::cout;
using std::cin;
using std::endl;
BaseString::BaseString(void)
{
front = NULL;
rear = NULL;
current = new Node;
front = current; // 设置front指向当前的第一个节点
}
BaseString::BaseString(BaseString & bs) // 自定义复制构造函数(复制链表)
{
bs.current = bs.front;
front = NULL;
rear = NULL;
current = new Node;
front = current;
if (bs.front == bs.rear) // 只存在一个节点时
{
current->item = bs.front->item;
rear = current;
}
else
{
while (bs.current != bs.rear)
{
current->item = bs.current->item; // 复制源链表中的数据到新链表中
rear = new Node; // 为新生成的链表申请空间并串接
rear->next = NULL;
current->next = rear;
current = rear;
bs.current = bs.current->next;
if (bs.current == bs.rear)
{
current->item = bs.current->item;
current->next = NULL;
break;
}
}
}
}
BaseString::~BaseString(void)
{
if (rear != NULL) // 若链表为空则不析构
{
Node * temp;
current = front;
while(current != rear)
{
temp = current;
current = current->next;
delete temp;
if (current == rear)
delete current;
}
}
}
BaseString & BaseString::operator=(BaseString & bs)
{
if (this == &bs)
return *this;
else
{
if (rear != NULL) // 如果此链表不为空
{
Node * temp; // 首先释放掉原先链表占用的空间
current = front;
while(current != rear)
{
temp = current;
current = current->next;
delete temp;
if (current == rear)
delete current;
}
}
bs.current = bs.front;
front = NULL;
rear = NULL;
current = new Node;
front = current;
if (bs.front == bs.rear)
{
current->item = bs.front->item;
rear = current;
}
else
{
while (bs.current != bs.rear)
{
current->item = bs.current->item; // 复制源链表中的数据到新链表中
rear = new Node; // 为新生成的链表申请空间并串接
rear->next = NULL;
current->next = rear;
current = rear;
bs.current = bs.current->next;
if (bs.current == bs.rear)
{
current->item = bs.current->item;
current->next = NULL;
break;
}
}
}
return *this;
}
}
void BaseString::Get()
{
char c;
c = cin.get();
if (c != '/n')
{
current->item = c;
rear = current; // 只要读入了非'/n'的字符,rear就不为NULL
c = cin.get();
while (c != '/n')
{
rear = new Node;
rear->next = NULL;
current->next = rear;
current = rear;
current->item = c;
c = cin.get();
}
}
}
void BaseString::Show()
{
if (rear == NULL) // 检验是否为空链表
cout << "**************/nNO INFORMATION/n**************";
else if (front == rear) // 检验是否front,rear同指向一个节点(即此时只有一个节点)
cout << front->item;
else
{
current = front;
while (current != rear)
{
cout << current->item;
current = current->next;
if (current == rear)
{
cout << current->item;
break;
}
}
}
}
ReString.h
#pragma once
#include "BaseString.h"
class ReString : virtual public BaseString
{
public:
ReString(void);
ReString(ReString & bs);
virtual ~ReString(void);
ReString & operator=(ReString & rs);
void Reverse(); // 字符反转成员函数
};
ReString.cpp
#include <iostream>
#include "ReString.h"
ReString::ReString(void) : BaseString()
{
}
ReString::ReString(ReString & bs) : BaseString(bs)
{
}
ReString::~ReString(void)
{
}
ReString & ReString::operator=(ReString & rs)
{
if (this == &rs)
return *this;
else
{
if (rear != NULL) // 链表不为空
{
Node * temp;
current = front;
while(current != rear)
{
temp = current;
current = current->next;
delete temp;
if (current == rear)
delete current;
}
}
rs.current = rs.front;
front = NULL;
rear = NULL;
current = new Node;
front = current;
if (rs.front == rs.rear) // 只存在一个节点时
{
current->item = rs.front->item;
rear = current; // 使rear不为NULL
}
else
{
while (rs.current != rs.rear)
{
current->item = rs.current->item;
rear = new Node;
rear->next = NULL;
current->next = rear;
current = rear;
rs.current = rs.current->next;
if (rs.current == rs.rear)
{
current->item = rs.current->item;
current->next = NULL;
break;
}
}
}
return *this;
}
}
void ReString::Reverse() // 反转链表
{
Node * temp = rear; // 保存最初链表的rear节点
if (front != rear) // 保证链表有两个或两个以上的节点
{
while (temp != NULL) // 保证此链表非空
{
current = front; // 重置当前current指向为链表第一个节点
if (current->next == rear) // 判断当前是否为反转最后一个链表节点
{
rear->next = current;
rear = current;
current->next = NULL;
front = temp;
break;
}
while (current->next != rear) // 此循环结束时current位于rear-1个节点处
{
current = current->next;
}
rear->next = current;
rear = current; // 链表反转结束
}
}
}
CopyString.h
#pragma once
#include "BaseString.h"
class CopyString : virtual public BaseString
{
public:
CopyString(void);
CopyString(CopyString & cs);
virtual ~CopyString(void);
CopyString & operator=(CopyString & cs);
void Copy(CopyString & cs); // 实现字符的copy功能
};
CopyString.cpp
#include <iostream>
#include "CopyString.h"
CopyString::CopyString(void) : BaseString()
{
}
CopyString::CopyString(CopyString & cs) : BaseString(cs)
{
}
CopyString::~CopyString(void)
{
}
CopyString & CopyString::operator=(CopyString & cs)
{
if (this == &cs)
return *this;
else
{
if (rear != NULL) // 链表不为空
{
Node * temp;
current = front;
while(current != rear)
{
temp = current;
current = current->next;
delete temp;
if (current == rear)
delete current;
}
}
cs.current = cs.front;
front = NULL;
rear = NULL;
current = new Node;
front = current;
if (cs.front == cs.rear) // 只存在一个节点时
{
current->item = cs.front->item;
rear = current;
}
else
{
while (cs.current != cs.rear)
{
current->item = cs.current->item;
rear = new Node;
rear->next = NULL;
current->next = rear;
current = rear;
cs.current = cs.current->next;
if (cs.current == cs.rear)
{
current->item = cs.current->item;
current->next = NULL;
break;
}
}
}
return *this;
}
}
void CopyString::Copy(CopyString & cs)
{
if (cs.rear == NULL) // 源链表为空
std::cout << "/nThe Source String is empty!!/n";
else
{
if (rear != NULL)
{
Node * temp;
current = front;
while(current != rear)
{
temp = current;
current = current->next;
delete temp;
if (current == rear)
delete current;
}
}
cs.current = cs.front;
front = NULL;
rear = NULL;
current = new Node;
front = current;
if (cs.front == cs.rear)
{
current->item = cs.front->item;
rear = current;
}
else
{
while (cs.current != cs.rear)
{
current->item = cs.current->item;
rear = new Node;
rear->next = NULL;
current->next = rear;
current = rear;
cs.current = cs.current->next;
if (cs.current == cs.rear)
{
current->item = cs.current->item;
current->next = NULL;
break;
}
}
}
}
}
CmpString.h
#pragma once
#include "BaseString.h"
class CmpString : virtual public BaseString
{
public:
CmpString(void);
CmpString(CmpString & cms);
virtual ~CmpString(void);
CmpString & operator=(CmpString & cms);
void Compare(CmpString & cms); // 进行字符串比较的成员函数
};
CmpString.cpp
#include <iostream>
#include "CmpString.h"
CmpString::CmpString(void) : BaseString()
{
}
CmpString::CmpString(CmpString & cms) : BaseString(cms)
{
}
CmpString::~CmpString(void)
{
}
CmpString & CmpString::operator=(CmpString & cms)
{
if (this == &cms)
return *this;
else
{
if (rear != NULL) // 链表不为空
{
Node * temp;
current = front;
while(current != rear)
{
temp = current;
current = current->next;
delete temp;
if (current == rear)
delete current;
}
}
cms.current = cms.front;
front = NULL;
rear = NULL;
current = new Node;
front = current;
if (cms.front == cms.rear) // 只存在一个节点时
{
current->item = cms.front->item;
rear = current;
}
else
{
while (cms.current != cms.rear)
{
current->item = cms.current->item;
rear = new Node;
rear->next = NULL;
current->next = rear;
current = rear;
cms.current = cms.current->next;
if (cms.current == cms.rear)
{
current->item = cms.current->item;
current->next = NULL;
break;
}
}
}
return *this;
}
}
void CmpString::Compare(CmpString & cms)
{
if (rear == NULL && cms.rear == NULL) // 如果两个链表都为空
std::cout << "Two Empty Strings!!";
else
{
current = front;
cms.current = cms.front;
while (1)
{
if ((current == rear && cms.current != cms.rear) || (current != rear && cms.current == cms.rear))
{
std::cout << "The Different Strings!";
break;
}
if (current->item != cms.current->item)
{
std::cout << "The Different Strings!";
break;
}
if (current == rear && cms.current == cms.rear)
{
if (current->item == cms.current->item)
{
std::cout << "The Same Strings!";
break;
}
else
{
std::cout << "The Different Strings!";
break;
}
}
current = current->next;
cms.current = cms.current->next;
}
}
}
NewString.h
#include "ReString.h"
#include "CopyString.h"
#include "CmpString.h"
#pragma once
class NewString : public ReString, public CopyString, public CmpString
{
public:
NewString(void);
NewString(NewString & ns);
virtual ~NewString(void);
NewString & operator=(NewString & ns);
};
NewString.cpp
#include <iostream>
#include "NewString.h"
NewString::NewString(void) : BaseString(), ReString(), CopyString(), CmpString() // 由于BaseString是虚基类,所以这里也要调用它的构造函数(无参数)
{
}
NewString::NewString(NewString & ns) : BaseString(ns)
{
}
NewString::~NewString(void)
{
}
NewString & NewString::operator=(NewString & ns)
{
if (this == &ns)
return *this;
else
{
if (rear != NULL) // 链表不为空
{
Node * temp;
current = front;
while(current != rear)
{
temp = current;
current = current->next;
delete temp;
if (current == rear)
delete current;
}
}
ns.current = ns.front;
front = NULL;
rear = NULL;
current = new Node;
front = current;
if (ns.front == ns.rear) // 只存在一个节点时
{
current->item = ns.front->item;
rear = current;
}
else
{
while (ns.current != ns.rear)
{
current->item = ns.current->item;
rear = new Node;
rear->next = NULL;
current->next = rear;
current = rear;
ns.current = ns.current->next;
if (ns.current == ns.rear)
{
current->item = ns.current->item;
current->next = NULL;
break;
}
}
}
return *this;
}
}
Main.cpp
#include <iostream>
#include "ReString.h"
#include "CopyString.h"
#include "CmpString.h"
#include "NewString.h"
using std::cout;
using std::cin;
using std::endl;
int main()
{
NewString str1;
cout << "Input String #1:/n";
str1.Get();
NewString str2;
cout << "Input String #2:/n";
str2.Get();
cout << "/nCompare the two Strings: ";
str1.Compare(str2);
cout << "/n/nReversed String #1:/n";
str1.Reverse();
str1.Show();
cout << "/n/nCopied String #2 to String #1./n";
str1.Copy(str2);
cout << "/nString #1:/n";
str1.Show();
cout << "/nString #2:/n";
str2.Show();
cout << "/n/nCompare the two Strings: ";
str1.Compare(str2);
cout << endl << endl;
return 0;
}
辛苦了!!