C++中关于类的继承调用与纯虚函数来实现链表排序 搞不清楚代码的执行方向解析下一会儿下一会儿上 高手指教

C++中关于类的继承调用与纯虚函数来实现链表排序 搞不清楚代码的执行方向解析上一会儿上一会儿下 高手指教

C++中关于类的继承调用与纯虚函数来实现链表排序 搞不清楚代码的执行方向解析上一会儿上一会儿下 高手指教
#include<iostream>
using namespace std;
enum{kIsSmaller,kIsLarger,kIsSame};
class Data
{
public:
Data(int val):myValue(val){}
~Data(){}
int Compare(const Data &);
void Show(){cout<<myValue<<endl;}
private:
int myValue;
};
int Data::Compare(const Data &theOtherData)
{
if(myValue<theOtherData.myValue)
return kIsSmaller;
if(myValue>theOtherData.myValue)
return kIsLarger;
else
return kIsSame;
}
class Node;
class HeadNode;
class TailNode;
class InternalNode;
class Node
{
public:
Node(){}
virtual ~Node(){}
virtual Node *Insert(Data *theData)=0;
virtual void Show()=0;
private:
};
class InternalNode:public Node
{
public:
InternalNode(Data *theData,Node *next);
~InternalNode(){delete myNext;delete myData;}
virtual Node *Insert(Data *theData);
virtual void Show(){myData->Show();myNext->Show();}
private:
Data *myData;
Node *myNext;
};
InternalNode::InternalNode(Data *theData,Node *next):
myData(theData),myNext(next)
{
}
Node *InternalNode::Insert(Data *theData)
{
int result=myData->Compare(*theData);
switch(result)
{
case kIsSame:
case kIsLarger:
{
InternalNode *dataNode=new InternalNode(theData,this);
return dataNode;
}
case kIsSmaller:
myNext=myNext->Insert(theData);
return this;
}
return this;
}
class TailNode:public Node
{
public:
TailNode(){}
~TailNode(){}
virtual Node *Insert(Data *theData);
virtual void Show(){}
private:
};
Node *TailNode::Insert(Data *theData)
{
InternalNode *dataNode=new InternalNode(theData,this);
return dataNode;
}
class HeadNode:public Node
{
public:
HeadNode();
~HeadNode(){delete myNext;}
virtual Node *Insert(Data *theData);
virtual void Show(){myNext->Show();}
private:
Node *myNext;
};
HeadNode::HeadNode()
{
myNext=new TailNode;
}
Node *HeadNode::Insert(Data *theData)
{
myNext=myNext->Insert(theData);
return this;
}
class LinkedList
{
public:
LinkedList();
~LinkedList(){delete myHead;}
void Insert(Data *theData);
void ShowAll(){myHead->Show();}
private:
HeadNode *myHead;
};
LinkedList::LinkedList()
{
myHead=new HeadNode;
}
void LinkedList::Insert(Data *pData)
{
myHead->Insert(pData);
}
int main()
{
Data *pData;
int val;
LinkedList ll;
while(1)
{
cout<<"What value?(0 to stop):";
cin>>val;
if(!val) break;
pData=new Data(val);
ll.Insert(pData);
}
ll.ShowAll();
return 0;
}


[解决办法]
[code=C/C++][/code]
mainLinkedList::LinkedList()
LinkedListHeadNode *myHead=new HeadNode;
HeadNodeNode *myNext=new TailNode;
mainll.Insert(pData);
LinkedListvoid LinkedList::Insert(Data *pData)
myHead->Insert(pData);
HeadNodevirtual Node *Insert(Data *theData);
/*myNext=*/myNext->Insert(theData);
TailNodevirtual Node *Insert(Data *theData);
InternalNode *dataNode=new InternalNode(theData,this);
return dataNode;
HeadNodemyNext=dataNode;


mainll.Insert(pData2);
LinkedListvoid LinkedList::Insert(Data *pData)
myHead->Insert(pData);
HeadNodevirtual Node *Insert(Data *theData);
/*myNext=*/myNext->Insert(theData);
InternalNodeNode *InternalNode::Insert(Data *theData)
int result=myData->Compare(*theData);
...
return dataNode;


HeadNodemyNext=dataNode;

vs的F11就可以解决的你的问题
//说实话,你还是多看看多态的理论知识再看代码
[解决办法]
这个代码本身虽然能正确运行,但是水平不敢恭维,仅仅实现一个简单的功能竟然调用如此复杂,多态的用法没错,但是用的水平就不再评价。建议这种代码少些的好;本来想少做改动做好注释发你,但是觉得没多少益处;改进了下,这样就清晰多了。然后你再看他写的,自己思考下他那样写到底有多少好处;

不多说贴代码
#include<iostream>
using namespace std;
enum{kIsSmaller,kIsLarger,kIsSame};

class Data
{
public:
Data(int val):myValue(val){}
~Data(){}
int Compare(const Data &);
void Show(){cout<<myValue<<endl;}
private:
int myValue;
};

int Data::Compare(const Data &theOtherData)
{
if(myValue<theOtherData.myValue)
return kIsSmaller;
if(myValue>theOtherData.myValue)
return kIsLarger;
else
return kIsSame;
}

class Node
{
public:
Node(Data *theData,Node *next);
~Node(){delete myNext;delete myData;}
Node *Insert(Data *theData);
void Show(){myData->Show();if(myNext!=NULL)myNext->Show();}
private:
Data *myData;
Node *myNext;
};

Node::Node(Data *theData,Node *next):
myData(theData),myNext(next){}

Node * Node::Insert(Data *theData)
{
int result=myData->Compare(*theData);
switch(result)
{
case kIsSame:
case kIsLarger:
{
Node * newHead=new Node(theData,this);//注意此处的this,意将此新节点放在插入在当前节点前面,
//返回此指针意味将此newHead指针作为上节点指向的位置;
return newHead;
}
case kIsSmaller:
{
if(myNext==NULL) //如果到了尽头,就放在链尾;
myNext=new Node(theData,NULL);
else //如果没到尾部,但是还要继续移动查找合适的位置; 
myNext=myNext->Insert(theData);//注意此处,必须要赋值,将后面节点地址得到,
//如果插入了新的,就赋值新节点地址;如果没插入,就是原有的;
}
}
return this;
}

class LinkedList
{
public:
LinkedList():myHead(NULL){}
~LinkedList(){delete myHead;}
void Insert(Data *theData);
void ShowAll(){myHead->Show();}
private:
Node *myHead;
};

void LinkedList::Insert(Data *pData)
{
if(myHead==NULL)
myHead=new Node(pData,NULL);
else
myHead=myHead->Insert(pData);
}

int main()
{
Data *pData;
int val;
LinkedList ll;
while(1)
{
cout<<"Please insert value?(0 to stop):";
cin>>val;
if(!val) break;
pData=new Data(val);
ll.Insert(pData);
}
ll.ShowAll();
return 0;
}