如何管理结构

时间:2016-09-03 22:52:39

标签: c++ pointers

我有以下结构:

struct Item
{
    Item* nextPtr;
    int intKey;
    int intValueLength;
};

基于这样的结构我需要维护几个链表,这意味着我需要跟踪每个链表的一个头指针。我曾考虑使用一个数组(HEADS),它将包含每个列表的头指针。列表的数量是可变的,将在运行时计算,因此我按如下方式动态定义数组:

int t = 10;
Item* HEADS = new Item[t];

首先,我需要将每个头指针初始化为NULL,因为程序运行时链表是空的。我该如何进行初始化?

for (int i = 0; i  <= t - 1; i++)
    // Initialize each element of HEADS to NULL.

当然,我还需要使用指向链表的正确指针(插入和删除项目时)更新HEADS的每个元素,并获取每个头指针的值以显示每个列表的元素点。

我在论坛上看到过与此相似的其他帖子,但我仍然感到困惑,这就是我询问具体情况的原因。

这是一个好方法吗? 我非常感谢你的建议。

尊敬,
豪尔赫马尔多纳多

2 个答案:

答案 0 :(得分:0)

在C ++中,编写初始化for循环的常用方法是

for (int i = 0; i < t ; i++)
  HEADS[i] = NULL;

或者你可以写

for (int i = 0 ; i < t ; HEADS[i++] = NULL);

稍微紧凑。

关于指针数组是否是个好主意的问题 - 如果你要有可变数量的列表,也许你应该使用指向其他链表的链接列表。

但我确实想知道你的数据结构。在其中,您有一个指向列表中下一个元素的指针,一个键值和一个值的长度,但您似乎没有对值的引用 - 除非“key”实际上是值,在这种情况下,你有混合的术语 - 也就是说,你把一个地方的东西称为“关键”而另一个地方称为“价值。也许你需要一个指向”价值“的指针?但我不知道你是什么我试图在这里做,所以我只是想我会注意到这个问题。

祝你好运。

答案 1 :(得分:0)

好方法?这非常非常依赖于事物。也许是开始学习C的学生的好处。适合真正的C ++程序员?绝对不。如果你真的想要创建一个链表,你应该创建一个包含这些链接的每个元素的类,并动态添加元素。例如color_map = [ (3000, 0, 0, 0), (3700, .2, .4, .2), (4100, 0, 1, 0), (4500, 0, 0, 1), (float("inf"), 1, 0, 0) ] for i, (c, r, g, b) in enumerate(color_map): if value < c: ac.setBackgroundColor(wheel['slip'], r, g, b) if i > 0: ac.setBackgroundOpacity(wheel['slip'], 1) break 就是这样的。 (std::list是双向链表,而且更复杂)。

这是一个示例类,它应该是什么样的(在我的头顶;没有编译它,但应该工作):

std::list

现在这更好,但它仍然最佳。但是,这就是应该如何使用C ++。您创建对象并处理它们。你上面做的更像是C,而不是C ++。

在我的代码中,您必须致电:

struct LinkedList
{
    Item* list;
    int size = 0;
    LinkedList() //constructor of this class/struct, it's the function that will be called once you create an object of LinkedList
    {
        list = nullptr; //don't use NULL, it's deprecated (this is for C++11, or change it back to NULL if you insist on using C++98)
    }
    addItem(const int& key)
    {
        Item item; //construct a new item
        item.intKey = key; //fill the value in the item
        Item* newList = new Item[size+1]; //create the new list with one more element
        for(int i = 0; i < size; i++) //copy the old list to the new list
        {
            newList[i] = list[i]; //copy element by element
        }
        list[size] = item; //fill in the new item
        if(size > 0)
        {
            list[size - 1].nextPtr = &list[size]; //assign "next pointer" for previous element
        }
        size = size+1; //increase the size of the list
    }
    ~linkedList()
    {
        if(list != nullptr)
        {
            delete[] list;
        }
    }
}

这里有许多事情可以做到最佳。我会提几点:

在我的代码中,每次添加项目时,都会分配一个新数组。这是不好的! LinkedList myList; myList.addItem(55); 通过分配比需要更大的大小来解决这个问题(例如,你添加1项,它保留10,但只使用1,并没有告诉你)。一旦你需要超过10,比如11,它可能会保留20。这样可以优化性能。

尝试阅读我的代码并理解它。你会学到很多东西。问问题;我会尽力回答。我的建议是:获得一本C ++书籍,然后开始阅读。