2.2 栈--链栈
1.main.c
//
// main.c
// 8_LinkStack
//
// Created by ls on 2022/5/19.
// Copyright © 2022 LSC001. All rights reserved.
//
#include "LinkStack.h"
int main() {
LStack mystack;
InitStack(&mystack);
int select=1;
ElemType value=0;
while(select)
{
printf("********************************************\n");
printf("* [1] push_back [2] pop_back *\n");
printf("* [3] show_Stack [4] isEmpty *\n");
printf("* [5] get_top [6] length *\n");
printf("* [7] clear [8] destroy *\n");
printf("********************************************\n");
printf("请选择:> ");
scanf("%d",&select);
if(0 == select)
break;
switch (select)
{
case 1:
printf("Please input a number(-1 end): ");
while(scanf("%d",&value),value!= -1)
{
push_back(&mystack,value);
}
show_Stack(&mystack);
break;
case 2:
pop_back(&mystack,&value);
show_Stack(&mystack);
break;
case 3:
show_Stack(&mystack);
break;
case 4:
printf("Empty: %ld\n",isEmpty(mystack));
break;
case 5:
get_top(mystack);
break;
case 6:
printf("length: %ld\n",length(mystack));
break;
case 7:
clear0(&mystack);
break;
case 8:
destroy(&mystack);
break;
default:
printf("输入错误!");
break;
}
}
//destroy(&mystack);
printf("Hello, World!\n");
return 0;
}
- LinkStack.h
//
// LinkStack.h
// 8_LinkStack
//
// Created by ls on 2022/5/19.
// Copyright © 2022 LSC001. All rights reserved.
//
#ifndef LinkStack_h
#define LinkStack_h
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
// 1 定义宏
#define ElemType int
// 2 定义节点、单链表
typedef struct LSnode
{
ElemType data;
struct LSnode *next;
}LSnode,*PLSnode;
typedef struct LStack
{
PLSnode T;
int size;
}LStack;
// 3 函数声明
void InitStack(LStack *S);
void push_back(LStack *S,ElemType num); // 1
void pop_back(LStack *S,ElemType *num); // 2
void show_Stack(LStack *S); // 3
void get_top(LStack S); // 4
long isEmpty(LStack S); // 5
long length(LStack S); // 6
void clear0(LStack *S); // 7
void destroy(LStack *S); // 8
#endif /* LinkStack_h */
- LinkStack.c
//
// LinkStack.c
// 8_LinkStack
//
// Created by ls on 2022/5/19.
// Copyright © 2022 LSC001. All rights reserved.
//
#include "LinkStack.h"
void InitStack(LStack *S)
{
S->T = (PLSnode)malloc(sizeof(PLSnode));
assert(S->T != NULL);
S->T->next=NULL;
S->size=0;
}
PLSnode new_(ElemType num)
{
PLSnode p = (PLSnode)malloc(sizeof(PLSnode));
p->data = num;
return p;
}
void push_back(LStack *S,ElemType num) // 1
{
if(S->T == NULL) return;
if(0 == S->size)
{
S->T->data=num;
}
else{
PLSnode p = new_(num);
p->next = S->T;
S->T = p;
}
S->size++;
}
void pop_back(LStack *S,ElemType *num) // 2
{
if(S->T==NULL || 0 == S->size) return;
PLSnode p = S->T;
*num = S->T->data;
S->T = p->next;
S->size--;
}
void show_Stack(LStack *S) // 3
{
if(S->T==NULL || 0 == S->size) return;
PLSnode p = S->T;
int n = S->size;
while (n>0) {
printf("%d ",p->data);
p = p->next;
n--;
}
printf("\n");
}
void get_top(LStack S) // 4
{
if(S.T==NULL || 0 == S.size) return;
printf("%d\n",S.T->data);
}
long isEmpty(LStack S) // 5
{
if(S.size == 0)
return 1;
else
return 0;
}
long length(LStack S) // 6
{
return S.size;
}
void clear0(LStack *S) // 7
{
if(S->T==NULL || 0 == S->size) return;
while (S->size > 1) {
PLSnode p = S->T;
S->T = p->next;
free(p);
p=S->T;
S->size--;
}
S->size=0;
}
void destroy(LStack *S) // 8
{
clear0(S);
free(S->T);
S->T = NULL;
}