还是要注意内存访问权限的问题
数组越界
指针未初始化(野指针)
链栈的数据结构
//链表的结构
typedef struct LinkStackNode
{
element data;
LinkStackNode* next;
}LinkStackNode, * LinkStack;
链栈的初始化
//初始化链栈
int Init_LinkStack(LinkStackNode *top)//有头节点
{
top = (LinkStackNode*)malloc(sizeof(LinkStackNode));//申请一个内存
if (top == NULL)
{
printf("分配失败,从新分配");
return ERROR;//分配失败
}
else
{
printf("分配成功\n");
top->next = NULL;//分配成功,//这里是创建一个头节点
return OK;
}
}
入栈操作
//开始入栈//这里使用的是头插法
int Push_LinkStack(LinkStackNode *top, element e)
{
LinkStackNode *node = (LinkStackNode*)malloc(sizeof(LinkStackNode));
if (node == NULL)
{
printf("分配失败");
return ERROR;
}
else
{
node->next = top->next;//将nede指针域置为NULL;
node->data = e;//给node数据域置为e;
top->next= node;//头插法插入
printf("%d\n",node->data);//打印
return OK;
}
}
出栈操作
//下面开始出栈操作
void Pop_LinkStackNode(LinkStackNode* top, element *e){
if (top->next == NULL)
printf("栈空,无法出栈");
else
{
printf("删除栈顶元素成功\n");//栈不为空的情况下
LinkStackNode* node = top->next;//出栈的指针指向栈顶
*e = node->data;//保存栈顶节点里面的值
top->next = node->next;//指向下一个节点,相当于顺序栈里面的top--;
free(node);
}
}
取栈顶元素
//取栈顶的元素,当栈非空时候返回当前栈的内容,指针S保持不变,
int GetTop(LinkStackNode *top,element *x)//传入头节点以及要取的栈顶指针;
{
LinkStackNode* node = (LinkStackNode*)malloc(sizeof(LinkStackNode));//新申请一个节点
node = top->next;//指向第一个有元素的节点;
if (node == NULL)//判断节点是否为空
{
return ERROR;
}
else//第一个节点不为空
{
*x = node->data;
printf("获取的栈顶元素为%d\n", node->data);
return *x;
}
}
//遍历链表
//遍历链栈中的元素
void PrintStack(LinkStackNode* top)
{
LinkStackNode *S = top->next;//临时节点
S = top->next;
while (S->next)
{
printf("%d", S->data);
S = S->next;
}
}
全部代码
#include<iostream>
#include<malloc.h>
#define element int
#define ERROR -1
#define OK 1
using namespace std;
//链表的结构
typedef struct LinkStackNode
{
element data;
LinkStackNode* next;
}LinkStackNode, * LinkStack;
//初始化链栈
int Init_LinkStack(LinkStackNode *top)//有头节点
{
top = (LinkStackNode*)malloc(sizeof(LinkStackNode));//申请一个内存
if (top == NULL)
{
printf("分配失败,从新分配");
return ERROR;//分配失败
}
else
{
printf("分配成功\n");
top->next = NULL;//分配成功,//这里是创建一个头节点
return OK;
}
}
//开始入栈//这里使用的是头插法
int Push_LinkStack(LinkStackNode *top, element e)
{
LinkStackNode *node = (LinkStackNode*)malloc(sizeof(LinkStackNode));
if (node == NULL)
{
printf("分配失败");
return ERROR;
}
else
{
node->next = top->next;//将nede指针域置为NULL;
node->data = e;//给node数据域置为e;
top->next= node;//头插法插入
printf("%d\n",node->data);//打印
return OK;
}
}
//下面开始出栈操作
void Pop_LinkStackNode(LinkStackNode* top, element *e){
if (top->next == NULL)
printf("栈空,无法出栈");
else
{
printf("删除栈顶元素成功\n");//栈不为空的情况下
LinkStackNode* node = top->next;//出栈的指针指向栈顶
*e = node->data;//保存栈顶节点里面的值
top->next = node->next;//指向下一个节点,相当于顺序栈里面的top--;
free(node);
}
}
//取栈顶的元素,当栈非空时候返回当前栈的内容,指针S保持不变,
int GetTop(LinkStackNode *top,element *x)//传入头节点以及要取的栈顶指针;
{
LinkStackNode* node = (LinkStackNode*)malloc(sizeof(LinkStackNode));//新申请一个节点
node = top->next;//指向第一个有元素的节点;
if (node == NULL)//判断节点是否为空
{
return ERROR;
}
else//第一个节点不为空
{
*x = node->data;
printf("获取的栈顶元素为%d\n", node->data);
return *x;
}
}
//遍历链栈中的元素
void PrintStack(LinkStackNode* top)
{
LinkStackNode *S = top->next;//临时节点
S = top->next;
while (S->next)
{
printf("%d", S->data);
S = S->next;
}
}
int main()//必须注意指针必须初始化
{
int i, n;
//开始操作
//初始化列表
LinkStackNode S ;//申请一个节点
Init_LinkStack(&S);//初始化
printf("入栈操作\n");
for (i = 0; i < 10; i++)
{
Push_LinkStack(&S, i);//入栈操作
}
//取栈顶元素
GetTop(&S,&n);//获取成功
//删除栈顶元素
Pop_LinkStackNode(&S, &n);
GetTop(&S, &n);
PrintStack(&S);
return 0;
}
2020/12/23,蓝桥杯/ccf/数据结构