【问题标题】:Stack abstract data type in CC中的堆栈抽象数据类型
【发布时间】:2012-02-09 14:19:41
【问题描述】:

你能告诉我我做错了什么吗?我收到 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;
}

我编辑了代码,现在它可以工作了。谢谢大家!!!

【问题讨论】:

  • 不要在 C 中转换 malloc 的结果。仅在 C++ 中。

标签: c stack abstract-data-type


【解决方案1】:

最直接的问题是你从来没有在main()中初始化headtail

STACK *head = NULL;
STACK *tail = NULL;

还有其他几个问题:

  1. pop() 内存泄漏。
  2. 如果列表为空(即tailNULL),show() 将不起作用。
  3. 当列表不为空时,show() 无法打印其中一个元素。

【讨论】:

  • 我现在将不得不更多地查看代码,但我认为它确实在 push 中被初始化了。因为它接受一个双栈指针并在那里 malloc
  • @Lefteris:相信我,它不会。
  • 是的,你是对的,因为他一开始并没有将两个指针都初始化为 0。如果他这样做了,那么它们应该在 push 中被初始化。
【解决方案2】:

一开始,headtail 都未初始化。从一开始就不会这样做。

【讨论】:

    【解决方案3】:

    我把你的代码改成了

    1) 将 main 内部的两个指针初始化为 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2019-03-12
      • 2011-07-01
      • 2016-11-02
      • 1970-01-01
      相关资源
      最近更新 更多