Стек абстрактный тип данных в C - PullRequest
1 голос
/ 09 февраля 2012

Подскажите, пожалуйста, что я сделал не так? Я получаю ошибку 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 ]

2 голосов
/ 09 февраля 2012

Прямо из ворот head и tail не инициализированы. С самого начала это будет не по пути.

2 голосов
/ 09 февраля 2012

Самая насущная проблема заключается в том, что вы никогда не инициализируете head и tail в main():

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

Есть несколько других проблем:

  1. pop() утечка памяти.
  2. show() не будет работать, если список пуст (т. е. tail равен NULL).
  3. Когда список не пуст, show() завершается неудачнораспечатать один из его элементов.
0 голосов
/ 09 февраля 2012

Я изменил ваш код на

1) Инициализировать два poitners внутри 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;
}
...