使用链接列表

时间:2017-06-17 13:06:25

标签: c++ pointers data-structures linked-list

该程序是关于使用ling list的堆栈中的插入和删除。推送工作正常,但删除pop()函数有一些问题 错误。每当我尝试删除某些东西时,它会给出下溢带来的无限错误。即。顶部指针始终为空。

 #include<iostream>
 #include<stdlib.h>
 #include<process.h>

 using namespace std;

 struct node
 {
     int info;
     node *next;
 }*top,*save,*newptr,*ptr;

 node *create_new_node(int);
 void push(node*);
 void pop();
 void display(node*);

 int main()
  {
     top=NULL;
     int inf;
     char ch='y';
     while(ch=='y'||ch=='Y')
     {
         newptr=new node;
         cout<<"\nEnter the info to be added in the beginning of the stack\n";
         cin>>inf;
          if(newptr==NULL)
             cout<<"\nCannot create new node.ABORTING!!\n";
         else
         {
         newptr=create_new_node(inf);
         cout<<"\nPress enter to continue\n";
         system("pause");
         }
         push(newptr);
        cout<<"\nthe info has been inserted  in the stack\n";
        cout<<"\nThe stack now is\n";
        display(newptr);

        cout<<"\ndo you wish to add more elements to the stack.\nIf yes then 
 press y or else press n\n";
         cin>>ch;
         if(ch=='n'||ch=='N')
         {
             cout<<"\ndo you to delete elements from the stack\n";
             cout<,"\nIf yes then press d else press n\n";

             cin>>ch;
             if(ch=='d'||ch=='D')
             {
                 while(ch=='d'||ch=='D')
                 {
                     pop();
                     cout<<"\npress d to delete more elements y to add more 
  elements and n to exit\n";
                     cin>>ch;
                 }

             }

        }
     }
     delete(ptr);
     delete(newptr);
     delete(top);
     delete(save);
     return 0;
 }

 node* create_new_node(int n)
 {
     ptr=new node;
     ptr->info=n;
     ptr->next=NULL;
     return ptr;
 }

  void push(node *np)
  {
     if(top==NULL)
         top=np;
     else
     { 
        save=top;
        top=np;
         np->next=save;
     }
 }

 void pop()
{
     if(top==NULL)
         cout<<"underflow";
     else
     {
        ptr=top;
        top=top->next;
        delete ptr;

     }
}

void display(node *np)
{
    while(np!=NULL)
    {
        cout<<np->info<<"->";
        np=np->next;
    }
}

1 个答案:

答案 0 :(得分:0)

显示的代码中存在多个错误。

你的主要错误:

while(ch=='d'||ch=='D')
{
    pop();
    cout<<"\npress d to delete more elements y to add more elements and n to exit\n";
}

此时,当ch'd''D'时,执行将进入while循环。调用pop(),从堆栈中删除最顶层的元素,打印消息,并重复while循环。

此时,您的计划将发现ch仍为'd''D'的重要发现。没有任何改变它的价值。不幸的是,计算机程序始终完全按照您的要求执行,而不是您认为您希望它执行的操作。无论你在这里看起来多么努力,你都不会在这里找到任何改变ch值的代码。它将永远保持现在的价值。因此while循环再次运行。然后再次。然后再次。在这一点上,没有任何东西可以改变ch的值,所以你有一个无限循环。

此外,在main

    newptr=new node;

此指针的值稍后与NULL进行比较;如果不是......它会被

完全覆盖
     newptr=create_new_node(inf);

除了泄漏记忆外,这绝对没有任何结果。此代码似乎是剩余的垃圾,应该在修复错误的while循环逻辑后进行清理。