模板编程初学者的问题

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();
...全文
41 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,687

社区成员

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

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