C语言中的堆栈抽象数据类型
你能告诉我我做错了什么吗?我得到SIGSEGV分段错误。单链表是实现堆栈抽象数据类型的最佳方法吗?我尽量不使用全局变量,所以我使用了双指针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;
#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。如果他这样做了,那么他们应该在推内初始化。