我想创建一个函数,该函数基于哨兵值-1创建链表并返回该列表的起始地址。
struct Node* Create_List(){
struct Node *head,*temp;
head=(struct Node*)malloc(sizeof(struct Node));
printf("Enter a value: ");
scanf("%d",&head->val);
if(head->val==-1){
head=NULL;
}
else{
temp=(struct Node*)malloc(sizeof(struct Node));
head->next=temp;
while(1){
temp->next=NULL;
printf("Enter a value: ");
scanf("%d",&temp->val);
if(temp->val==-1){
temp=NULL;
return head;
}
else{
temp->next=(struct Node*)malloc(sizeof(struct Node));
temp=temp->next;
}
}
}
return head;
}
当我在开头输入-1时,它会返回空列表,这种情况没问题。但是当我添加第二个节点时,第三个节点等-1出现在列表中的最后一个节点上,但我不希望这样。
您的函数定义没有意义。例如,存在内存泄漏,如以下代码片段所示
head=(struct Node*)malloc(sizeof(struct Node));
printf("Enter a value: ");
scanf("%d",&head->val);
if(head->val==-1){
head=NULL;
}
也就是说,首先分配内存并将其地址分配给指针头,然后如果用户输入 -1,则指针将被值 NULL 覆盖。因此,分配的内存未释放。
此外,while 循环总是将值为 -1 的节点添加到列表中。
函数可以通过以下方式定义
struct Node* Create_List( void )
{
struct Node *head = NULL;
struct Node **current = &head;
while ( 1 )
{
printf( "Enter a value of the node (-1 - exit): " );
int val;
if ( scanf( "%d", &val ) != 1 || val == -1 ) break;
*current = malloc( sizeof( struct Node ) );
( *current )->val = val;
( *current )->next = NULL;
current = &( *current )->next;
}
return head;
}
struct Node* Create_List(){
struct Node *head,*temp;
int val;
printf("Enter a value: ");
scanf("%d",&val);
if(val==-1){
head=NULL;
}
else{
head=(struct Node *)malloc(sizeof(struct Node));
head->val=val;
head->next=NULL;
temp=head;
while(val!=-1){
printf("Enter a value: ");
scanf("%d",&val);
if(val!=-1){
temp->next=(struct Node *)malloc(sizeof(struct Node));
temp=temp->next;
temp->val=val;
}
else{
temp->next=NULL;
return head;
}
}
}
return head;
}