[/////////]コメント部のリストを昇順にソートするプログラムなのですが、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;
        }