我在这里使用链表实现了一个非常基本的堆栈作为练习。
我的程序有以下三个文件。
stack.h
#ifndef STACK_H
#define STACK_H
#include <stdio.h>
struct Node {int content; struct node *next;};
void push(struct Node **node, int i);
int pop(struct Node **node);
#endif
stack.c
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
void push(struct Node **node, int i)
{
struct Node *new_node = malloc(sizeof(struct Node));
if (!(*node)){
(*new_node).content = i;
(*new_node).next = NULL;
*node = new_node;
return;
}
(*new_node).content = i;
(*new_node).next = (struct Node *)*node;
*node = new_node;
return;
}
int pop(struct Node **node)
{
if (*node == NULL){
printf("Stack is empty\n");
exit(EXIT_FAILURE);
}
struct Node *temp = (**node).next;
int i = (**node).content;
free(*node);
*node = temp;
return i;
}
的main.c
#include <stdio.h>
#include "stack.h"
struct Node *top = NULL;
int main(void)
{
push(&top, 2);
printf("%d\n\n", pop(&top));
return 0;
}
当我编译它时,我收到以下警告
stack.c: In function ‘push’:
stack.c:18:19: warning: assignment from incompatible pointer type
(*new_node).next = (struct Node *)*node;
^
stack.c: In function ‘pop’:
stack.c:31:22: warning: initialization from incompatible pointer type
struct Node *temp = (**node).next;
^
虽然程序运行尽管有这些警告并提供正确的输出,但我仍然想知道为什么会发生这种情况。
为什么我会收到这些警告?我该如何修复它们?
答案 0 :(得分:2)
由于此声明中的拼写错误
struct Node {int content; struct node *next;};
^^^^ ^^^^
声明了两种类型不兼容的struct Node
和struct node
类型。
至于功能,可以更简单地定义它们。例如,函数push
可以通过以下方式声明。
int push( struct Node **node, int i )
{
struct Node *new_node = malloc( sizeof( struct Node ) );
int success = new_node != NULL;
if ( success )
{
(*new_node).content = i;
(*new_node).next = *node;
*node = new_node;
}
return success;
}
如果堆栈为空,退出程序也是一个坏主意。您还应该重写函数pop
。
例如,该函数可以声明为
int pop( struct Node **node, int *i );
如果堆栈为空,则函数返回0
。否则,它返回1
,并在表达式*i
中返回节点的值。