我需要这些代码的帮助,这些代码将要求3个输入整数(AddToFront函数),然后以最后一个顺序显示它们,ex;输入1 = 1输入2 = 2输入3 = 3然后这些将显示为3 2 1 ...
我一直在尝试使用AddToLast函数将其反转为倒数第一个订单。我想我了解链接列表是如何工作的,但我在将其转换为代码时遇到了问题。如果有人可以向我解释如何将pTail设置为最后一个节点,这将是有帮助的。
提前感谢任何有帮助的人..
//List.h
//Declaration of class List
#ifndef LIST_H
#define LIST_H
template <class DataType>
class List
{
private:
class Node
{
public:
DataType data;
Node *link;
};
Node *pHead;
Node *pCurr;
Node *pTail;
int numItem;
public:
List();
~List();
void AddToFront();
void AddToLast();
bool Traverse(DataType, int&);
void printData();
int NoOfItem();
};
#endif
//Define the implementation of all methods in class List
template <class DataType>
List<DataType>::List(){
numItem=0;
pHead=0;
pTail; //knp x boleh????
}
template <class DataType>
List<DataType>::~List(){}
//template <class DataType>
//void List<DataType>::AddToFront()
//{
// DataType item;
// Node *pNew = new Node;
// cout<<"Enter data: ";
// cin>>item;
// pNew->data=item; //put item in node pnew
// pNew->link=pHead; //use pHead link for pNew
// pHead=pNew; //make pNew as pHead
// numItem++;
//}
template <class DataType>
void List<DataType>::AddToLast()
{
DataType item;
Node *pNew = new Node;
cout<<"Enter data: ";
cin>>item;
pNew->data=item;
pNew->link=pHead;
pHead=pNew;
pNew->NUll;
numItem++;
}
template <class DataType>
void List<DataType>::printData()
{
pCurr=pTail;
while (pCurr!=0)
{
cout<<pCurr->data<<" ";
pCurr=pCurr->link;
}
cout<<"\n";
}
template <class DataType>
int List<DataType>::NoOfItem()
{ return numItem; }
template <class DataType>
bool List<DataType>::Traverse(DataType target,int& loc)
{
if (numItem==0)
cout<<"There is no item in the list."<<endl;
else
{
pCurr=pHead;
loc=0;
while (pCurr->data !=target && pCurr->link !=0)
{
pCurr=pCurr->link;
loc++;
}
if (pCurr->data==target)
return true;
else
return false;
}
}
//ListMain.cpp
#include <iostream>
#include "List.h"
using namespace std;
void main()
{
int target, loc;
List<int> x;
for (int i=1;i<4;i++)
{
x.AddToLast();
}
cout<<"\nMumber of item Now : "<<x.NoOfItem();
cout<<"\nThe List are : "<<endl;
x.printData();
cout<<"\nEnter the search item : ";
cin>>target;
if (x.Traverse(target,loc)==true)
{
cout<<"Item is found at location : "
<<loc<<endl;
}
else
{
cout<<"Item is not found. \n";
}
}
答案 0 :(得分:0)
Traverse()看起来对我很好,虽然它的算法有些复杂。此外,没有必要使用类成员,只是为了该方法的好处。这就是本地范围的变量。
所有代码,整个功能,都可以简单地替换为
template <class DataType>
bool List<DataType>::Traverse(DataType target,int& loc)
{
Node *p;
for (p=pHead; p; p=p->link)
if (p->data == target)
return true;
return false;
}
到目前为止,与你拥有的所有内容相比,这看起来肯定要简单得多。
至于设定pTail
,我认为你可以在考虑以下事实后自己弄明白:
最初,在构造函数中,列表为空,因此pTail
自然会为空。
您总是添加到头部,因此,添加到列表中的第一个节点将是其永久尾节点。
设置pTail
后,它将不再为空。
因此,在向头部添加新节点时,如果pTail
为空,则必须是新的永久尾节点。