列表中的元素是6495,即前5个被推,然后是9,依此类推。现在我想要弹出5(我知道前6个应该按照FILO),即按相反的顺序。弹出的元素在第一次和第二次弹出操作时都是5。 Temp是一个局部变量所以即使我在pop函数中释放它也不会在main中释放如果我要在main中显示元素?这是真的吗?但无论如何我在pop操作本身做了我的cout但是它还没有用?如果我使用display fn。在pop之后它进入无限循环。
#include <iostream>
#include <cstdlib>
#include <climits>
using namespace std;
struct stackNode
{
int data;
struct stackNode *next;
};
int is_emp(struct stackNode* head)
{
if(head==NULL)
return 0;
else
return 1;
}
void push(struct stackNode** head,int data)
{
struct stackNode* current =(struct stackNode*)malloc(sizeof(struct stackNode));
current->data=data;
current->next=NULL;
current->next=*head;
*head=current;
}
int pop(struct stackNode** head)
{
int ele;
struct stackNode* temp=*head;
if(is_emp(*head)==NULL)
{
cout<<"Underflow";
return INT_MIN;
}
else
{
while(temp->next!=NULL)
{
temp=temp->next;
}
cout<<"Popped ele:"<<temp->data<<endl;
free(temp);
temp=NULL;
}
}
void disp(struct stackNode* head)
{
while(head!=NULL)
{
cout<<head->data<<endl;
head=head->next;
}
}
int main()
{
struct stackNode* head=NULL;
push(&head,5);
push(&head,9);
push(&head,4);
push(&head,6);
disp(head);
pop(&head);
disp(head);
return 0;
}
答案 0 :(得分:0)
if(temp!=NULL)
{
ele=temp->data;
temp=temp->next;
}
free(temp);
在这里,您正在使用临时变量而不是头部进行更改。 所以当你在main中看到它时,头指针仍然指向6。
而不是temp,在头部指针中进行更改。
答案 1 :(得分:0)
我认为这是您期待的代码。注意引用的使用。
#include <limits>
struct stackNode
{
stackNode *next;
int data;
stackNode(stackNode *n, int d) : next(n), data(d) {}
};
void push(stackNode* &head,int data)
{
head =new stackNode(head, data);
}
int pop(stackNode* &head)
{
if (head == NULL) {
return std::numeric_limits<int>::min();
} else {
int ret = head -> data;
stackNode *temp = head;
head = head->next;
delete temp;
return ret;
}
}
int main()
{
stackNode* head = NULL;
push(head,5);
push(head,9);
push(head,4);
push(head,6);
// disp(head);
pop(head);
// disp(head);
return 0;
}