使用链表堆栈弹出操作

时间:2014-12-29 09:54:03

标签: c++ singly-linked-list

列表中的元素是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;
}

2 个答案:

答案 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;
}