c/c++ 链栈
链栈
下面的代码实现了以下功能
函数 | 功能描述 |
---|---|
push | 压入 |
pop | 弹出 |
show_list | 打印 |
clear | 释放所有内存空间 |
destroy | 释放所有内存空间 |
nodestack.h
#ifndef __NODESTACK__
#define __NODESTACK__
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <memory.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct nodestack{
int size;
Node *base;
Node *top;
}nodestack;
void init(nodestack*);
void push(nodestack*, ElemType);
void show_list(nodestack*);
void pop(nodestack*);
int length(nodestack*);
void clear(nodestack*);
void destroy(nodestack*);
#endif
nodestack.c
#include "nodestack.h"
Node* createNode(ElemType val){
Node* n = (Node*)malloc(sizeof(Node));
n->data = val;
n->next = NULL;
return n;
}
void init(nodestack* stack){
stack->size = 0;
stack->top = NULL;
stack->base = NULL;
}
void push(nodestack* stack, ElemType x){
Node* n = createNode(x);
//当栈为空的时候
if(stack->base == NULL){
stack->top = stack->base = n;
n->next = NULL;
stack->size++;
return;
}
n->next = stack->top;
stack->top = n;
stack->size++;
}
void show_list(nodestack* stack){
Node* top = stack->top;
while(top != NULL){
printf("%d
", top->data);
top = top->next;
}
}
void pop(nodestack* stack){
if(stack->size == 0)return;
Node* n = stack->top;
stack->top = stack->top->next;
free(n);
stack->size--;
}
int length(nodestack* stack){
return stack->size;
}
void clear(nodestack* stack){
Node* top = stack->top;
Node* tmp;
while(top != NULL){
tmp = top;
top = top->next;
free(tmp);
}
stack->top = stack->base = NULL;
stack->size = 0;
}
void destroy(nodestack* stack){
clear(stack);
}
nodestackmain.c
#include "nodestack.h"
int main(){
nodestack list;
init(&list);
int select = 1;
ElemType item;
int index;
while(select){
printf("*****************************************
");
printf("*** [1] push [2] pop ***
");
printf("*** [3] show_list [4] length ***
");
printf("*** [5] clear [6] destroy ***
");
printf("*** [0] quit ***
");
printf("*****************************************
");
printf("请选择:>");
scanf("%d", &select);
if(0 == select)
break;
switch(select){
case 1:
printf("请输入要插入的数据>
");
scanf("%d",&item);
push(&list, item);
show_list(&list);
break;
case 2:
pop(&list);
show_list(&list);
break;
case 3:
show_list(&list);
break;
case 4:
printf("length is %d
", length(&list));
show_list(&list);
break;
case 5:
clear(&list);
show_list(&list);
break;
case 6:
destroy(&list);
break;
default:
printf("输入的选择错误,请重新选择
");
break;
}
}
destroy(&list);
}