- 只实现了int,不会通用的
- 节点包含三个元素,next,value,count,我的电脑结构体反正用的内存对齐,一个指针一个int 16字节,一个指针两个int还是16字节
- 链表节点从头部插入,也就是说链表指针始终指向栈顶,麻烦就是有些操作需要取地址,解决方法可以用个不放数据的头节点
#include
#include
typedef struct Stacknode {
struct Stacknode* next;
int value;
int count;
}stacknode;
void init(stacknode** stack, int value);
void display(stacknode* stack);
int get_top(stacknode* stack);
int pop(stacknode** stack);
void push(stacknode** stack, int num);
void destroy(stacknode** stack);
void main() {
stacknode* stack = NULL;
init(&stack, 1);
init(&stack, 2);
init(&stack, 3);
display(stack);
printf("get_top %dn", get_top(stack));
printf("pop %dn", pop(&stack));
display(stack);
push(&stack, 4);
printf("pushn");
display(stack);
destroy(&stack);
display(stack);
}
void init(stacknode** stack,int value) {
stacknode* p = (stacknode*)malloc(16);
if (!p) {
printf("errorn");
exit(1);
}
p->value = value;
if (*stack==NULL) {
*stack = p;
(*stack)->next = NULL;
(*stack)->count = 1;
}
else {
p->next = *stack;
p->count = (*stack)->count+1;
*stack = p;
}
}
void display(stacknode* stack) {
if (!stack)
printf("栈空n");
while (stack) {
printf("display %d %dn", stack->value,stack->count);
stack=stack->next;
}
printf("n");
}
//返回栈顶元素
int get_top(stacknode* stack) {
if (!stack) {
printf("栈空n");
exit(1);
}
else
return stack->value;
}
//弹出并返回栈顶元素
int pop(stacknode** stack) {
if (!stack) {
printf("栈空n");
exit(1);
}
else {
int ans = (*stack)->value;
stacknode* p = (*stack);
*stack = (*stack)->next;
if (p)
free(p);
return ans;
}
}
//压入元素
void push(stacknode** stack, int num) {
stacknode* node = (stacknode*)malloc(16);
if (!node) {
printf("errorn");
exit(1);
}
node->value = num;
if (*stack) {
node->count = (*stack)->count + 1;
node->next = *stack;
}
else {
node->count = 1;
node->next = NULL;
}
*stack = node;
}
//清空栈
void destroy(stacknode** stack) {
if (!*stack)
printf("栈空n");
while (*stack) {
stacknode* p = *stack;
*stack = (*stack)->next;
free(p);
}
}