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