链表实现堆栈

时间:2016-04-01 09:11:26

标签: c pointers stack singly-linked-list

#include "stdio.h"
#include "stdlib.h"

struct node_type {
    int data;
    struct node_type *next;
};

struct stack_type{
    node_type *top;
    int length;
};

void push(node_type *head,stack_type stack);

int main()
{
    struct stack_type stack;
    node_type *list;
    list = (node_type *)malloc(sizeof(node_type));
    list->next = NULL;
    node_type *head;
    head = list;
    stack.length = 0;   //set stack empty
    push(head, stack);
    list = head->next;
    printf("The entegers are:");
    do {
        printf("%d", stack.top->data);
        list = list->next;
        stack.top = list;
    } while (list->next != 0);
    system("pause");
    return 0;
}

void push(node_type *head,stack_type stack)
{
    int i, n;
    node_type *p;
    p = (node_type*)malloc(sizeof(node_type));
    p = head;
    printf("Enter the integers(0 to end):");
    for (;;) {
        scanf("%d", &n);
        if (n == 0)
            break;
        stack.top->data = n;
        p->next = stack.top;
        stack.length++;
    }
}

当我调试时,它说p-> next = NULL并停止,我不清楚这个。

为什么我错了?如何修复它,我不清楚使用NULL和顶部手指 谢谢你的答案。

2 个答案:

答案 0 :(得分:3)

两个问题:首先在main函数中,你没有初始化stack.top意味着它将有一个不确定值,取消引用这个看似随机的指针,就像你在push函数将导致未定义的行为

第二个问题是您将stack结构按值传递给push ,这意味着它已被复制并且所有更改都在push函数中完成仅在结构的本地副本上完成。您需要使用指针和地址操作符&模拟按值传递

答案 1 :(得分:2)

该计划没有意义。

它是用C语言编写的,但是像C ++程序一样编译。

功能push完全错误。

void push(node_type *head,stack_type stack)
{
    int i, n;
    node_type *p;
    p = (node_type*)malloc(sizeof(node_type));
    p = head;
    //...

堆栈被值接受。因此原始堆栈将不会更改。存在内存泄漏,因为在分配内存后重新分配指针p。对象top的数据成员stack未初始化。所以这句话

stack.top->data = n;

导致程序的行为未定义。

首先,您应该将程序编译为C程序。在这种情况下,编译器将报告大量错误,因为没有名称声明 node_typestack_type。 所以即使第二个结构声明也是无效的

struct stack_type{
    node_type *top;
    ^^^^^^^^^^^^^^
    int length;
};

必须有

struct stack_type{
    struct node_type *top;
    ^^^^^^^^^^^^^^^^
    int length;
};

函数push应至少声明为

void push( struct stack_type *stack, int data );

它应该只做一件事:在堆栈中推送data的vakue。

考虑到没有参数的函数main应声明为

int main( void )

函数push的定义可以采用以下方式

void push( struct stack_type *stack, int data );

int main( void )
{
    struct stack_type stack = { NULL, 0 };

    //...

    int data;

    while ( scanf( "%d", &data ) == 1 && data != 0 )
    {
        push( &stack, data );
    }
    //...
}

void push( struct stack_type *stack, int data )
{
    struct node_type *node = malloc( sizeof( struct node_type ) );

    if ( node != NULL )
    {
        node->data = data;
        node->next = stack->top;
        stack->top = node;
        ++stack->length;
    }
}