Как вернуть указатель из функции на указатель, язык C - PullRequest
0 голосов
/ 19 мая 2018

Ниже приведен код, который я написал для реализации стека с использованием структуры данных связанного списка.Я понимаю концепции структуры данных, но я довольно новичок в использовании указателей и, следовательно, испытываю проблемы с реализацией.

    #include<stdio.h>
    #include<stdlib.h>

    typedef struct NODE{
        int data;
        struct NODE *next;
    }NODE;

    NODE *top=NULL;
    NODE *newNode=NULL;

    NODE createNode();
    void push(NODE *newNode, int element);
    int pop();
    void display();

    int main()
    {
        int element,choice,p_item;

        do
        {
            printf("\nWhat operation would you like to perform on stack?\n1.Push\n2.Pop\n3.Display\n4.Exit\n");
            printf("\nEnter your choice: ");
            scanf("%d",&choice);
            switch(choice)
            {
                case 1: printf("\nScan an element to push on stack: ");
                        scanf("%d",&element);
                        push(newNode, element);
                        break;

                case 2: p_item=pop();
                        printf("\nThe popped item is %d.\n",p_item);
                        break;

                case 3: display();
                        break;

                case 4: exit(0);
                        break;

                default: printf("\nWrong Choice!!Enter Again!\n");
            }
        }while(choice!=4);

        return 0;
    }

int pop()
{   
    if(top==NULL)
    {
        printf("\nStack UnderFlow!\n");
        return 0;
    }
    NODE *temp=top;
    int p_item;

        p_item=top->data;
        top=top->next;
        free(temp);

    return p_item; 
}

void display()
{
   if(top == NULL)
        printf("\nStack UnderFlow!\n");
   else
   {
        NODE* temp = top;
        while(temp->next != NULL)
        {
            printf("%d--->",temp->data);
            temp=temp->next;
        }  
        printf("%d--->NULL",temp->data);
   }
}

В большинстве случаев написанный выше код верен, единственное место, где возникают проблемы, это следующий раздел:

    NODE createNode()
    {   NODE *node;
        node=(NODE*)malloc(sizeof(NODE));
        return node;  //line 54
    }

В вышеприведенной функции я считаю, что я делаю;объявив узел, выделив ему память и вернув указатель.Но, видимо, код неправильный, и мои знания ограничены, чтобы понять, что я делаю неправильно.

    void push(NODE *newNode, int element)
    {
        newNode=createNode();  //line 59
        // newNode=(NODE*)malloc(sizeof(NODE));
        newNode->data=element;
        if(top==NULL)
        {
            newNode->next=NULL;
            top=newNode;
            return;
        }
        newNode->next=top;
        top=newNode;
    }

В приведенном выше коде, если я опущу

    newNode=createNode();

и раскомментируем следующую строку,

    newNode=(NODE*)malloc(sizeof(NODE));

Тогда я могу без проблем выполнить всю программу целиком, но для реализации других концепций структуры данных мне хотелось бы понять, в чем проблема.

Ниже приведена ошибка:

stack_using_linked_list.c: In function ‘createNode’:
stack_using_linked_list.c:54:12: error: incompatible types when returning type ‘NODE * {aka struct NODE *}’ but ‘NODE {aka struct NODE}’ was expected
     return node;
            ^
stack_using_linked_list.c: In function ‘push’:
stack_using_linked_list.c:59:12: error: incompatible types when assigning to type ‘NODE * {aka struct NODE *}’ from type ‘NODE {aka struct NODE}’
     newNode=createNode();

Спасибо, что нашли время прочитать.

1 Ответ

0 голосов
/ 19 мая 2018

В вышеприведенной функции я верю в то, что я делаю;объявив узел, выделив ему память и вернув указатель.Но, видимо, код неправильный, и мои знания ограничены, чтобы понять, что я делаю неправильно.

Я вижу ошибку в том, что вы объявили функцию как возвращающую NODE, но ваш код возвращаетa NODE* (указатель на NODE).

Вы можете изменить объявление своей функции, чтобы показать правильный тип возвращаемого значения.

NODE* createNode()
{
    NODE *node;
    node = (NODE*)malloc(sizeof(NODE));
    return node;
}

Или вы можете сократить его доэто.

NODE* createNode()
{
    return (NODE*)malloc(sizeof(NODE));
}
...