最近学数据结构老想写写栈的那个头文件,不过写了一遍后错了,一直错,就在Push那里,一直卡住,很无奈:-(
后来发现还是自己的指针学的不够好!!!!唉.......
Push那个函数那里那里要写成Status Push(SqStack *S, SElemType e)的形式,而调用的时候以Push(&s, i);的形式,,就这里卡住了好久啊,唉,,如果不这样写的话,地址容易混淆,出现各种错误,这里就会出现形如Segmentation fault的错误。
好了,不多说了,留个代码,纪念吧~~
这里是头文件,存成.h型的头文件!
#include "constant.h"
#include <stdlib.h>
#define STACK_INIT_SIZE 100 /* 存储空间初始分配量 */
#define STACKINCREMENT 10 /* 存储空间分配增量 */
typedef int SElemType;
typedef struct
{
SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
SElemType *top; /* 栈顶指针 */
int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack; /* 顺序栈 */
Status InitStack (SqStack (*S))
{ //构造一个空栈S
(*S).base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!(*S).base)exit(OVERFLOW); //存储分配失败
(*S).top = (*S).base;
(*S).stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack
Status DestroyStack(SqStack (*S))
{ /* 销毁栈S,S不再存在 */
free((*S).base);
(*S).base=NULL;
(*S).top=NULL;
(*S).stacksize=0;
return OK;
}
Status GetTop(SqStack S,SElemType *e)
{ /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
if(S.top>S.base)
{
*e=*(S.top-1);
return OK;
}
else
return ERROR;
}
Status ClearStack(SqStack *S)
{ /* 把S置为空栈 */
(*S).top=(*S).base;
return OK;
}
Status StackEmpty(SqStack S)
{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
int StackLength(SqStack S)
{ /* 返回S的元素个数,即栈的长度 */
return S.top-S.base;
}
Status Push(SqStack *S, SElemType e)
{
if((*S).top - (*S).base >= (*S).stacksize)
{
(*S).base = (SElemType * ) realloc((*S).base,
((*S).stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!(*S).base)exit(OVERFLOW);
(*S).top = (*S).base + (*S).stacksize;
(*S).stacksize += STACKINCREMENT;
}
*(*S).top++ = e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if((*S).top==(*S).base)
return ERROR;
*e=*--(*S).top;
return OK;
}
Status StackTraverse(SqStack S,Status(*visit)(SElemType))
{ /* 从栈底到栈顶依次对栈中每个元素调用函数visit()。 */
/* 一旦visit()失败,则操作失败 */
while(S.top>S.base)
visit(*S.base++);
printf("\n");
return OK;
}
Status visit(SElemType c)
{
printf("%d ",c);
return OK;
}
这里是调用区。。随便打的。。莫介意。。可以忽略。。
#include<stdio.h>
#include "constant.h"
#include <stdlib.h>
#define STACK_INIT_SIZE 100 /* 存储空间初始分配量 */
#define STACKINCREMENT 10 /* 存储空间分配增量 */
#include "stack.h"
int main()
{
SqStack s;
char c;
int e;
InitStack(&s);
*s.top++=1;
GetTop(s, &e);
printf("%d\n", e);
for(int i=0; i<10; i++)
{
Push(&s, i);
}
for(int i=0; i<10; i++)
{
GetTop(s, &e);
printf("%d\n", e);
Pop(&s, &e);
}
return 0;
}
hint:constant.h是自己写的头文件。。
在学习数据结构中,作者在编写栈的头文件时遇到了困难,特别是在Push函数的实现上。问题出在对指针的理解不足,导致了Segmentation fault错误。解决方案是将Push函数定义为Status Push(SqStack *S, SElemType e),并在调用时使用Push(&s, i)的形式,避免地址混淆。作者分享这段经历以作纪念,并提供了头文件的代码示例。"
121396371,8608616,CSS盒模型详解:布局核心与CSS3扩展,"['CSS', '前端开发']
&spm=1001.2101.3001.5002&articleId=40401821&d=1&t=3&u=4b9440a10756460199770b2dd509f165)
9840

被折叠的 条评论
为什么被折叠?



