1、完整代码
#include
#include
#include
typedef int elemType;
//链栈节点(链栈的存储结构)
typedef struct StackNode
{
elemType data;
struct StackNode* next;
}stackNode;
int Push(stackNode * S,elemType e) //头插法
{
stackNode* p = (stackNode*)malloc(sizeof(stackNode));
if (p == NULL)
{
printf("内存申请失败n");
return -1;
}
p->data = e;
p->next = S->next;
S->next = p;
return 0;
}
int Pop(stackNode* S)
{
if (S == NULL || S->next == NULL)
{
puts("链栈为空!n");
return -1;
}
stackNode* p = S->next; //用指针变量p临时保存栈顶元素空间,以备释放
S->next = S->next->next;
free(p);
return 0;
}
void stackTraverse(stackNode* S)
{
printf("n遍历链栈:");
if (S == NULL || S->next == NULL)
{
puts("链栈为空!n");
return ;
}
stackNode* p = S->next;
while (p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("n");
}
elemType GetTop(stackNode* S)
{
if (S == NULL || S->next == NULL)
{
puts("链栈为空!n");
return -1;
}
return S->next->data;
}
int main()
{
//创建栈的表头节点(空节点)
stackNode Q;
stackNode* S = &Q;
S->data = 0;
S->next = NULL;
//向链栈赋值
printf("向链栈赋值(以空格分开,输入0结束):n");
int n = 0;
scanf_s("%d",&n);
while (n != 0) //输入0表示输入结束
{
Push(S, n);
scanf_s("%d", &n);
}
stackTraverse(S);
printf("n栈顶元素为:%dn", GetTop(S));
Pop(S);
printf("删除栈顶元素之后的链栈:");
stackTraverse(S);
printf("n栈顶元素为:%dn", GetTop(S));
return 0;
}
2、头插法简单图解