#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的输出,但不断获得随机结果。非常感谢任何见解
答案 0 :(得分:2)
如果你想修改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
答案 1 :(得分:1)
C函数的参数按值传递。因此,您对head
函数中tail
和add()
的值所做的更改不会反映在调用main()
的{{1}}中。
并且,您似乎没有为add()
提供第二个参数,因此printf()
格式不会获得它将要查找的整数值。
答案 2 :(得分:1)
这里有很多问题。
首先,当您将指针传递给函数时,指针将按值传递。对被调用函数中指针的任何更改都不会反映在调用函数中。要更改调用函数中指针所指向的内容,需要传递指针指针。所以你的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
在哪里?出于什么原因?
答案 3 :(得分:1)
在你的程序中 start和end是全局变量,所以不需要将它作为参数传递给其他函数,因为其他方法可以直接访问它。
//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
注意:强> 如果您不希望您的开始和结束是全局的,那么它可以是主函数的局部变量。在这里,您必须处理双指针机制或返回内存地址以保留修改。