我对C语言还很陌生,所以我们有了一个专家,需要在程序中编写带有预定功能和参数的链表。 现在我遇到了一个问题,需要在列表的开头添加一个新元素,其他所有方法都可以使用,语法如下。
int main(){
Vector3D foo;
foo.x = 521;
foo.y = 2;
foo.z = 3;
VectorList * head;
head = create_VL(NULL, &foo);
insertElementBack(head, &foo);
foo.x = 456;
insertElementBack(head, &foo);
foo.x = 2;
insertElementFront(head, &foo);
print_list(head);
printf("%d\n", size(head));
}
void insertElementFront(VectorList* l, Vector3D* v){
VectorList *previous, *new_VL;
previous = &l;
new_VL = NULL;
new_VL = malloc(sizeof(VectorList));
new_VL -> value = *v;
new_VL -> next = previous;
l = new_VL;
}
VectorList *create_VL(VectorList* l, Vector3D* v) {
VectorList* new_VL = (VectorList*)malloc(sizeof(VectorList));
if(new_VL == NULL)
{
printf("Error creating a new node.\n");
exit(0);
}
new_VL->value = *v;
new_VL->next = l;
return new_VL;
}
void insertElementBack(VectorList* l, Vector3D* v){
VectorList *vl = l;
while( vl -> next != NULL){
vl = vl -> next;
}
VectorList *new_List = create_VL(NULL, v);
vl -> next = new_List;
}
不允许更改名称和参数,我可以使用双指针作为参数来解决此问题,但不允许这样做。 有人可以给我一个提示,我尝试了很多事情,但没有任何效果。
最佳
马丁
答案 0 :(得分:0)
您确实应该包含VectorList
的定义,而不是让我们猜测其结构,但是您的问题可能是这样的:
previous = &l;
l
是指向VectorList
的指针。通过执行&l
,您将获取指针的地址,而不是VectorList
。所以当你这样做
new_VL -> next = previous;
您的next
指针现在指向该指针,而不是VectorList
。实际上,您没有收到警告吗?不要忽略警告。
您的第二个更大的问题是head
不会更新以反映新的头,并且如果不能使用双指针,则您唯一的解决方法是将新的头节点作为返回值返回来自insertElementFront
。
答案 1 :(得分:0)
在void insertElementFront(VectorList* l, Vector3D* v){
中
l是仅保存head地址的局部变量。在本地更改地址不会影响head变量。
您可以将head设为全局变量,并采用以下方式进行操作
void insertElementFront(VectorList* l, Vector3D* v){
VectorList *new_VL;
new_VL = NULL;
new_VL = malloc(sizeof(VectorList));
new_VL -> value = *v;
new_VL -> next = l;
head = new_VL
}
或者您可以返回头指针
VectorList* insertElementFront(VectorList* l, Vector3D* v){
VectorList *new_VL;
new_VL = NULL;
new_VL = malloc(sizeof(VectorList));
new_VL -> value = *v;
new_VL -> next = l;
return new_VL
}
和
head = insertElementBack(head, &foo);
更多信息请看 https://www.geeksforgeeks.org/how-to-write-functions-that-modify-the-head-pointer-of-a-linked-list/