鱼C论坛

 找回密码
 立即注册
查看: 2231|回复: 1

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

[复制链接]
发表于 2016-9-24 22:32:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 04:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表