我有以下双链表结构体:
struct coords
{
int x;
int y;
struct coords* previous;
struct coords* next;
};
我有一个包含以下值的链表,在这里显示为(x, y):
head tail
(-1, -1) <--> (0, 1) <--> (2, 1) <--> (1, 0) <--> (0, 2) <--> (-1, -1)
在我的实现下,头和尾始终是(-1,-1)。我还有newcoordds,一个大小为4的坐标数组*,包含以下元素:
[(0, 2), (2, 2), (1, 3), no value]
newcoord可以有0到4个已赋值元素。我还跟踪了一个名为newcoord的int(当前值为3)中的节点数量。我想将这些节点添加到我的链表中,介于尾部和最后一个非尾部节点之间。为此,我有以下代码(为了清晰起见,删除了打印语句):
void insert (struct coords* position, struct coords* newCoord)
{
newCoord->next = position->next;
newCoord->previous = position;
position->next = newCoord;
}
... //here I create the initial linked list
struct coords* newCoords[4]; //4 is the maximum number of new coords that can be added
int numberOfNewCoords = 0;
... //here I fill newCoords, and as I do I increment numberOfNewCoords by 1
if (numberOfNewCoords > 0) //numberOfNewCoords stores the number of coords in newCoords
{
struct coords* temp = tail->previous;
/* add new possible locations to list */
for (int i = 0; i < numberOfNewCoords; i++)
{
insert(temp, newCoords[i]);
temp = temp->next;
}
}
newcoord中的前两个值按我期望的那样添加。但是,最后一个值不会插入到链表中。在该插入的地方插入的是一个节点,它的数字在每次运行程序时都会改变。列表应该是
head tail
(-1, -1) <--> (0, 1) <--> (2, 1) <--> (1, 0) <--> (0, 2) <--> (0, 2) <--> (2, 2) <--> (1, 3) <--> (-1, -1)
而不是
head tail
(-1, -1) <--> (0, 1) <--> (2, 1) <--> (1, 0) <--> (0, 2) <--> (0, 2) <--> (2, 2) <--> (9765060, 9770824) <--> (-1, -1)
只是为了澄清,你确定你使用malloc分配内存?
我猜你错过了为你想要添加的新记录分配内存。当我们向现有列表添加新元素时,我们应该确保事先分配内存以为新元素提供空间。你发布的代码在这部分需要修改-
for (int i = 0; i < numberOfNewCoords; i++)
{
insert(temp, newCoords[i]);
temp = temp->next;
}
后变化——
for (int i = 0; i < numberOfNewCoords; i++)
{
temp = malloc(sizeof(struct* coords));
insert(temp, newCoords[i]);
temp = temp->next;
}
如果编译器不支持(struct *)
的自动类型转换,可以对malloc进行类型转换。