以下是我使用链表数据结构实现堆栈编写的代码。我理解数据结构的概念,但使用指针相当新,因此在实现方面遇到了麻烦。
#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();
谢谢你,花时间阅读。
答案 0 :(得分:4)
在上述功能中,我相信我所做的是;声明一个节点, 分配内存并返回指针。但显然是 代码不正确,我的知识仅限于理解,我是什么 做错了。
我看到的错误是您将该函数声明为返回NODE
,但您的代码返回NODE*
(指向NODE
的指针)。
您可以更改函数的声明以显示正确的返回类型。
NODE* createNode()
{
NODE *node;
node = (NODE*)malloc(sizeof(NODE));
return node;
}
或者你可以缩短它。
NODE* createNode()
{
return (NODE*)malloc(sizeof(NODE));
}