模板编程初学者的问题

yingkou 2003-11-24 09:07:17
想写一个类似于list的链表,编译运行都没有问题,可是排序那个地方有问题,没有起到排序的效果,帮帮忙看一下:代码有点长,但是还是很清晰的
测试用的类A
class A
{
public:
A(int i=0)
{
m_int=i;
}
int GetMember() const
{
return m_int;
}
void SetMember()(int i)
{
m_int=i;
}
bool operator >=(const A& c)
{
return m_int >= c.GetMember();
}
bool operator <= (const A& c)
{
return m_int <= c.GetMember();
}

protected:
int m_int;
};

template<class NodeType> class List;

template<class NodeType>
class ListNode
{
friend class List<NodeType>;
public:
ListNode();
ListNode(const NodeType& node);
void operator = (NodeType& newnode);
NodeType GetData()const;
private:
NodeType m_data;
ListNode<NodeType>* next;
};

template<class NodeType>
ListNode<NodeType>::ListNode():next(NULL)
{
}
template<class NodeType>
ListNode<NodeType>::ListNode(const NodeType& node):m_data(node),next(NULL)
{
}
template<class NodeType>
NodeType ListNode<NodeType>::GetData()const
{
return m_data;
}
template<class NodeType>
void ListNode<NodeType>::operator =(NodeType& newnode)//问题处在这里??
{
m_data=newnode.GetData();
if(NULL!=next)
delete next;
memcpy(next,&newnode,sizeof(NodeType));
}
template<class NodeType>
class List
{
public:
List();
~List();
void AddFromHead(const NodeType& node);
void AddFromTail(const NodeType& node);
bool DeleteFromHead();
bool DeleteFromTail();
void PrintElement();
void Sort(bool b=true);
private:
bool IsEmpty();
int count;
ListNode<NodeType>* first;
ListNode<NodeType>* last;
ListNode<NodeType>* GetNewElement(const NodeType& node);
};

template<class NodeType>
List<NodeType>::List():first(NULL),last(NULL)
{
count=0;
}
template<class NodeType>
List<NodeType>::~List()
{
if(!IsEmpty())
{
ListNode<NodeType>* temp1=first;
ListNode<NodeType>* temp2;
for(int i=0;i<count;++i)
{
temp2=temp1;
temp1=temp1->next;
delete temp2;
}
cout<<"Destructor Over"<<endl;
}

}
template<class NodeType>
void List<NodeType>::AddFromHead(const NodeType& node)
{
ListNode<NodeType>* temp=GetNewElement(node);
if(IsEmpty())
{
first=last=temp;
}
else
{
temp->next=first;
first=temp;
}
++count;
}
template<class NodeType>
void List<NodeType>::AddFromTail(const NodeType& node)
{
ListNode<NodeType>* temp=GetNewElement(node);
if(IsEmpty())
{
first=last=temp;
}
else
{
temp->next=last;
last=temp;
}
++count;
}
template<class NodeType>
bool List<NodeType>::DeleteFromHead()
{
if(IsEmpty())
{
cout<<"List is Empty"<<endl;
return false;
}
else
{
if(first==last)
{
first==last==NULL;
}
else
{
ListNode<NodeType>* temp;
temp=first->next;
delete first;
first=temp;
}
--count;
return true;
}
}
template<class NodeType>
bool List<NodeType>::DeleteFromTail()
{
if(IsEmpty())
{
cout<<"List is Empty"<<endl;
return true;
}
else
{
if(first==last)
{
first==last==NULL;
}
else
{
ListNode<NodeType>* temp;
temp=last->next;
delete last;
last=temp;
}
--count;
return true;
}
}
template<class NodeType>
void List<NodeType>::Sort(bool b)//或者问题应该处在这里
{
ListNode<NodeType>* temp1=first;
ListNode<NodeType>* temp2;
int i,j;
if(b)
{
for(i=0;i<count;++i)
for(j=i+1;j<count;++j)
{
if(temp1->GetData() >= temp1->next->GetData())
{
temp2=temp1;
temp1=temp1->next;
temp1->next=temp2;
}
temp1=temp1->next;
}
}

else
{
for(i=0;i<count;++i)
for(j=i+1;j<count;++j)
if(temp1->GetData() <= temp1->next->GetData())
{
temp2=temp1;
temp1=temp1->next;
temp1->next=temp2;
}
}
}
template<class NodeType>
ListNode<NodeType>* List<NodeType>::GetNewElement(const NodeType& node)
{
ListNode<NodeType>* temp=new ListNode<NodeType>(node);
return temp;
}
template<class NodeType>
bool List<NodeType>::IsEmpty()
{
return first==NULL;
}
template<class NodeType>
void List<NodeType>::PrintElement()
{
if(IsEmpty())
{
cout<<"List is Empty"<<endl;
return ;
}
else
{
int k=0;
ListNode<NodeType>* temp=first;
while(k<count)
{
cout<<temp->m_data;
temp=temp->next;
++k;
}
}
}
template<class T>
void TestList(List<T>& list1,const char* type)
{
T t;
if(type=="A")
{
cout<<"now A list is initializing:"<<endl;
A node1(15),node2(19),node3(18),node4(5);
t=node1;
list1.AddFromHead(node1);
t=node2;
list1.AddFromHead(node2);
t=node3;
list1.AddFromHead(node3);
t=node4;
list1.AddFromHead(node4);
}
}
测试:
main()
{
List<A>list1;
TestList(list1,"A");
cout<<"Before sort A list:"<<endl;
list1.PrintElement();
cout<<"After sort A list:"<<endl;
list1.Sort();
list1.PrintElement();
...全文
88 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 平台简介 License Spring Boot JDK-17 本项目基于ruoyi-vue-fast实现 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可 活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源 若依wms是一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单。 毫无保留给个人及企业免费使用。 前端采用Vue、Element UI。 后端采用Spring Boot、Spring Security、Redis & Jwt。 权限认证使用Jwt,支持多终端认证系统。 支持加载动态权限菜单,多方式轻松权限控制。 高效率开发,使用代码生成器可以一键生成前后端代码。 前端项目地址 gitee https://gitee.com/zccbbg/ruo-yi-wms-vue https://.com/zccbbg/RuoYi-WMS-VUE 若依实战技术专栏 关注文末公众号回复:星球 在线体验 https://wms.ichengle.top/ 不同分支介绍 jdk17+vue3,支持多仓库,没有库区概念,操作简单,覆盖大部分库存应用场景。 jdk17+vue3,支持多仓库、多库区,记录生产日期、过期日期、sn,可适配一物一码,操作相对复杂。 jdk8+vue2 同步lite分支 若依wms功能 首页:库存预警与到期提醒、基础数据报表展示 仓库/库区:管理维护仓库基础数据 物料:管理维护物料基础数据 客户/供应商:管理维护联系人基础数据 入库:创建入库单后包括如下几个状态:暂存、作废、完成入库,入库类型包括:采购...

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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