純C 堆疊(先進後出) – 使用鏈結(Link)實作(C 語言動態記憶體宣告)[C_link_stack]

純C 堆疊(先進後出) – 使用鏈結(Link)實作(C 語言動態記憶體宣告)[C_link_stack]

純C 堆疊(先進後出) – 使用鏈結(Link)實作(C 語言動態記憶體宣告)[C_link_stack]


GITHUB: https://github.com/jash-git/C_link_stack


//堆疊(先進後出) - 使用鏈結(Link)實作(C 語言動態記憶體宣告)
//http://openhome.cc/Gossip/AlgorithmGossip/StackByLink.htm
#include <stdio.h>
#include <stdlib.h>

struct node {
    int data;
    struct node *next;
};

typedef struct node Node;

Node* creates(void);         // 建立堆疊
int isEmpty(Node*);           // 堆疊已空
int stacktop(Node*);   // 傳回頂端元素
Node* add(Node*, int);   // 新增元素
Node* delete(Node*);     // 刪除元素
void list(Node*);      // 顯示所有內容

int main(void) {
    Node* sTop;
    int input, select;

    sTop = creates();

    while(1) {
        printf("\n\n請輸入選項(-1結束):");
        printf("\n(1)插入值至堆疊");
        printf("\n(2)顯示堆疊頂端");
        printf("\n(3)刪除頂端值");
        printf("\n(4)顯示所有內容");
        printf("\n\$c>");
        scanf("%d", &select);

        if(select == -1)
            break;

        switch(select) {
            case 1:
                printf("\n輸入值:");
                scanf("%d", &input);
                sTop = add(sTop, input);
                break;
            case 2:
                printf("\n頂端值:%d", stacktop(sTop));
                break;
            case 3:
                sTop = delete(sTop);
                break;
            case 4:
                list(sTop);
                break;
            default:
                printf("\n選項錯誤!");
        }
    }

    printf("\n");

    return 0;
}

Node* creates() {
    return NULL;
}

int isEmpty(Node* top) {
    return (top == NULL);
}

int stacktop(Node* top) {
    return top->data;
}

Node* add(Node* top, int item) {
    Node* newnode;

    newnode = (Node*) malloc(sizeof(Node));

    if(newnode == NULL) {
        printf("\n記憶體配置失敗!");
        exit(1);
    }

    newnode->data = item;
    newnode->next = top;
    top = newnode;

    return top;
}

Node* delete(Node* top) {
    Node* tmpnode;

    tmpnode = top;
    if(tmpnode == NULL) {
        printf("\n堆疊已空!");
        return NULL;
    }

    top = top->next;
    free(tmpnode);

    return top;
}

void list(Node* top) {
    Node* tmpnode;
    tmpnode = top;

    printf("\n堆疊內容:");
    while(tmpnode != NULL) {
        printf("%d ", tmpnode->data);
        tmpnode = tmpnode->next;
    }
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *