2014-12-29 4 views
-1

Элементы в списке 6495 i.e, первые 5 были сдвинуты, затем 9 и так далее. Теперь я хочу поп 5 (я знаю, что первые 6 должны быть в соответствии с FILO), то есть в обратном порядке. Элемент popped равен 5 в первый и второй раз, когда я выполняю операцию pop. Temp - это локальная переменная, поэтому, даже если я освобожу ее в поп-функции, она не будет освобождена в основном, если бы я должен был отображать основные элементы? Это правда? Но в любом случае я сделал свой cout в самой поп-операции но он все еще не работает? Если я использую display fn. после поп он переходит в бесконечный цикл.Операция pop pop pop with связанный список

#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

Почему вы используете 'free' в коде на C++? Почему вы не используете один из стандартных шаблонов для этого? –

+0

@EdHeal Это не вызывает никаких проблем (не предупреждение). Что мне тогда использовать? – Rooney10

+0

@ Rooney10 По крайней мере, вы ничего не выделяете, так что должно быть 'free()' 'd там? –

ответ

0
if(temp!=NULL) 
{ 
    ele=temp->data; 
    temp=temp->next; 
} 
free(temp); 

Здесь вы вносите изменения с переменным темпом не с головой. Таким образом, указатель на голову по-прежнему указывает на 6, когда вы видите его в основном.

Вместо темпа внести изменения в указатель на голову.

+0

Yup, но я не могу использовать * head вместо temp, в этом случае связанный список будет потерян. Я использую temp для перехода к последнему элементу i.e, 5, чтобы освободить его, но поскольку это локальная переменная, изменения не отражаются снаружи. Я не знаю, что писать вместо temp – Rooney10

+0

make temp static – NupurGupta

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; 
} 
Смежные вопросы