一个链表小程序

源程序如下:

#以下源程序编译环境为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;

}

    

辛苦了!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值