链表是带头结点的. 每次执行入栈操作, 都是把数据压入第1个节点.
完整代码如下:
#include <stdio.h>
#define true 1;
#define false 0;
typedef int elementType;
struct s_stack {
elementType data;
struct s_stack* next;
};
typedef struct s_stack stack;
typedef struct s_stack* ptr_stack;
// 函数声明
ptr_stack createStack ();
void push (ptr_stack ptr, elementType x);
void print (ptr_stack ptr);
elementType pop (ptr_stack ptr);
int main () {
int i;
ptr_stack stackHead;
stackHead = createStack();
/* 入栈测试开始 */
for (i=1; i<100; i+=8) {
push(stackHead, i);
}
print(stackHead);
/* 入栈测试结束 */
/* 出栈测试开始 */
// stackHead = createStack();
elementType popValue = pop(stackHead);
printf("被弹出的元素的值是: %d
", popValue);
print(stackHead);
/* 出栈测试结束 */
return 0;
}
// 创建空栈
ptr_stack createStack () {
ptr_stack ptr;
ptr = (stack*)malloc(sizeof(stack));
ptr->next = NULL;
return ptr;
}
// 入栈
void push (ptr_stack ptr, elementType x) {
ptr_stack curNode; // 存放当前节点
curNode = (stack*)malloc(sizeof(stack));
curNode->data = x;
curNode->next = ptr->next;
ptr->next = curNode;
}
// 打印
void print (ptr_stack ptr) {
int length = 0; // 堆栈链表长度
ptr = ptr->next;
printf("堆栈链表的数据如下
");
while (ptr != NULL) {
printf("%d ", ptr->data);
length += 1;
ptr = ptr->next;
}
printf("
");
printf("堆栈链表的长度是: %d
", length);
printf("
");
}
// 出栈
// 如果栈空返回 false
// 返回被pop的元素的值, 并把该元素从栈中移除
elementType pop (ptr_stack ptr) {
if (ptr->next == NULL) {
printf("栈空不能出栈
");
return false;
}
ptr_stack curNode; // 指向弹出元素
int curValue; // 保存弹出元素的值
curNode = ptr->next;
ptr->next = ptr->next->next;
curValue = curNode->data;
free(curNode);
return curValue;
}