求助Vigenere加密问题~~~~

flytoneptune 2011-06-06 11:37:10
这是左飞老师的《c++数据结构原理与经典问题求解》一书里的Vigenere加密问题的代码,我照着敲到vs2010里,然后修改了一下,编译运行没问题,只是运行到“密文:”这里时就不动了,请求各位大虾们帮助呐!!!
#include "DouListNode.h"
#include "DouList.h"
#include <iterator>
#include "ctime"
#include <string>
#include <list>
#include <iostream>
using namespace std;

void main()
{
srand((unsigned)time(NULL));
DouList<char> planText;
DouList<char> cryptograph;
DouList<int> key;
DouList<char> trans;
int i;

planText.SetBegin();
planText.AddTail('Y');
planText.AddTail('o');
planText.AddTail('u');
planText.AddTail('a');
planText.AddTail('r');
planText.AddTail('e');
planText.AddTail('i');
planText.AddTail('n');
planText.AddTail('d');
planText.AddTail('a');
planText.AddTail('n');
planText.AddTail('g');
planText.AddTail('e');
planText.AddTail('r');
planText.AddTail('!');

planText.SetBegin();
cout<<"明文:"<<'\t';
for(i=0;i<planText.GetCount();i++)
cout << planText.GetNext() << "*";
cout<<endl<<endl;

key.SetBegin();
for(i=0;i<15;i++)
key.AddTail( rand()%50 );
cout<<"密钥:"<<'\t';
for(i=0;i<key.GetCount();i++)
cout << key.GetNext() << "*";
cout<<endl<<endl;

key.SetBegin();
planText.SetBegin();
cryptograph.SetBegin();
for(int z=0;z<planText.GetCount();z++)
cryptograph.AddHead(char (key.GetNext()+planText.GetNext()) );
cryptograph.SetBegin();
cout<<"密文:"<<'\t';
for(int k=0;k<cryptograph.GetCount();k++)
cout << cryptograph.GetNext();
cout<<endl<<endl;

cryptograph.SetBegin();
key.SetBegin();
planText.SetBegin();
trans.SetBegin();
for(i=0;i<planText.GetCount();i++)
trans.AddHead( cryptograph.GetPrior() - key.GetNext() );
trans.SetBegin();
cout<<"解密后:"<<'\t';
for(i=0;i<trans.GetCount();i++)
cout << trans.GetNext();
cout<<endl<<endl;
}
=========================================================

双向循环链表DouListNode类的定义及实现代码如下:
#ifndef DOULISTNODE_H
#define DOULISTNODE_H
#include <iostream>
using namespace std;

template <class T>
class DouListNode
{
T data;
DouListNode<T> *link;
DouListNode<T> *prior;
public:
DouListNode():link(NULL),prior(NULL) {}
DouListNode( T value ):link(NULL),prior(NULL),data(value) {}
~DouListNode() {}
void SetLink(DouListNode<T> *next);
void SetPrior(DouListNode<T> *pre);
DouListNode<T>* GetLink();
DouListNode<T>* GetPrior();
T& GetData();
};
template <class T>
void DouListNode<T>::SetLink(DouListNode<T> *next) // 设置link的值
{
link = next;
}
template <class T>
void DouListNode<T>::SetPrior(DouListNode<T> *pre) // 设置prior的值
{
prior = pre;
}
template <class T>
DouListNode<T>* DouListNode<T>::GetLink() // 返回当前结点的后继结点的指针
{
return link;
}
template <class T>
DouListNode<T>* DouListNode<T>::GetPrior() // 返回当前结点的前驱结点的指针
{
return prior;
}
template <class T>
T& DouListNode<T>::GetData() // 返回结点中保存的数据
{
return data;
}
#endif



============================================
DouList类的定义及实现代码如下:#include "DouListNode.h"
#include "DouListNode.h"
#include <iostream>
using namespace std;

template <class T>
class DouList
{
DouListNode<T> *head;
DouListNode<T> *tail;
DouListNode<T> *cur;
public:
DouList();
~DouList() {}
bool AddTail( T value ); // 在表尾插入一个新节点
bool AddHead( T value ); // 在表头结点后插入新节点
void RemoveThis( bool direction ); // 把cur指向的结点删除,删除后cur移动的方向有direction决定
void RemoveAll();
int GetCount(); // 获得当前链表中的结点个数,不包括表头结点
bool IsEmpty(); // 判定链表是否为空
DouListNode<T>* GetHead(); // 返回head指针
DouListNode<T>* GetTail();
DouListNode<T>* GetCur();
void InsertAfter( T value );
T GetNext(); // 获得cur指向的结点中的数据,并将cur向link方向移动
T GetPrior(); // 获得cur指向的结点中的数据,并将cur向prior方向移动
void TowardCur(); // 使cur向link方向移动
void BackCur(); // 使cur向prior方向移动
void SetBegin(); // 置cur到表头处
};
template< class T >
DouList<T>::DouList()
{
head=tail=new DouListNode<T>;
cur=NULL;
head->SetLink(head);
head->SetPrior(tail);
}
template<class T>
bool DouList<T>::AddTail(T value)
{
DouListNode<T> *add = new DouListNode<T> (value);
tail->SetLink(add);
add->SetPrior(tail);
tail = tail->GetLink();
tail->SetLink(head);
head->SetPrior(add);
if(tail != NULL)
return true;
else
return false;
}
template<class T>
bool DouList<T>::AddHead(T value)
{
DouListNode<T> *add = new DouListNode<T> (value);
head->SetLink(add);
add->SetPrior(head);
add->SetLink( head->GetLink() );
head->GetLink()->SetPrior(add);
if( tail == head )
tail = tail->GetLink();
if( add != NULL )
return true;
else
return false;
}
template <class T>
void DouList<T>::RemoveThis(bool direction)
{
if(cur == head)
{
if(direction==0)
cur = cur->GetLink();
else
cur = cur->GetPrior();
}

DouListNode<T> *preCur=NULL;
DouListNode<T> *nextCur=NULL;
preCur = cur->GetPrior();
nextCur = cur->GetLink();

preCur->SetLink(cur->GetLink() );
nextCur->SetPrior(cur->GetPrior() );

if(direction==0)
cur = nextCur;
else
cur = preCur;
}
template <class T>
void DouList<T>::RemoveAll()
{
SetBegin();
for(int i=0;i<GetCount();i++)
RemoveThis(0);
cur = head;
}
template <class T>
int DouList<T>::GetCount()
{
int num=0;
DouListNode<T> *here=cur;
while(cur->GetLink() != here)
{
cur = cur->GetLink();
num++;
}
cur = here;
return num;
}
template <class T>
bool DouList<T>::IsEmpty()
{
return (head == head->GetLink() );
}
template <class T>
DouListNode<T>* DouList<T>::GetHead()
{
return head;
}
template <class T>
DouListNode<T>* DouList<T>::GetTail()
{
return tail;
}
template <class T>
DouListNode<T>* DouList<T>::GetCur()
{
return cur;
}
template<class T>
void DouList<T>::InsertAfter(T value)
{
DouListNode<T> *add = new DouListNode<T> (value);
DouListNode<T> *nextCur = cur->GetLink();

cur->SetLink(add);
add->SetPrior(cur);
add->SetLink(nextCur);
nextCur->SetPrior(add);

if(cur == tail)
tail = cur->GetLink();
}
template<class T>
T DouList<T>::GetNext()
{
if(cur == head)
cur = cur->GetLink();
T num = cur->GetData();
cur = cur->GetLink();
return num;
}
template<class T>
T DouList<T>::GetPrior()
{
if(cur == head)
cur = cur->GetPrior();
T num = cur->GetData();
cur =cur->GetPrior();
return num;
}
template<class T>
void DouList<T>::TowardCur()
{
cur = cur->GetLink();
}
template<class T>
void DouList<T>::BackCur()
{
cur = cur->GetPrior();
}
template<class T>
void DouList<T>::SetBegin()
{
cur = head;
}
...全文
122 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
flytoneptune 2011-07-25
  • 打赏
  • 举报
回复
搞清楚了,原来是在定义addHead()函数时出错了
luciferisnotsatan 2011-06-07
  • 打赏
  • 举报
回复
单步调试下
c_losed 2011-06-07
  • 打赏
  • 举报
回复
对照源码
如果觉得没问题 下断点 debug调试

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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