C言語スタックの実現

2656 ワード

最近、javaメモリ管理を研究する時、スタックなどのデータ構造の方面の内容によく会います.スタックの関連内容は長い間温習されていませんので、ここでC言語で簡単に実現することにしました.後で自分で確認してもいいです.基礎データ構造を復習しながら、C言語も復習します.ナンセンスは言わずに直接コードします.
stack.h
#include
#include

typedef struct node {
    char *name;
    int grade;
    int age;
    struct node *next;
} *StackNode, node;

typedef struct Stack {
    StackNode top;
    StackNode bottom;
} Stack;

//    
void init(Stack *pstack);
//  
void push(Stack *pstack, StackNode pnode );
//  
StackNode pop(Stack *pstack);
//    
int isEmpty(Stack *pstack);
//  
void ClearAll(Stack *pstack);

以下は圧スタック、弾スタック、クリア、遍歴などの操作の具体的な実現です.
#include"stack.h"

void init(Stack *pstack) {
    pstack->top  = (StackNode)malloc(sizeof(node));
    if (pstack->top == NULL) {
        printf("      !
"); return; } pstack->bottom = pstack->top; pstack->top->next = NULL; } int isEmpty(Stack *pstack) { if (pstack == NULL) { printf(" !
"); return 0; } else { if (pstack->top == pstack->bottom) return 1; else return 0; } } void push(Stack *pstack, StackNode pnode) { if (pstack == NULL) printf(" : !
"); pnode->next = pstack->top; pstack->top = pnode; } StackNode pop(Stack *pstack) { StackNode result = NULL; if (isEmpty(pstack)) { printf(" , !
"); } else { result = pstack->top; pstack->top = pstack->top->next; } return result; } void ClearAll(Stack *pstack) { if (isEmpty(pstack)) return; StackNode p = pstack->top; StackNode q = NULL; while(p != pstack->bottom) { q = p->next; free(p); p = q; } pstack->top = pstack->bottom; } void print(Stack *pstack) { if (pstack == NULL) printf(" : !"); else if (pstack->top == pstack->bottom) { printf(" !
"); } else { StackNode p = pstack->top; while (p != pstack->bottom) { printf(" :%s\t :%d\t :%d
",p->name, p->grade, p->age); p = p->next; } } } int main() { Stack *pstack; init(pstack); StackNode pnode = (StackNode)malloc(sizeof(node)); pnode->name = "karno"; pnode->grade = 100; pnode->age = 23; push(pstack, pnode); print(pstack); StackNode result = pop(pstack); print(pstack); return 0; }