我有以下结构:
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的每个元素,并获取每个头指针的值以显示每个列表的元素点。
我在论坛上看到过与此相似的其他帖子,但我仍然感到困惑,这就是我询问具体情况的原因。
这是一个好方法吗?
我非常感谢你的建议。
尊敬,
豪尔赫马尔多纳多
答案 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 ++书籍,然后开始阅读。