使用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];
}
但是,您需要仔细检查下一个和上一个指针赋值。还是有地方不对,我没改。
我正在尝试用 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];
}
但是,您需要仔细检查下一个和上一个指针赋值。还是有地方不对,我没改。