首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

念写一个栈头文件,不知道为何在测试程序出现系统崩溃,实现不了

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

想写一个栈头文件,不知道为何在测试程序出现系统崩溃,实现不了。
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);
}

热点排行