Почему в моей структуре нет изменений?(связанный список) - PullRequest
0 голосов
/ 08 июля 2019

Обратите внимание на функцию insert_beg, я передал структурный адрес функции и с этим я сделал операцию (вставку в начале), поэтому, когда я пересекаю список. Это не обновляется. и если я изменю тип возвращаемого значения функции (insert_beg) на struct node * и назначу его началу (внутри main). Это отражается. Вопрос в том, что хотя я и передал начальный адрес функции (вызов по ссылке), почему он не отражается в первую очередь?

П.С .: Я новичок в указателях и структурах, помоги мне! Спасибо !!

#include<stdio.h>
#include<stdlib.h>
struct node {
    int val;
    struct node *link;
};

//Operations
void traverse(struct node *START);
struct node* search(struct node *START,int);
void insert_beg(struct node *START);

int main(){

    struct node *start;
    start = NULL;

    int choice = 1;
    while(choice){
        printf("\n\n****Linked List****\n");
        printf("1.Create Node\n2.Traverse LL\n3.Search\n4.Insert At Beginning\nEnter Your Choice : ");
        scanf("%d",&choice);
        switch(choice){
            case 1:{
                //create node
                struct node *new_node = (struct node*)malloc(sizeof(struct node));
                printf("Enter Data : ");
                scanf("%d",&new_node->val);
                new_node->link = NULL;

                if(start == NULL){
                    //This means that the linked list is empty
                    start = new_node;
                }else{
                    //This means the the ll has more than 1 node
                    struct node *iter = start;
                    while(iter->link != NULL){
                        iter = iter->link;
                    }
                    //iter points to the last node now
                    iter->link = new_node;
                }
                break;
            }
            case 2:{
                //Traverse
                traverse(start);
                break;
            }
            case 3:{
                printf("\nEnter the data to be searched : ");
                int data;
                scanf("%d",&data);
                struct node *pos = search(start,data);
                if(pos != NULL)
                    printf("Data : %d is present | Address : %p",pos->val,pos->link);
                else
                    printf("-1");
                break;
            }
            //Insertion
            case 4:{
                //1.Insert Beginning
                insert_beg(start);
               //start = insert_beg(start);
                break;
            }
            default:{
                choice = 0;
                break;
            }
        }
    } 
    return 7;
}

void insert_beg(struct node *START){
    struct node *new_node = (struct node*) malloc(sizeof(struct node));
    printf("Enter the data to be stored : ");
    scanf("%d",&new_node->val);
    new_node->link = START;
    START = new_node;
    // return START;
}


void traverse(struct node *START){
    struct node* iter = START;
    int node_count = 0;
    while(iter != NULL){
        printf("Data : %d | Address : %p\n",iter->val,iter);
        iter = iter->link;
        node_count++;
        }
    printf("LL has %d node(s)",node_count);
}

struct node* search(struct node *START,int data){
    struct node* pos = NULL;
    struct node* iter = START;
    if(START != NULL){
    while(iter->link != NULL){
        if(data == iter->val){
            pos = iter;
            break;
        }
        else
            iter = iter->link;
        }
    }
    return pos;
}

1 Ответ

0 голосов
/ 09 июля 2019

Следующие изменения должны исправить проблему.

Далее передается адрес заголовка списка (начало), поэтому содержимое заголовка списка может быть изменено.

Я также включил соответствующую проверку ошибок

в прототипах заменить:

void insert_beg(struct node *START);

с:

void insert_beg(struct node **START);

заменить функцию insert_beg() на следующую:

void insert_beg(struct node **START)
{
    struct node *new_node = malloc(sizeof(struct node));
    if( !new_node )
    {
        perror( "malloc failed" );
        // free all allocated memory, then
        exit( EXIT_FAILURE );
    }

    printf("Enter the data to be stored : ");
    if( scanf("%d",&new_node->val) != 1 )
    {
        fprintf( stderr, "scanf for data failed\n" );
        free( new_node );
    }

    if( !(*START)  )
    { // list is empty
        *START = new_node;
        new_node->link = NULL;
    }

    else
    {  // list already contains (at least) one node
        new_node->link = *START;
        *START = new_node;
    }
    // return START;
}

При звонке insert_beg() используйте следующий оператор:

insert_beg(&start);

Обратите внимание, что параметром является адрес заголовка списка, а не содержимое заголовка списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...