リスト処理のコードの昇順にソートするプログラムで無限ループのバグが取れない。
[/////////]コメント部のリストを昇順にソートするプログラムなのですが、coutでデバッグすると文字が無限に出てしまうので無限ループしてると思われるのですが。どこが原因なのかわかりません。初学者のため紙に変数の動きなど書きましたがやはりループは抜けるとしか思われないため
解決に困っています。何が原因か教えてくれますでしょうか?(書き写したコードです。)
#include <iostream>
#include <string>
#include "conio.h"
using namespace std;
typedef struct list {
list *next;
list *prev;
int weight;
int height;
string name;
}st_list;
enum mood{
e_add = 1,
e_delete,
};
enum select {
e_yes = 1,
e_no,
};
int select_mood()//Add deleteを選択する関数
{
int no = 0;
do {
cout << "モード選択 [Add 1 / Delete 0 / sort 2 ]: ";
cin >> no;
if (no != 1 && no != 0 && no != 2) {
cout << "1,0,2を入力してください。\n";
}
} while (no != 1 && no != 0 && no != 2);
return no;
}
int select_try()//続けるかどうかを選択する関数
{
int no = 0;
do {
cout << "続けますか?[YES 1 / NO 0]: ";
cin >> no;
if (no != 1 && no != 0) {
cout << "1,0を入力してください。\n";
}
} while (no != 1 && no != 0);
return no;
}
void view(list *start) {/*リストを一挙に表示する関数*/
if (start != NULL)
{
while (start != NULL)
{
cout << "weight: " << start->weight << "\n";
cout << "height: " << start->height << "\n";
cout << "name: " << start->name << "\n";
start = start->next;
}
}
else {
cout << "リストがりません\n";
}
}
int main() {
st_list *data = NULL, *start = NULL, *t = NULL, *p = NULL;
st_list *end = NULL;
st_list *front = NULL;
int no;
do {
do {
cout << "モード選択 [Add 1 / Delete 0 / sort 2]: ";
cin >> no;
if (no != 1 && no != 0 && no != 2) {
cout << "1,0を入力してください。\n";
}
} while (no != 1 && no != 0 && no != 2);
/*追加する*/
if (no == 1)
{
data = new list;
cout << "体重:";
cin >> data->weight;
cout << "身長:";
cin >> data->height;
cout << "名前:";
cin >> data->name;
data->next = NULL;
data->prev = NULL;
if (start == NULL) {
data->prev = NULL;
start = data;
p = data;
}
else {
data->prev = p;
p->next = data;
p = data;
}
end = p;
}
/*削除する*/
if (no == 0)
{
if (start == NULL)
{
cout << "データがありません。\n";
}
else {
p = NULL;
view(start);
cout << "削除するリストの名前を入力してください:";
string name;
cin >> name;
data = start;
do {
if (strcmp(name.c_str(), data->name.c_str()) == 0)
{
if (p == NULL)
{
cout << "<debug 先頭の時>\n";
start = data->next;
if (start != NULL)
{
cout << "<リストが一個で前と次がNULLの時>\n";
start->prev = NULL;
}
cout << "選択したデータを削除しました。\n";
delete data;
}
else {
cout << "<debug 二回目以降>\n";
if (data->next != NULL)
{
t = data->next;
p->next = t;
t->prev = p;
cout << "選択したリストを削除しました\n";
delete data;
}
else
{
p->next = NULL;
end = p;
cout << "選択してリストを削除しました\n";
delete data;
}
}
break;
}
else
{
p = data;
data = data->next;
}
if (data == NULL) /*一致するデータがないとき*/
{
cout << "一致するリスト名がありません。" << "[ " << name << " ]\n";
}
} while (data != NULL);
p = start;
if (p != NULL) {
while (p->next != NULL)
{
p = p->next;
}
}
end = p;
}
}
///////////////////////////////////////////////////////////////////////
if (no == 2)//昇順にソートして表示(上から1,2,3)
{
if (p == NULL || start == NULL) {
cout << "リストがありません.\n";
}
cout << "ソート部\n";
list *t,*n;
list *pprev, *nnext;
p = start;
do{
//cout << "aaa\n";
n = p->next;
if (p->height > n->height)
{
pprev = p->prev;
nnext = p->next;
if (pprev != NULL)
{
pprev->next = n;
}
n->prev = pprev;
n->next = p;
if (nnext != NULL) {
n->next = p;
}
else {
//nnext->prev = p;
}
p->next = nnext;
p->prev = n;
//if (n->prev == NULL) { start = n; }
if (!n->prev) { start = n; }
if (!p->next) { end = p; }
//if (p->next == NULL) { end = p; }
if (n->prev) { p = n->prev; }
else { p = n; }
}
else {
p = p->next;
}
//p = p->next;
} while (p != NULL);
}
///////////////////////////////////////////////////////////////////
view(start);
} while (select_try() == 1);
cout << "終了します。\n";
_getch();
return 0;
}