读书人

念写一个栈头文件不知道为何在测试程

发布时间: 2013-04-05 10:24:33 作者: rapoo

想写一个栈头文件,不知道为何在测试程序出现系统崩溃,实现不了。
Stack.h
#ifndef Stack_H
#define Stack_H

typedef int Item;
typedef struct node *PNode;

/*定义结点类型*/

typedef struct node
{
Item data;
PNode Last; /*指向上个结点*/
PNode Next; /*指向下个结点*/
}Node;

/*定义栈类型*/

typedef struct stack
{
PNode top; /*栈顶*/
int size; /*栈的大小*/
}Stack;

Stack *InitStack(); /*建立一个空栈*/

void DestroyStack(Stack *ps); /*销毁一个栈*/

void ClearStack(Stack *ps); /*清空一个栈*/

int IsEmpty(Stack *ps); /*判断栈是否为空*/

Item GetTop(Stack *ps,Item *pitem); /*得到栈顶元素,并赋给pitem*/

Stack Push(Stack *ps,Item item); /*使元素入栈*/

Stack Pop(Stack *ps,Item *pitem); /*删除栈顶,栈顶元素给pitem*/

#endif




Stack.c

#include"Stack.h"
#include<malloc.h>
#include<stdlib.h>

Stack *InitStack()
{
Stack *ps;
ps=(Stack *)malloc(sizeof(Stack)); /*开辟一个Stack大小的空间,想问这个stack大小的空间是不是包括PNode结构体大小的空间加上一个int空间*/
if(ps != NULL){ /*如果开辟空间成功*/
ps->top->date = 0;
ps->top->Next = NULL;
ps->top->Last = NULL;
size = 0;
return ps;
}
else
exit(1);
}

void DestoryStack(Stack *ps)
{
if(IsEmpty(ps) != 1)
ClearStack(ps);
free(ps);
}

void ClearStack(Stack *ps)
{
while(IsEmpty(ps) != 1)
Pop(ps,NULL);
}

int IsEmpty(Stack *ps)
{
if(ps->size == 0)
return 1;
else
return 0;
}

PNode GetTop(Stack *ps,Item *pitem)
{

if(IsEmpty(ps) != 1 && pitem != NULL)

*pitem=ps->top->Item;

return ps->top;
}

PNode Push(Stack *ps,Item item)
{
PNode pnode;


pnode = (PNode)malloc(sizeof(Node)); /*否则开辟一个新的结点*/
pnode->Item = item; /*把元素赋给pnode*/
ps->top->Next = pnode; /*使栈顶指向新结点*/
pnode->Last=ps->top; /*使新结点的指向栈顶*/


ps->top = pnode; /*使新的结点变成新的栈顶*/
ps->top->Next = NULL; /*新的栈顶下一个指向 NULL*/
ps->size++;
}
return ps;
}

PNode Pop(Stack *ps,Item *pitem)
{
PNode pnode;
if(IsEmpty(ps) != 1) {
if(pitem != NULL) /*如果需要得到要删去栈顶的元素,就把栈顶赋给pitem*/
*pitem = ps->top->Item;
if(ps->size == 1){
free(ps->top);
ps->top = NULL;
ps->size--;
}
else {
pnode = ps->top->Last; /*使pnode为栈顶的前一个元素*/
free(ps->top); /*释放栈顶空间,这句是不是就只是释放栈顶空间,top这个指针还是在的吧,如果在它指向什么的?*/
ps->top = pnode; /*使前一个元素变成栈顶 */
ps->top->Next = NULL;
ps->size--;

}
}
else {
printf("erroy\n");
exit(1);
}
}

test.c

#include"Stack.h"
#include<stdio.h>

int main()
{
Item i,x;
Stack *ps;

ps = InitStack();

for(i = 0; i < 10; i++)
Push(ps,i);

for(i= 0; i<10; i++) {
Pop(ps,&x);
printf(" %d",x);
}

printf("\n");

}

在Linux下
gcc -c Stack.c
gcc -c test.c
gcc Stack.o test.o -o test

运行后 Segmentation fault (core dumped)
谁能帮我看看,是什么问题啊?
[解决办法]
这里错了
Stack *InitStack()
{
Stack *ps;
ps=(Stack *)malloc(sizeof(Stack)); /*开辟一个Stack大小的空间*/
if(ps != NULL){ /*如果开辟空间成功*/
ps->top->date = 0; // ps->top是一个Node类型的指针,你没给它分配空间,野指针!
ps->top->Next = NULL;


ps->top->Last = NULL;
ps->size = 0;
return ps;
}
else
exit(1);
}

读书人网 >C语言

热点推荐