我有以下双链表结构:
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)
在我的实现中,head和tail总是为(-1,-1)。我还有新的Coords,一个4号的coords *数组*,其中包含以下元素:
[(0, 2), (2, 2), (1, 3), no value]
newCoords可以包含零到四个指定元素之间的任何位置。我还跟踪一个名为newCoords的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;
}
}
newCoords中的前两个值正如我预期的那样添加。但是,最后一个值未插入链接列表中。插入的位置应该是每次运行程序时数字都会更改的节点。列表应该是
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)
答案 0 :(得分:0)
为了澄清一下,您确定使用malloc来分配内存吗?
答案 1 :(得分:0)
我猜你错过了为你想要添加的新坐标分配内存。当我们向现有列表添加新元素时,我们应该确保事先分配内存以为新元素提供空间。 您发布的代码需要在此部分进行修改 -
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进行类型转换希望这会奏效。