鱼C论坛

 找回密码
 立即注册
查看: 2457|回复: 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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-3 20:28:41 | 显示全部楼层

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

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

  1. #include <iostream>
  2. using namespace std;

  3. //定义一个类名为 TestClass 的类(本质上就是结构体)
  4. class TestClass
  5. {
  6. public:
  7.         TestClass(int data = 0)//构造函数:用于初始化
  8.         {
  9.                 this->data = data;
  10.                 this->next = NULL;
  11.         };
  12.         int data;//数据域
  13.         TestClass* next;//指针域
  14. };

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

  21.         while (pNext)//只要有下一个节点就进行循环; 即:pNext != NULL
  22.         {
  23.                 if (data > pNext->data)//data存储的值 > 当前节点的数据域的值
  24.                 {
  25.                         //********1********
  26.                         pParent->next = temp;//头节点的next指向temp
  27.                         temp->next = pNext;
  28.                         return;//中断函数
  29.                 }
  30.                 else//如果data <= 当前节点的数据域
  31.                 {
  32.                         //执行完下面这两句代码就是移动一个节点的距离
  33.                         pParent = pNext;//移动指针变量pParent指向下一个节点
  34.                         //********2********
  35.                         pNext = pNext->next;//移动指针变量指向pNext本身的下一个节点
  36.                        
  37.                 }
  38.         }


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


  46.                 return;//中断函数
  47.         }
  48. }

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

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


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

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

  84.                 Insert(&head, data);//调用函数Insert;把头节点的地址和输入的数字传给这个函数的形参
  85.         } while (1);
  86.         printf(&head);//调用printf()函 打印链表
  87.         Delete(&head);//调用Delete()函数销毁链表
  88.         return;
  89. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-11 10:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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