#include <stdio.h>
struct list
{
int data;
struct list *next;
};
struct list *start, *end;
void add(struct list *head, struct list *list, int data);
void delete(struct list *head, struct list *tail);
int main(void)
{
start=end=NULL;
add(start, end, NULL);
add(start, end, NULL);
printf("First element: %d");
delete(start, end);
return 0;
}
void add(struct list *head, struct list *tail, int data)
{
if(tail==NULL)
{
head=tail=malloc(sizeof(struct list));
head->data=data; head->next=NULL;
} else {
tail->next=malloc(sizeof(struct list));
tail=tail->next;
tail->data=data;
tail->next=NULL;
}
}
void delete(struct list *head, struct list *tail)
{
struct list *temp;
if(head==tail)
{
free(head);
head=tail=NULL;
} else {
temp=head->next;
free(head);
head=temp;
}
}
我的目标是返回 3 的输出,但不断得到随机结果。 任何见解都非常感谢
当你想要修改head
和tail
时,你需要传递一个指向它们的指针。
即
void add(struct list **head, struct list **tail, int data)
{
if(*tail==NULL)
{
*head = *tail = malloc(sizeof(struct list));
(*head)->data = data;
(*head)->next = NULL;
} else {
(*tail)->next = malloc(sizeof(struct list));
*tail = (*tail)->next;
(*tail)->data = data;
(*tail)->next = NULL;
}
}
对另一个函数执行类似操作。然后头部和尾部也会在功能之外发生变化。
该行
printf("First element: %d");
它需要一个整数来打印 - 提供它 - 请参阅printf的手册页
避免在 C 程序中对C++使用关键字 - 例如delete
C 函数的参数按值传递。因此,对 add()
函数中的 head
和 tail
值所做的更改将不会反映在调用add()
的main()
中。
而且,您似乎没有为printf()
提供第二个参数,因此%d
格式不会获得它将要查找的整数值。
在你的程序中,开始和结束是全局变量,所以没有必要把它作为参数传递给其他函数,因为其他方法可以直接访问它。
//Structure to store data
struct list
{
int data;
struct list *next;
};
// global variables
struct list *start, *end;
void add(int);
void delete();
// start of program
int main(void)
{
start=end=NULL;
add(5);
add(6);
printf("nFirst element: %d",start->data);
delete();
printf("nFirst element: %d",start->data);
return 0;
}
//add node to list
void add(int data)
{
if(end==NULL)
{
start=end=malloc(sizeof(struct list));
start->data=data; start->next=NULL;
} else {
end->next=malloc(sizeof(struct list));
end=end->next;
end->data=data;
end->next=NULL;
}
}
// delete node from list
void delete()
{
struct list *temp;
if(start==end)
{
free(start);
start=end=NULL;
} else {
temp=start->next;
free(start);
start=temp;
}
}
OUTPUT:
First element: 5
First element: 6
注意:如果你不希望你的开始和结束是全局的,那么它可以是 main 函数的局部变量。在这里,您必须使用双指针机制或返回内存地址以保留修改。
这里有许多问题。
首先,当您将指针传递给函数时,指针是按值传递的。对被调用函数中指针的任何更改都不会反映在调用函数中。若要更改调用函数中的指针指向的内容,需要传递指针到指针。因此,您的add()
函数需要:
void add(struct list **head, struct list **tail, int data) {
if(*tail == NULL) {
*head = *tail = malloc(sizeof(struct list));
(*head)->data = data;
(*head)->next = NULL;
}
else {
(*tail)->next = malloc(sizeof(struct list));
(*tail) = (*tail)->next;
(*tail)->data = data;
(*tail)->next = NULL;
}
return;
}
您的delete()
功能也需要进行类似的更改。
其次,您将 NULL 作为数据值传递给 add 函数。NULL 是一个指针;它通常定义为宏,并且可以在实现中(void*) 0
。它不应用作整数。将 0
作为整数传递,而不是 NULL。
第三,你有这样的说法:
printf("First element: %d");
格式字符串具有转换说明符%d
但没有与%d
匹配的参数。这是未定义的行为。您到底要打印什么整数?
您期望输出3
在哪里,出于什么原因?