我正在尝试解决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);
}
奇怪的是,在我练习的几个月前,同样的代码被接受了。这是link to the problem。
P.S。我花了好几个小时试图搞清楚,而且我不确定SO是否适合提问。如果不是,我愿意将其删除。
编辑:
Node is defined as
struct Node
{
int data;
struct Node *next;
}
答案 0 :(得分:0)
首先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;
}
答案 1 :(得分:-1)
我认为你的代码是不正确的,因为误解了指针如何通过值传递,在你的情况下,如果列表为空,你将会这样做:
head=new_node;
但是这会将新节点分配给头部而不是一些临时头指针副本(头部),你的真实头部仍为空,所以你必须将指针传递给指向头部的指针:
Node* Insert(Node **head,int data)
并指定:
*head = new_node;