使用c struct实现链表

using c struct to implement linked list

我正在尝试用 c 语言实现链表。我从用户那里获得输入,将其放入名为 Box 的结构中,并使用链表保存输入的顺序。 这是结构:

struct Box
{
   struct Box *previous;
   struct Box *next;
   int amount;
};

这是实现:

void main()
{
   struct Box firstBox;
   scanf("%d", &(firstBox.amount));

   struct Box *addressKeeper;
   addressKeeper = &firstBox;

   for (int i = 0; i < 3; i++)
   {
       struct Box newBox;
       scanf("%d", &(newBox.amount));
       newBox.previous = addressKeeper;
       addressKeeper->next = &newBox;
       addressKeeper = &newBox;
   }
}

但是当我这样打印next个盒子的地址时,它们都是一样的吗?

struct Box *ptr = &firstBox;
for (int i = 0; i < 3; i++)
{
   printf("%p \n", ptr->next);
   ptr = ptr->next;
}
   

我是不是做错了什么?

您在此循环中使用了本地对象 newBox

for (int i = 0; i < 3; i++)
{
    struct Box newBox;
    scanf("%d", &(newBox.amount));
    newBox.previous = addressKeeper;
    addressKeeper->next = &newBox;
    addressKeeper = &newBox;
}

在循环访问此对象后调用未定义的行为,因为它不再存在。

您的程序似乎输出了与该本地对象相同的地址。

您需要动态分配节点或使用在循环之前声明的节点数组。

您没有在循环中正确创建新的 Box 元素。你有一个 struct Box 每次通过循环都会超出范围。您需要通过 malloc() 动态分配每一个,或者分配一个您从中绘制的数组。像这样:

   struct Box listOfBoxes[3];
   struct Box *addressKeeper;
   addressKeeper = &listOfBoxes[0];

   for (int i = 1; i < 3; i++)
   {
       scanf("%d", &(listOfBoxes[i].amount));
       listOfBoxes[i].previous = addressKeeper;
       addressKeeper->next = &listOfBoxes[i];
       addressKeeper = &listOfBoxes[i];
   }

但是,您需要仔细检查下一个和上一个指针赋值。还是有地方不对,我没改。