动态链表排序,求解释代码,加注释
#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: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]