还是要注意内存访问权限的问题
数组越界
指针未初始化(野指针)
链栈的数据结构
//链表的结构
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("%dn",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("获取的栈顶元素为%dn", 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#include #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("%dn",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("获取的栈顶元素为%dn", 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/数据结构



