#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node * prev;
struct node * next;
};
struct node * addtoempty(struct node * x,int value)
{
x=malloc(sizeof(struct node));
x->data=value;
x->prev=NULL;
x->next=NULL;
}
struct node *addatbeginning(struct node * x, int value){
struct node * ptr=malloc(sizeof(struct node));
ptr->data=value;
ptr->next=x;
ptr->prev=NULL;
x->prev=ptr;
x->next=NULL;
x=ptr;
}
int main()
{
struct node * head=NULL;
head=addtoempty(head,2);
head=addatbeginning(head,5);
printf("%d",head->data);
return 0;
}
我正在实现链接列表,但我不明白这段代码如何仍然打印 5,我尝试调用函数而不分配它们(因为它们没有返回任何内容),但它给了我一个错误。
您的代码存在一些问题。
开头:
struct node * head=NULL;
head=addtoempty(head,2);
哪里
struct node *addtoempty(struct node *x,int value) {
x=malloc(sizeof(struct node));
x->data=value;
x->prev=NULL;
x->next=NULL;
}
没有任何返回值或任何东西。事实上,这可能有效,但依赖于你无法控制的事情。
然后下一个电话
head=addatbeginning(head,5);
可能会按预期工作,也可能不会,这并不重要,因为您的投诉是
“我不明白这段代码如何仍然打印 5”
当你
printf("%d",head->data);
如果其他一切都正确的话,它应该打印 5。
试试这个:
#include <stdio.h>
#include <stdlib.h>
typedef struct linkedlist {
int data;
struct linkedlist *prev;
struct linkedlist *next;
}linkedlist;
linkedlist *new_ll_element(int value) {
linkedlist *new = malloc(sizeof(linkedlist));
new->data=value;
new->next=new->prev=NULL;
}
linkedlist *add_to_ll(linkedlist *list, int value) {
linkedlist *new = new_ll_element(value);
if (!list)
return new;
linkedlist *trav = list;
while (trav->next) {
trav = trav->next;
}
trav->next = new;
return list;
}
linkedlist *prepend_to_ll(linkedlist *list, int value) {
linkedlist *new = new_ll_element(value);
if (list)
new->next = list;
return new;
}
int main(int argc, char **argv) {
linkedlist *head=add_to_ll(NULL,2);
head=prepend_to_ll(head,5);
printf("%d\n",head->data);
return 0;
}
您的程序具有未定义的行为,因为
addatbeginning
和 addtoempty
不返回它们声明返回的 struct node*
。对于未定义的行为,程序几乎可以执行任何操作,例如打印 5 ... 或 6 ... 或什么都不打印。
对
addatbeginning
的更正可能如下所示:
struct node *addatbeginning(struct node *x, int value) {
struct node *ptr = malloc(sizeof *ptr);
*ptr = (struct node) {value, NULL, x};
return ptr;
}
这个函数也可以用在空列表上,所以
addtoempty
并不是真正需要的。
如果您不希望它返回新的
head
,您必须确保它在函数内设置:
void addatbeginning(struct node **x, int value) {
struct node *ptr = malloc(sizeof *ptr);
*ptr = (struct node) {value, NULL, *x};
*x = ptr;
}
然后您可以通过发送指向
head
: 的指针来调用它
head = addatbeginning(&head, 5);