栈的链表实现

linked lists implementation of stack

#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++;
    }
}

我debug的时候说p->next=NULL然后stop,这个我不清楚

为什么我错了?如何修复它,我不清楚 NULL 和 top finger 的使用 提前感谢您的回答。

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

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

来模拟按值 传递

程序没有意义。

它是用 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 被重新分配。对象 stack 的数据成员 top 未初始化。所以这个声明

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;
    }
}