C-在链接列表代码的尾部插入节点



我正在尝试解决hackerrank上的数据结构问题。我似乎找不到我的代码有什么问题。我想知道这里是否有问题。

Node* Insert(Node *head,int data){
struct Node *ptr = head,*new_node=(struct Node*)malloc(sizeof(struct Node));
new_node->data=data;
new_node->next=NULL;
if(ptr){
    while(ptr->next != NULL){
        ptr=ptr->next;
    }
    ptr->next=new_node;
}
else{
    head=new_node;
}
return(head);
}

奇怪的是,几个月前我练习时也接受了同样的代码。这是问题的链接。

P.S。我已经花了几个小时来弄清楚,我不确定是否是一个提出问题的地方。如果不是,我愿意删除它。

编辑:

Node is defined as 
  struct Node
  {
     int data;
     struct Node *next;
  }

首先是 typedef避免命名不匹配的结构。

struct node {
     int data;
     struct node *next;
};
typedef struct node Node;

Insert()函数应为

void Insert(Node **head,int data){
        while(*head){
                head = &(*head)->next;
        }
        *head = malloc(sizeof **head);
        (*head)->data=data;
        (*head)->next=NULL;
}

并像这样

致电Insert()
int main() {
        Node *headptr = 0;
        Insert(&headptr, 100);/*pass the address of headptr */
        /*.. 
        display(headptr); 
        */
        return 0;
}

我认为您的代码是不正确的,这是由于误解了如何按价值传递的指针,在您的情况下,如果列表为空,则会这样做:

head=new_node;

但这会将新节点分配给不头部,而是将新节点分配给某个临时头指针副本(头(,您的真正头仍然为空,因此您必须将指针传递给指针到达:

Node* Insert(Node **head,int data)

和分配:

*head = new_node;

相关内容

  • 没有找到相关文章