65,210
社区成员
发帖
与我相关
我的任务
分享
//=========================
//simnode.h
//=========================
#include <iostream>
#include <string>
using namespace std;
template <class Elem>
class SimNode
{
public:
Elem m_data; //数据域
int m_link; //指向下一个节点
};
//==========================
//simspace.h
//==========================
#include "simnode.h"
#define DefaultSize 20
template<class Elem>
class SimSpace
{
private:
int m_NumOfNodes; //节点数量
int m_first; //指向可利用空间的第一个节点
SimNode<Elem> *m_node; //节点数组
public:
SimSpace(int MaxSpaceSize = DefaultSize);
~SimSpace() {delete [] m_node;}
SimNode<Elem> *NodeArry() const;
int &getFreeNode(); //返回可利用空间表的第一个节点
int Allocate(); //分配一个节点,返回数组下标
void Deallocate(int &i); //释放节点i
int getNumNodes() const;
};
template<class Elem>
SimSpace<Elem>::SimSpace( int MaxSpaceSize )
{
m_NumOfNodes = MaxSpaceSize;
m_node = new SimNode<Elem> [m_NumOfNodes];
for(int i=0;i<m_NumOfNodes-1;i++)
m_node[i].m_link = i+1;
m_node[m_NumOfNodes-1].m_link = -1;
m_first = 0;
}
template<class Elem>
SimNode<Elem> *SimSpace<Elem>::NodeArry() const
{
return m_node;
}
template<class Elem>
int &SimSpace<Elem>::getFreeNode()
{
return m_first;
}
template<class Elem>
int SimSpace<Elem>::Allocate()
{//分配一个自由节点
if(m_first == -1)
{
//扩容
}
int i = m_first;
m_first = m_node[i].m_link;
return i;
}
template<class Elem>
void SimSpace<Elem>::Deallocate(int &i)
{// 释放节点i,使i成为可利用空间表的第一个节点
m_node[i].m_link = m_first;
m_first = i;
i = -1;
}
template<class Elem>
int SimSpace<Elem>::getNumNodes() const
{
return m_NumOfNodes;
}
//========================
//simchain.h
//========================
#include "simspace.h"
template<class Elem>
class SimChain
{
public:
SimChain();
~SimChain(){}
void clear(); //使表为空
int length() const;
int search(const Elem &val);
bool getValue(Elem &item, int k) const; //获取第k个节点的值,赋给val
bool del(Elem &item, int k); //把第k个元素取至x,然后删除第k个节点
bool insert(const Elem &val,int k); //把val插入成为第k个节点
bool append(const Elem &val); //追加一个元素val
bool setValue(const Elem &val, int k); //改变或设置第k个节点数据
void print() const;
SimSpace<Elem> &simspace();
private:
int first; // 第一个节点的索引
SimSpace<Elem> m_simspace;
};
template<class Elem>
SimChain<Elem>::SimChain()
{
first = -1;
m_simspace.getFreeNode() = 1;
}
template<class Elem>
void SimChain<Elem>::clear()
{
int next;
while(first != -1)
{
next = m_simspace.NodeArry()[first].m_link;
m_simspace.Deallocate(first);
first = next;
}
}
template<class Elem>
bool SimChain<Elem>::insert(const Elem &val, int k)
{//把val插入成为第k个元素
if(k<1) return false;
int p = first;
for(int index=1;index<k-1 && p!=-1;index++)
p = m_simspace.NodeArry()[p].m_link; //使p指向第k-1个节点
if (k>1&&p == -1)
return false;
int y = m_simspace.Allocate();
m_simspace.NodeArry()[y].m_data = val;
if(k-1)
{ //在p之后插入
m_simspace.NodeArry()[y].m_link = m_simspace.NodeArry()[p].m_link;
m_simspace.NodeArry()[p].m_link = y;
}
else
{ // 作为链表首节点
m_simspace.NodeArry()[y].m_link = first;
first = y;
}
return true;
}
template<class Elem>
bool SimChain<Elem>::append(const Elem &val)
{
int y = m_simspace.Allocate();
m_simspace.NodeArry()[y].m_data = val;
int current = first;
int index=1;
if(current == -1)
{
first = y;
m_simspace.NodeArry()[y].m_link = -1;
return true;
}
while(current != -1)
{
index = current;
current = m_simspace.NodeArry()[current].m_link;
}
m_simspace.NodeArry()[index].m_link = y;
m_simspace.NodeArry()[y].m_link = -1;
return true;
}
template<class Elem>
void SimChain<Elem>::print() const
{
int current = first;
if(current == -1)
cout<<"表内无数据";
while(current != -1)
{
cout<<" "<<m_simspace.NodeArry()[current].m_data;
current = m_simspace.NodeArry()[current].m_link;
}
cout<<endl;
}
template<class Elem>
SimSpace<Elem> &SimChain<Elem>::simspace()
{
return m_simspace;
}
//========================
//TableRecord.h
//========================
#include "simchain.h"
class TableRecord
{
private:
SimChain<string> m_record; //数据成员为双向链表,记录字段信息
public:
TableRecord(void);
~TableRecord(void);
TableRecord(const TableRecord &item); //复制构造函数
int getRecordNum() const; //获取此条记录的字段数
void clear(); //删除头节点以外的所有节点
bool insert(const string &val,int pos); //插入成为第pos个节点
bool append(const string &val); //追加一个字段节点
bool remove(string &item,int pos); //删除第pos个字段节点
bool setValue(const string &val,int pos);//改变或设置第pos个字段的数据
bool getValue(string &item,int pos) const; //取得第pos个字段的数据信息
int searchValue(const string &val);//返回所查找字段的所在节点
void print();
friend ostream& operator<<(ostream &os,TableRecord &Tr);
friend istream& operator>>(istream &is,TableRecord &Tr);
};
//========================
//TableBody.h
//========================
#include "TableRecord.h"
class TableBody
{
private:
SimChain<TableRecord> m_DataRecord; //TableRecord类型的模拟链表
public:
TableBody(void){}
TableBody(const TableBody &val); //拷贝构造函数
~TableBody(void);
void clear(); //清空表体
int getRowSize() const; //获取记录数量
int getColSize(); //获取一条记录的字段数
bool appendRow(const TableRecord &rec); //追加一条记录
bool insertRow(const TableRecord &rec,int RowPos);//插入成为第RowPos条记录
bool removeRow(TableRecord &item, int RowPos); //删除第RowPos条记录
void print(); //输出表体
};
bool TableBody::appendRow(const TableRecord &rec)
{
return m_DataRecord.append(rec);
}
bool TableBody::insertRow(const TableRecord &rec,int RowPos)
{
return m_DataRecord.insert(rec,RowPos);
}
//=================================
//test.cpp
//=================================
#include "TableBody.h"
int main()
{
TableBody tb;
TableRecord tr1;
tr1.append("weichao");
tr1.append("20071610519");
tr1.append("boy");
tr1.insert("zhejiang",3);
tr1.append("shige");
/*tb.insertRow(tr1,1);*/
tb.appendRow(tr1);
tb.print();
system("pause");
}
这是堆破坏所造成的,问题可能是在释放内存空间时对没有申请的空间进行释放
或者已经被删除的空间进行删除时,就会出现这个错误。
//========================
//simchain.h
//========================
#include "simspace.h"
template<class Elem>
class SimChain
{
public:
bool insert(const Elem &val,int k); //把val插入成为第k个节点
bool append(const Elem &val); //追加一个元素val
};
template<class Elem>
bool SimChain<Elem>::insert(const Elem &val, int k)
{//把val插入成为第k个元素
if(k<1) return false;
int p = first;
for(int index=1;index<k-1 && p!=-1;index++)
p = m_simspace.NodeArry()[p].m_link; //使p指向第k-1个节点
if (k>1&&p == -1)
return false;
int y = m_simspace.Allocate();
m_simspace.NodeArry()[y].m_data = val;
if(k-1)
{ //在p之后插入
m_simspace.NodeArry()[y].m_link = m_simspace.NodeArry()[p].m_link;
m_simspace.NodeArry()[p].m_link = y;
}
else
{ // 作为链表首节点
m_simspace.NodeArry()[y].m_link = first;
first = y;
}
return true;
}
template<class Elem>
bool SimChain<Elem>::append(const Elem &val)
{
int y = m_simspace.Allocate();
m_simspace.NodeArry()[y].m_data = val;
int current = first;
int index=1;
if(current == -1)
{
first = y;
m_simspace.NodeArry()[y].m_link = -1;
return true;
}
while(current != -1)
{
index = current;
current = m_simspace.NodeArry()[current].m_link;
}
m_simspace.NodeArry()[index].m_link = y;
m_simspace.NodeArry()[y].m_link = -1;
return true;
}
//========================
//TableRecord.h
//========================
#include "simchain.h"
class TableRecord
{
private:
SimChain<string> m_record; //数据成员为双向链表,记录字段信息
public:
void clear(); //删除头节点以外的所有节点
bool insert(const string &val,int pos); //插入成为第pos个节点
bool append(const string &val); //追加一个字段节点
bool remove(string &item,int pos); //删除第pos个字段节点
};
bool TableRecord::insert(const string &val,int pos)//插入成为第pos个节点
{return m_record.insert(val,pos);}
bool TableRecord::append(const string &val) //追加一个字段节点
{return m_record.append(val);}
//========================
//TableBody.h
//========================
#include "TableRecord.h"
class TableBody
{
private:
SimChain<TableRecord> m_DataRecord; //TableRecord类型的模拟链表
public:
bool appendRow(const TableRecord &rec); //追加一条记录
bool insertRow(const TableRecord &rec,int RowPos);//插入成为第RowPos条记录
};
bool TableBody::appendRow(const TableRecord &rec)
{ return m_DataRecord.append(rec);}
bool TableBody::insertRow(const TableRecord &rec,int RowPos)
{ return m_DataRecord.insert(rec,RowPos);}
//=================================
//test.cpp
//=================================
#include "TableBody.h"
int main()
{
TableBody tb;
TableRecord tr1;
tr1.append("weichao");
tr1.append("20071610519");
tr1.append("boy");
tr1.insert("zhejiang",3);
tr1.append("shige");
/*tb.insertRow(tr1,1);*/
tb.appendRow(tr1);
tb.print();
system("pause");
}
你给出的程序不全啊,怎么帮你看?
打一个包。