Как создать связанный список со значением Sentinel - PullRequest
0 голосов
/ 21 октября 2019

Я хочу создать функцию, которая создает связанный список на основе значения Sentinel -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 появляется на последнем узле в списке, но я этого не хочу.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Ваше определение функции не имеет смысла. Например, есть утечки памяти, как в этом фрагменте кода

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;
}
0 голосов
/ 21 октября 2019
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;

}

...