LinkedList部分

时间:2009-08-21 03:25:41

标签: c++

我想我可能做得对,headByRating和headByName都指的是同一个地址。

我一直在努力工作,整天都在尝试新事物,而且我还没有取得任何进展。

我有两个列表指针headByRating和headByName。 和两个节点指针nextByName和nextByRating。

不知何故,我需要能够按名称和等级对这些东西进行排序。 我一直在想我是通过每个ptrs'地址'来做到的。

作为我一直试图排序的一个例子的2个陈述:

//main.cpp

list *wineries = new list();
wineries->insert(winery("Lopez Island Vinyard", "San Juan Islands", 7, 95));
wineries->insert(winery("Gallo", "Napa Valley", 200, 25));

酿酒厂ctor很好,所有东西都被分配到这个目标中:

//list.cpp
void list::insert( const winery& winery )
{
         list *listPtr  = new list(); // havent really used the list obj. yet.

    node *current = new node( winery ); // winery is now a node.
    node *temp    = current;     // temp knows about the nodes address.

    while ( temp->nextByName != NULL )
    {
                 // check for null and reassign 
        temp = temp->nextByName;
    }
    node *new_node = new node( winery ); // creating a new node.
    new_node->item = winery; 
    new_node->nextByName   = new_node;
    new_node->nextByRating = new_node;
}
// list.h
struct node
{
    winery  item;
    node *  nextByName;
    node *  nextByRating;
};

class list
{
    ...
private:
    node * headByName;
    node * headByRating;
};

对此有什么好处?我不认为我这样做是对的。

4 个答案:

答案 0 :(得分:4)

为什么要滚动自己的链表?为什么不使用std::list? 如果它是双重排序的东西,两个单独的指针列表将起作用,如果你可以使用提供的容器类,那就更容易了。

或者,如果您需要对其进行排序,链接列表是最佳选择吗? std::vector通常更容易排序,或std::set维护订单本身。

答案 1 :(得分:0)

看起来你有几个问题:

  1. 它会一直跳过 自temp-> nextByName以来的语句 因为temp,它将始终为NULL 指向当前这是一个新的 对象。
  2. 您正在创建一个节点 来自酿酒厂的物品两次
  3. 您是 将项目成员分配给酒厂 在构造函数中发送它之后
  4. 你正在制作nextByName和 nextByRating成员指向自己
  5. 我建议从此方法中删除所有内容并在其位置编写高级伪代码。然后为每行伪代码创建一个较小的方法。内部插入调用的较小逻辑方法将有助于理解。

答案 2 :(得分:0)

如果要进行实验的List类型,请执行此操作,否则请使用std :: list。
如果要在插入新元素时对列表进行排序,则必须实现有序列表。

最好从列表中删除“winery field”依赖项。一个节点应该只有一个 next 节点,而不是很多。你正在制作一个List,而不是一棵树。

// list.h
struct node
{
    winery  item;
    node *  next;
};

class list
{
    ...
private:
    node * head;
};

您不能在不同的酿酒厂字段中订购一个清单 制作一种新类型,如CWinery,它将作为您酒庄记录的容器 在那里,你可以有一个列表来存储你的元素和方法,以便对它进行排序或者你需要的任何东西。

答案 3 :(得分:0)

如果您需要使用带有多个索引的列表,您应该考虑使用boost::multi_index而不是发明轮子。