模拟简单的堆栈功能

时间:2014-02-03 08:08:58

标签: c stack

我还在学习C语言。我有一个问题是模拟一个简单的堆栈函数,如push,pop等。我发现{PALIL中未初始化datenext。那时,程序结束了。这是否算作内存泄漏?

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node{
    int date;
    struct Node * next;
}Node,*PNode;

typedef struct Stack{
    PNode pHead;
    PNode pTail;
}Stack;

void init(Stack *pS){  
    PNode n=(PNode)malloc(sizeof(Node));
    pS->pHead=n;
    pS->pTail=n;
    n->next=NULL;
}

void push(Stack *pS,int val){ 
    PNode p=(PNode)malloc(sizeof(Node));
    p->date=val;
    p->next=pS->pHead;
    pS->pHead=p;
}

void travel(Stack *pS){ 
    PNode p=pS->pHead;
    while(p->next){  
        printf("%d ",p->date);
        p=p->next;
    }
    printf("\n");
}

int main(void){

    Stack s;
    init(&s);  
    push(&s,1);
    travel(&s); 

    push(&s,1);
    travel(&s); 
    system("pause");
    return 0;
}

2 个答案:

答案 0 :(得分:1)

每个malloc都应与free()配对。你没有写/显示你的pop()函数,但那就是这个地方。如果没有释放内存缓冲区/对象,那么就是内存泄漏。

您在Init() m中分配了一个不需要的空第一项。

堆栈通常不需要尾巴,只需要一个头。你也永远不会更新尾巴...

答案 1 :(得分:0)

您在init上分配了不必要的节点。更重要的是,您没有初始化date成员。删除节点创建:

void init(Stack *pS) {  
    pS->pHead = NULL;
    pS->pTail = NULL;
}

push上无需投标。

PNode p = malloc(sizeof(Node));

即使travel可以是p->next,您的p功能也会检查NULL。更改while测试:

void travel(Stack *pS) { 
    PNode p = pS->pHead;
    while(p) {  
        printf("%d ", p->date);
        p = p->next;
    }
    printf("\n");
}