【问题标题】:How to return a pointer from a function to a pointer, C Language如何将函数的指针返回到指针,C语言
【发布时间】:2018-05-18 23:31:45
【问题描述】:

以下是我编写的使用链表数据结构实现堆栈的代码。我了解数据结构的概念,但对使用指针相当陌生,因此在实施时遇到了麻烦。

    #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();

感谢您花时间阅读。

【问题讨论】:

  • NODE createNode() => NODE *createNode()(看'*'
  • 请注意编译器警告。
  • 你知道如何用指针类型声明变量(使用例如NODE *)。为什么您认为返回类型会有所不同?基本上任何书籍或教程都应该涵盖这一点。

标签: c pointers data-structures


【解决方案1】:

在上述功能中,我相信我正在做的是;声明一个节点, 分配内存并返回指针。但显然 代码不正确,我的知识仅限于理解,我是什么 做错了。

我看到的错误是您将函数声明为返回NODE,但您的代码返回了NODE*(指向NODE 的指针)。

您可以更改函数的声明以显示正确的返回类型。

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

或者你可以把它缩短到这个。

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

【讨论】:

  • *NODE 应该是NODE*
  • @Barmar:我在哪里使用*NODE
  • 它成功了,我不知道我们可以创建指针函数。我会阅读更多关于它的信息。非常感谢。
  • @Seighart0:这不是指针函数。它只是一个返回指向NODE 的指针的函数。
猜你喜欢
  • 2012-02-02
  • 2013-04-10
  • 2021-06-25
  • 1970-01-01
  • 2013-06-09
  • 2018-11-11
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
相关资源
最近更新 更多