在C中堆栈抽象数据类型

时间:2012-02-09 14:19:41

标签: 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;
    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;
}

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

3 个答案:

答案 0 :(得分:2)

最直接的问题是您永远不会在head中初始化tailmain()

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

还有其他一些问题:

  1. pop()泄漏记忆。
  2. 如果列表为空(<{1}}为show()),
  3. tail将无效。
  4. 当列表不为空时,NULL无法打印其中一个元素。

答案 1 :(得分:2)

刚出门,headtail未初始化。从一开始就是不可能的。

答案 2 :(得分: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;
}