数据结构-栈的头文件编写以及调用(多么痛的领悟!)

在学习数据结构中,作者在编写栈的头文件时遇到了困难,特别是在Push函数的实现上。问题出在对指针的理解不足,导致了Segmentation fault错误。解决方案是将Push函数定义为Status Push(SqStack *S, SElemType e),并在调用时使用Push(&s, i)的形式,避免地址混淆。作者分享这段经历以作纪念,并提供了头文件的代码示例。" 121396371,8608616,CSS盒模型详解:布局核心与CSS3扩展,"['CSS', '前端开发']

最近学数据结构老想写写栈的那个头文件,不过写了一遍后错了,一直错,就在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是自己写的头文件。。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值