typedef struct Element
{
int number;
struct Element *right;
struct Element *left;
} Element;
Element *newElement;
Element *head;
Element *pos;
Element *current;
void insert_Element()
{
newElement = malloc(sizeof(Element));
if (head==NULL)
{
head = newElement;
current = newElement;
current->right = pos;
//pos->left = current;
}
}
双链列表的头部应该有一个指向下一个(right
)元素(这是 NULL
但也 pos
). 这样做很好,但指针回(left
)从 pos
NULL
doesn't work.What did I do work; Is it even possible? 先谢谢你:)
目前版本的 insert_Element
功能不工作,除非 head
是 NULL
和 pos
不是 NULL
,而且它没有设置 left
新元素的成员。的目的。pos
变量没有说明,但似乎是用来指向要插入新元素之前的元素。 我们可以使用 pos == NULL
来表示新元素要放在列表的最后。这里有一个版本是这样做的。
void insert_Element(void)
{
newElement = malloc(sizeof(Element));
if (newElement == NULL)
{
return;
}
newElement->right = pos;
if (pos != NULL)
{
/* insert before pos */
newElement->left = pos->left;
pos->left = newElement;
}
else if (head != NULL)
{
/* add to end of list */
current = head;
while (current->right != NULL)
{
current = current->right;
}
newElement->left = current;
current->right = newElement;
}
else
{
/* add to empty list */
newElement->left = NULL;
}
if (pos == head)
{
/* make it the start of the list */
head = newElement;
}
/* make it the 'current' element */
current = newElement;
}
最好不要过多使用全局变量,而是使用函数参数。 下面是一个不使用全局变量的版本,并返回一个指向列表中新元素的指针(或者是 NULL
在分配失败时)。)
Element *insert_Element(Element **phead, Element *pos)
{
Element *newElement = malloc(sizeof(Element));
if (newElement == NULL)
{
return NULL;
}
newElement->right = pos;
if (pos != NULL)
{
/* insert before pos */
newElement->left = pos->left;
pos->left = newElement;
}
else if (*phead != NULL)
{
/* add to end of list */
Element *current = *phead;
while (current->right != NULL)
{
current = current->right;
}
newElement->left = current;
current->right = newElement;
}
else
{
/* add to empty list */
newElement->left = NULL;
}
if (pos == *phead)
{
/* make it the start of the list */
*phead = newElement;
}
return newElement;
}
有可能你只是需要分配你的... ... Element *pos
. 其实pos等于null,逻辑上没有指针左右,就像在一个不存在的房子里找厕所一样。