【问题标题】:Creating Linked List as a Template: Is my implementation correct?创建链接列表作为模板:我的实现是否正确?
【发布时间】:2013-02-27 09:09:45
【问题描述】:

请看下图

这就是我的实现方式

template <typename T>

class LinkedList
{

    struct Link {
    T data;
    struct Link *next;

    public:
    T *first;
  };



LinkedList::LinkedList(void)
{
    first = 0;
}


LinkedList::~LinkedList(void)
{
}

bool LinkedList::IsEmpty()
{
    return (first==0);
}

void LinkedList::Insert(Link *newLink)
{
    newLink->next = first;
    first = newLink;
}

void LinkedList::Display()
{
    Link *current = first;

    while(current!=0)
    {
        current->Display();
        current = current->next;
    }
}

T *LinkedList::Find(int value)
{
    Link *current = first;

    while(current->GetData()!=value)
    {
        if(current->next==0)
        {
            return 0;
        }
        else
        {
            current = current->next;
        }
    }

    return current;
}

T *LinkedList::Delete(const int id)
{
    Link *current = first;
    Link *previous = first;

    while(current->GetData()!=id)
    {
        if(current->next==0)
        {
            return 0;
        }
        else
        {
            previous = current;
            current = current->next;
        }
    }

    if(current==first)
    {
        first = first->next;
    }
    else
    {
        previous->next = current->next;
    }

    return current;
}
};

我对自己的实施感到不舒服。特别是,我不知道在 insert() 方法中做什么,使用 T 类型。

下面是另一个类的图表,它的next 指针是Weapons 表示链表中的链接。我怀疑这是否也是“链接”类。 Next 是指向列表中下一个武器的指针。如果它影响到上面的代码,我在这里发布。

insert()方法里面怎么处理?除此之外,我的链接列表是否正确?无论如何,第一次使用链接列表的模板。请帮忙!

注意:不允许使用内置数据结构。这就是我发布课程图的原因。如果我需要内置数据结构支持,那么我不会问如何自己构建代码。

【问题讨论】:

  • 为什么不使用众多可用的链表实现之一?
  • 如果可能,请使用std::list 或其他标准库容器,除非有充分的理由不这样做。
  • @ddriver: nono,需要我自己做
  • @MarkGarcia:不,需要我自己做
  • 您的插入例程不采用 T* 参数。我认为我最紧迫的问题是:Link 对象应该由客户端代码还是由 LinkedList 实例化?

标签: c++ visual-studio-2010 templates linked-list


【解决方案1】:

我更愿意回答的问题:

我的特殊问题/练习是......

如何使用std::list 或其他标准库容器解决我的问题,这些容器可能会使用更少的行、更容易理解、更高效并帮助我作为程序员实现更多目标?

我努力不回答的潜意识问题:

我的代码有什么问题?

我认为您实际上要问的问题:

如何修复我的insert() 方法?

只回答最后一个问题:

您似乎正在尝试将新链接附加到列表的前面。从概念上讲,我会将它附加到列表的后面,但是,嘿,每个人都有自己的。

问题在于类型:在你的类中,first 的类型是T *,其中T 可能是一些实现GetData() 的自定义类。所以first 指向一个T,它可能应该指向一个Link,它指向一个T

那么你的insert() 方法就更有意义了。

不过,如果没有一段具有已定义预测输出的可编译代码,就很难知道您的代码是否正确。至少对于标准库,您可以始终假设如果有问题,它不在链表实现中。

因为这是家庭作业,你需要自己做吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多