使一个结构指向另一个结构

Have One Struct Point To Another

本文关键字:结构 另一个 一个      更新时间:2023-10-16

我在创建两个结构时遇到问题,一个叫Bag,另一个叫Card。这就是我目前所拥有的:

struct Card 
{
char suit;
int value;
};
struct BagNode
{
Card* Card;
BagNode* next;
};
void fillWithCards(BagNode *&head, BagNode *&tail, BagNode *&temp) 
{
char suits [] = {'s', 'h', 'd', 'c'};
int val [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
for (int x = 0; x < 4 ; x++)
{
for (int y =1 ; y <= 13 ; y++)
{
BagNode *now = new BagNode;
now -> Card -> suit = suits [x];
now -> Card -> value = val [y]; 
if (*&head == NULL && *&tail == NULL && *&temp == NULL)
{               
head = now;
tail = now;
temp = now;
}
else if (*&tail != NULL && *&temp != NULL)
{
tail -> next = now;
temp -> next = now;
tail = now;
temp = now;
}
else 
{
tail -> next = NULL;
}
}
}
}

问题是,当我编译并运行程序时,它会崩溃。我感觉问题与Card* Card;有关

是的,我知道我可以把卡上的所有东西都放在那里,即*next,我不需要BagNode。然而,在询问我的教授时,他说我们需要两个结构,一个用于Bag,另一个用于Card

BagNode *now = new BagNode;

这在动态范围中构造了BagNode的一个新实例。此类没有构造函数。该类的任何成员都没有默认构造函数。因此,这个类的一个新实例是完全未初始化的。紧接着:

now -> Card -> suit = suits [x];
now -> Card -> value = val [y]; 

由于该类的新实例完全未初始化,因此尝试取消引用其完全未初始化的Card成员、指针,从而导致未定义的行为、未初始化的指针取消引用和明显的崩溃。

所示代码中可能存在其他问题,但由于没有提供最小、完整和可验证的示例,因此无法对其进行最终分析。唯一可以发表的其他评论:

if (*&head == NULL && *&tail == NULL && *&temp == NULL)

*&部分完全没有实现任何有用的功能。这在逻辑上等同于:

if (head == NULL && tail == NULL && temp == NULL)

当然,这一点可读性和清晰度要高得多。

在用operator->取消引用Card*指针之前,您没有初始化now->Card以指向有效的Card实例。now->Card是未初始化的指针,因此Card->正在访问无效内存。

您也没有初始化now->next。对于尚未插入列表的新节点,应该将其初始化为NULL,因为后面还没有节点。

我建议将Card* Card;更改为Card card;,然后使用operator.而不是operator->来访问Card字段:

struct BagNode
{
Card card; // <-- no '*' !
BagNode* next;
};
...
BagNode *now = new BagNode;
now->Card.suit = suits [x];
now->Card.value = val [y]; 
now->next = NULL; // <-- don't forget this!

话虽如此,您的代码的其余部分没有意义。这不是一个好的链表插入,使用temp参数会使它更加混乱。temp应该代表什么?如果head/tail为NULL,但temp不为NULL,则代码将崩溃。temp不属于这种代码。

您也超出了val[]数组的范围。数组是0索引的,而不是1索引的。val[]有13个元素,因此有效索引是0-12,而不是1-13。

试试类似的东西:

struct Card 
{
char suit;
int value;
};
struct Bag
{
Card card;
Bag* next;
};
void fillWithCards(Bag* &head, Bag* &tail) 
{
const char suits[] = {'s', 'h', 'd', 'c'};
const int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
for (int x = 0; x < 4 ; x++)
{
for (int y = 0; y < 13; y++)
{
Bag *b = new Bag;
b->card.suit = suits[x];
b->card.value = val[y]; 
b->next = NULL;
if (!head)
head = b;
if (tail)
tail->next = b;
tail = b;
}
}
}
相关文章: