C ++ Linked List ---如何将每个新数据插入尾部?

时间:2015-03-27 10:33:07

标签: c++ header linked-list

我需要这些代码的帮助,这些代码将要求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";
    }
}

1 个答案:

答案 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,我认为你可以在考虑以下事实后自己弄明白:

  1. 最初,在构造函数中,列表为空,因此pTail自然会为空。

  2. 您总是添加到头部,因此,添加到列表中的第一个节点将是其永久尾节点。

  3. 设置pTail后,它将不再为空。

  4. 因此,在向头部添加新节点时,如果pTail为空,则必须是新的永久尾节点。