单链表,项目停止工作

时间:2014-05-19 09:53:51

标签: c++

我是c ++的新手,尝试在c ++中编写单链表,并且它有各种操作,如打印,插入到最后,插入结尾,删除等等。我正在一步一步地做。我写了第一个插入方法。它工作正常没有错误,但第一次进入插入的if条件,即列表为空并在此创建第一个节点,问题是进入第一个节点后输出屏幕正在关闭说"项目已停止工作" 。我想要做的是进入一个节点之后它应该问"你想要添加另一个节点吗?"如果用户输入" y"它应该继续,否则应该回到main函数:这是我的代码:

#include <iostream>

using namespace std;

struct node
{
  int num;
  node *next;
};

class link_list
{
  node *head;
  node *list;
public:
  link_list()
  {
    head = NULL;
    list = NULL;
    //cout << list;
  }

  // void display_options(link_list &b);
  void print_list();
  void insert();
  //void insert_at_beg();
  // void insert_at_middle();
};

void link_list::print_list()
{
  if (list == NULL)
  {
    cout << "Empty list" << endl;
    //return;
  }
  else
  {
    int count = 0;
    while (list->next != NULL)
    {
      list = list->next;
      count++;
      cout << "Node    " << "value " << endl;
      cout << count << "     " << list->num << endl;
    }
  }
}

void link_list::insert()
{
  // head = new node;
  //list = head;
  int y;
  char a;

  do
  {
    if (head == NULL)
    {
      head = new node;
      cout << "enter the first node" << endl;
      cin >> y;
      list->num = y;
      list->next = NULL;
    }
    else
    {
      node * newNode;
      list == head;
      while (list->next != NULL)
      {
        list->next = list;
      }

      newNode = new node;
      cin >> y;
      newNode->num = y;
      list->next = newNode;
      newNode->next = NULL;
    }
    cout << "do u wish to add another node?" << endl;
    cin >> a;
  } while (a == 'y' || a == 'Y');
}

int main()
{
  link_list ll;
  char choice;
  do{
    cout << "select one" << endl;
    cout << "press 1 for insert ." << endl;
    cout << "press 2 for insert at beginning ." << endl;
    cout << "press 3 for insert at the middle ." << endl;
    cout << "press 4 delete ." << endl;
    cout << "print 5 print the linked list :" << endl;
    cout << "print 6 exit :" << endl;

    int no;
    cin >> no;

    switch (no)
    {
    case 1:
      ll.insert();
      break;
    case 5:
      ll.print_list();
    case 6:
      return 0;
    default:
      cout << "oops wrong choice" << endl;
    }

    fflush(stdin);
    cout << "Do u wanna make another choice?" << endl;
    cin >> choice;
    cout << choice << endl;
  } while (choice == 'Y' || choice == 'y');
  cout << "Thanks!" << endl;
  system("pause");
  return 0;
}

2 个答案:

答案 0 :(得分:2)

您需要更仔细地考虑编译器警告,并且需要学习如何使用调试器。这段代码存在许多问题,但大多数问题都很容易通过调试找到。

link_list::insert中的这一行不是作业,而是比较。这可能会在大多数现代编译器中作为编译器警告而引发。你可能想要解决这个问题。

line == head

此循环没有任何用处:

while (list->next != NULL)
{
  list->next = list;
}

如果list以非空值开头,则所有这些代码将永远循环,重复将list->next设置为list。您可能希望操作成为另一种方式。

  list = list->next;

将为您提供列表中的最后一个元素。

仍然在同一个功能中,这已经破了:

  head = new node;
  cout << "enter the first node" << endl;
  cin >> y;
  list->num = y;
  list->next = NULL;

因为您尚未初始化list。使用head代替list可能就是您想要的。

这很愚蠢:

  newNode = new node;
  cin >> y;

因为您没有提示输入节点值。

一旦做出这些更改,代码就会出现,至少可以进行插入和打印,但我不会进一步调查。

也许这可能会更好地转移到https://codereview.stackexchange.com/

答案 1 :(得分:1)

 head = new node;
 cout << "enter the first node" << endl;
 cin >> y;
 list->num=y; //<-- problem

您正在使用list而未初始化它。你应该写

list = head;
语句list->num=y;

之前的

这将修复第一次插入的错误。但是随后插入时代码中还有其他几个问题,其他答案也指出了这一点。修改后的代码将是

void link_list::insert()
{
  int y;
  char a;

  do
  {
        if (head == NULL)
        {
          head = new node;
          cout << "enter the first node" << endl;
          cin >> y;
          head->num = y;
          head->next = NULL; // no need to list as a member at all
        }
        else
        {             
          node* list = head;
          while (list->next != NULL)
          {
            list= list->next;
          }

          list->next= new node;
          cin >> y;
          list->next->num = y;
          list->next->next = NULL;

    }
    cout << "do u wish to add another node?" << endl;
    cin >> a;
   } while (a == 'y' || a == 'Y');
}

void link_list::print_list()
{
  if (head == NULL)
  {
    cout << "Empty list" << endl;
    //return;
  }
  else
  {
    int count = 0;
    node* list=head;
    while (list->next != NULL)
    {          
      count++;
      cout << "Node    " << "value " << endl;
      cout << count << "     " << list->num << endl;
      list = list->next;
    }
  }
}