C语言中的堆栈抽象数据类型

C语言中的堆栈抽象数据类型,c,stack,abstract-data-type,C,Stack,Abstract Data Type,你能告诉我我做错了什么吗?我得到SIGSEGV分段错误。单链表是实现堆栈抽象数据类型的最佳方法吗?我尽量不使用全局变量,所以我使用了双指针 #include <stdio.h> #include <stdlib.h> typedef struct stack{ int data; struct stack *next; }STACK; void push(STACK **head,STACK **tail,int n) { STACK *x;

你能告诉我我做错了什么吗?我得到SIGSEGV分段错误。单链表是实现堆栈抽象数据类型的最佳方法吗?我尽量不使用全局变量,所以我使用了双指针

#include <stdio.h>
#include <stdlib.h>

typedef struct stack{
    int data;
    struct stack *next;
}STACK;

void push(STACK **head,STACK **tail,int n)
{
    STACK *x;
    if(*head==NULL)
    {
        (*head)=malloc(sizeof(STACK));
        (*head)->data=n;
        (*head)->next=NULL;
        *tail=*head;
    }
    else
    {
        x=malloc(sizeof(STACK));
        x->data=n;
        x->next=NULL;
        (*head)->next=x;
        (*head)=(*head)->next;
    }
}

void show(STACK *tail)
{
    if(tail!=NULL)
    {
        printf("From tail to head:\n");
        while(tail!=NULL)
        {
            printf("%d\n",tail->data);
            tail=tail->next;
        }
    }
    else
    {
        printf("The stack is empty!\n");
    }
}

void pop(STACK **head,STACK *tail)
{
    STACK *x;
    if(*head!=tail)
    {
        x=*head;
        while(tail->next->next!=NULL)
            tail=tail->next;
        printf("pop: %d\n",(*head)->data);
        *head=tail;
        free(x);
    }
    else
    {
        printf("pop: %d\n",(*head)->data);
        free(*head);
        *head=NULL;
    }
}

int main()
{
    STACK *head = NULL;
    STACK *tail = NULL;
    push(&head,&tail,4);
    pop(&head,tail);
    push(&head,&tail,7);
    push(&head,&tail,9);
    show(tail);
    return 0;
}

我编辑了代码,现在可以了。谢谢大家

最直接的问题是,您从未在main中初始化head和tail:

还有其他几个问题:

pop泄漏内存。 如果列表为空,即tail为空,则show将不起作用。 当列表不为空时,show无法打印其中一个元素。
最直接的问题是,您从未在main中初始化head和tail:

还有其他几个问题:

pop泄漏内存。 如果列表为空,即tail为空,则show将不起作用。 当列表不为空时,show无法打印其中一个元素。
刚走出大门,头部和尾部都未初始化。这从一开始就是不可能的。

刚走出大门,头部和尾部都没有初始化。那从一开始就是不可能的。

我把你的代码改为

1将main中的两个poitner初始化为0,以便通过push函数进行分配

2从malloc移除铸件,因为这是C,不需要

3您还应该注意aix指出的代码的缺陷。我没有在下面的示例中修复它们

#include <stdio.h>
#include <stdlib.h>

typedef struct stack{
    int data;
    struct stack *next;
}STACK;

void push(STACK **head,STACK **tail,int n)
{
    STACK *x;
    if(*head==NULL)
    {
        (*head)=malloc(sizeof(STACK));
        (*head)->data=n;
        (*head)->next=NULL;
        *tail=*head;
    }
    else
    {
        x=malloc(sizeof(STACK));
        x->data=n;
        x->next=NULL;
        (*head)->next=x;
        (*head)=(*head)->next;
    }
}

void show(STACK *tail)
{
    while(tail->next!=NULL)
    {
        printf("%d\n",tail->data);
        tail=tail->next;
    }
}

void pop(STACK **head,STACK *tail)
{
    while(tail->next->next!=NULL)
        tail=tail->next;
    printf("pop: %d\n",(*head)->data);
    *head=tail;
}

int main()
{
    STACK *head = 0;
    STACK* tail = 0;
    push(&head,&tail,4);
    push(&head,&tail,7);
    push(&head,&tail,2);
    pop(&head,tail);
    show(tail);
    return 0;
}

我把你的密码改成

1将main中的两个poitner初始化为0,以便通过push函数进行分配

2从malloc移除铸件,因为这是C,不需要

3您还应该注意aix指出的代码的缺陷。我没有在下面的示例中修复它们

#include <stdio.h>
#include <stdlib.h>

typedef struct stack{
    int data;
    struct stack *next;
}STACK;

void push(STACK **head,STACK **tail,int n)
{
    STACK *x;
    if(*head==NULL)
    {
        (*head)=malloc(sizeof(STACK));
        (*head)->data=n;
        (*head)->next=NULL;
        *tail=*head;
    }
    else
    {
        x=malloc(sizeof(STACK));
        x->data=n;
        x->next=NULL;
        (*head)->next=x;
        (*head)=(*head)->next;
    }
}

void show(STACK *tail)
{
    while(tail->next!=NULL)
    {
        printf("%d\n",tail->data);
        tail=tail->next;
    }
}

void pop(STACK **head,STACK *tail)
{
    while(tail->next->next!=NULL)
        tail=tail->next;
    printf("pop: %d\n",(*head)->data);
    *head=tail;
}

int main()
{
    STACK *head = 0;
    STACK* tail = 0;
    push(&head,&tail,4);
    push(&head,&tail,7);
    push(&head,&tail,2);
    pop(&head,tail);
    show(tail);
    return 0;
}

不要只在C.中使用MaloC的结果,不要在C++中只将C++中的MalOC的结果抛出。我现在必须看代码,但是我认为它在内部推送中初始化了。因为它接受一个双堆栈指针并将其malloc到there@Lefteris:相信我,它不是。是的,你是对的,因为他最初并没有将两个poitner初始化为0。如果他这样做了,那么他们应该在push内部初始化。我现在必须更多地查看代码,但我认为它确实在push内部初始化了。因为它接受一个双堆栈指针并将其malloc到there@Lefteris:相信我,它不是。是的,你是对的,因为他最初并没有将两个poitner初始化为0。如果他这样做了,那么他们应该在推内初始化。