izhanghongcun 发表于 2016-9-24 22:32:43

动态链表排序,求解释代码,加注释

#include <iostream.h>
class TestClass
{
public:
        TestClass(int data=0)
        {
                this->data = data;
                this->next = NULL;
        };
        int data;
        TestClass* next;
};
void Insert(TestClass* p,int data)
{
        TestClass* temp=new TestClass(data);
        TestClass* pParent=p;
        TestClass* pNext=p->next;
        while(pNext)
        {
                if( data > pNext->data)
                {
                        //********1********
                        pParent->next=temp;
                        temp->next = pNext;
                        return;
                }
                else
                {
                        pParent = pNext;
                        //********2********
                        pNext=pNext->next;
                }
        }
        if( pNext == NULL)
        {
                pParent->next = temp;
                return;
        }
}
void printf(TestClass* p)
{
//********3********
        while(p->next!=NULL)
        {
                cout<<p->next->data<<" ";
                p = p->next;
        }
        cout<<endl;
}
void Delete(TestClass* p)
{
//********4********
        TestClass* temp1=p->next;
        TestClass* temp2;
        while(temp1 != NULL)
        {
                temp2 = temp1->next;
                delete temp1;
                temp1 = temp2;
        }
}
void main()
{
        int i=0;
        TestClass head;
        do
        {
                int data;
                cout<<"请输入一个数字: "<<endl;
                cin>>data;
                if( data == 0) break;
                Insert(&head,data);
        }while(1);
        printf(&head);
        Delete(&head);
        return;
}

SingleLove 发表于 2016-10-3 20:28:41

这个也没什么可说的;如果看不懂这个代码表示你对链表的遍历还不够理解

本帖最后由 SingleLove 于 2016-10-3 20:40 编辑


#include <iostream>
using namespace std;

//定义一个类名为 TestClass 的类(本质上就是结构体)
class TestClass
{
public:
        TestClass(int data = 0)//构造函数:用于初始化
        {
                this->data = data;
                this->next = NULL;
        };
        int data;//数据域
        TestClass* next;//指针域
};

//插入节点
void Insert(TestClass* p, int data)//变量p保存的是头结点的地址;即指针指向头结点
{
        TestClass* temp = new TestClass(data);//创建一个新的节点;并用data来给这个节点的数据域初始化
        TestClass* pParent = p;//保存头节点
        TestClass* pNext = p->next;//保存首节点

        while (pNext)//只要有下一个节点就进行循环; 即:pNext != NULL
        {
                if (data > pNext->data)//data存储的值 > 当前节点的数据域的值
                {
                        //********1********
                        pParent->next = temp;//头节点的next指向temp
                        temp->next = pNext;
                        return;//中断函数
                }
                else//如果data <= 当前节点的数据域
                {
                        //执行完下面这两句代码就是移动一个节点的距离
                        pParent = pNext;//移动指针变量pParent指向下一个节点
                        //********2********
                        pNext = pNext->next;//移动指针变量指向pNext本身的下一个节点
                       
                }
        }


        //如果能执行到这里代表pParent指向的是尾结点; pNext指向的是NULL
        //此时新节点temp还没有跟原有链表建立关系;
        //新节点temp是要在原有链表的尾部插入;组成新的链表
        if (pNext == NULL)
        {
                pParent->next = temp;//尾节点的next指向新节点temp;
                //由于构造函数已经把temp的next初始化为NULL,这里不需要temp->next = NULL;


                return;//中断函数
        }
}

//打印
void printf(TestClass* p)//定义一个指针指向头节点;即:TestClass *p = &head
{
        //********3********
        while (p->next != NULL)//当前节点的next指向的不是 NULL
        {
                cout << p->next->data << " ";//打印当前节点的下一个节点的数据域
                p = p->next;//移动一个节点
        }
        cout << endl;
}

//释放
void Delete(TestClass* p)//定义一个指针指向头节点;即:TestClass *p = &head
{
        //********4********
        TestClass* temp1 = p->next;//定义一个辅助指针指向首节点
        TestClass* temp2;//定义一个辅助指针
        while (temp1 != NULL)//指针变量temp1指向的不是NULL则进行循环
        {
                temp2 = temp1->next;//保存当前节点的下一个节点
                delete temp1;//释放当前节点
                temp1 = temp2;//指针变量temp1指向temp2指向的节点
        }
}


//
void main()
{
        int i = 0;//定义变量i并初始化为0;貌似没看到在哪里用到
        TestClass head;//创建头结点
        do
        {
                int data;//定义变量data
                cout << "请输入一个数字: " << endl;
                cin >> data;

                if (data == 0) break;//如果输入的数字是0就跳出循环

                Insert(&head, data);//调用函数Insert;把头节点的地址和输入的数字传给这个函数的形参
        } while (1);
        printf(&head);//调用printf()函 打印链表
        Delete(&head);//调用Delete()函数销毁链表
        return;
}
页: [1]
查看完整版本: 动态链表排序,求解释代码,加注释