指针函数不返回任何东西但返回一些东西?

问题描述 投票:0回答:2
#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,我尝试调用函数而不分配它们(因为它们没有返回任何内容),但它给了我一个错误。

c pointers linked-list
2个回答
0
投票

您的代码存在一些问题。

开头:

    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;
}

-1
投票

您的程序具有未定义的行为,因为

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);

演示

© www.soinside.com 2019 - 2024. All rights reserved.