2012-02-09 2 views
1

Не могли бы вы рассказать мне, что я сделал не так? Я получаю ошибку SIGSEGV (ошибка сегментации). Является ли связанный список лучшим способом реализации абстрактного типа стека? Я пытаюсь не использовать глобальные переменные, поэтому я использовал двойные указатели.Стек абстрактных данных в C

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

Я отредактировал код, теперь он работает. Всем спасибо!!!

+1

не выдавать результат malloc в C. Только на C++. – Lefteris

ответ

2

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

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

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

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

Мне нужно будет больше смотреть на код, но я думаю, что он инициализируется внутри push. Поскольку он принимает указатель двойного стека и устанавливает его там – Lefteris

+0

@Lefteris: Поверьте мне, это не так. – NPE

+0

Да, вы правы, так как он не инициализирует обоих poitners до нуля. Если он это сделает, они должны получить инициализацию внутри толчка. – Lefteris

2

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

0

Я изменил свой код

1) Инициализировать два poitners внутри основных 0, так что они могут быть выделены с помощью нажимной функции

2) Удалена отливка из таНоса, так как это 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; 
} 
Смежные вопросы