【发布时间】:2014-03-30 13:37:44
【问题描述】:
我想为我正在制作的小游戏创建双链循环列表。我希望它成为一个列表,因为它在添加和删除新元素时提供的速度。如果我想使用动态表,任何类型的添加/删除操作都需要我重写整个表,这会严重减慢程序的速度(至少根据我的理解)。该解决方案的唯一问题是,我不完全了解如何制作这样的列表;)
struct parts{
char name;
parts *next, *prev;
parts *connected;
};
void add_part(struct parts **head, struct parts **tail, char name)
{
struct parts *a;
a = (struct parts*)malloc(sizeof(struct parts));
a->name = name;
if ((*head) == NULL && (*tail) == NULL)
{
*head = a;
*tail = a;
a->next = NULL;
a->prev = NULL;
}
else
{
a->next = *head;
a->prev = NULL;
}
}
void display(parts *head) {
parts *temp = head;
while (temp != NULL){
cout << temp->name << endl;
temp = temp->next;
}
}
int main ()
{
char names[] = "ABCDEFGHIJKLMNOPRSTUWXYZ";
segmenty *head = NULL;
segmenty *tail = NULL;
int count_parts;
cin >>count_parts;
for (int i=0; i < count_parts && i<24; i++){
add_part(&head, &tail, names[i]);
}
display(head);
return 0;
}
我希望用户能够做的是输入他想要的元素数量,然后我想用字母表中的字母命名每个元素并将它们放在我的列表中,以便每个元素都连接到元素在它之前和之后,tail 连接到 head(我希望列表是循环的)。不幸的是,我的指针技能有点缺乏...... *connected 是我想用于当前在地面上的元素(一次只有一个元素可以接触地面)用于删除或添加新元素等用途的指针。如果元素命中陷阱,我想删除该特定元素,而不是任何其他元素。
【问题讨论】:
-
我建议您阅读以下内容:en.wikipedia.org/wiki/Doubly_linked_list(更特别的是“循环双向链表”部分)。我还建议你有一个单独的头部(即不要使用第一个元素作为头部)。在尝试创建循环双向链表之前,您已经创建了一个简单的列表?
-
我以前没有做过类似的事情,我对这个概念完全陌生。
-
看来代码是 C(
malloc和struct parts)和 C++(cin和cout)的混合。我建议摆脱malloc并更充分地使用 C++ 的功能。 -
好的。你可以从这个列表开始,但根据我的经验,你应该从一个更简单的列表开始(例如简单链接的非循环)。然后你可以将简单列表转换为循环列表,然后再转换为双向链表。
-
这似乎是一个重复的问题。见stackoverflow.com/questions/19484515/…