在一串有序的数中插入一个数并仍保持这串数的有序性,首先我们会想到数组的方法,定义一个数组,但在每次插入时都需要对这个数组进行排序,或这需要将这个数插入到应该在的位置后将他后面的数字分别往后移,还是比较麻烦的,那么如果使用链表那就比较方便了。
链表是C++中常用的数据结构之一,由一系列节点构成,每个节点包含一个数据元素和指向下一个节点的指针。
对于本题有序单循环链表的插入,首先声明一个typedef类型的LNode结构体
typedef struct LNode
{
int date;
struct LNode *next;//自引用指针
}LNode,*LinkList;
为了使输出结果更美观,写了个小菜单
cout << "1----有序插入单链表"<<endl;
cout << "2----查看单链表"<<endl;
cout << "0----退出"<<endl;
然后就是本道题高光部分了,首先为p动态分配一个空间,p作为链表的头节点,头节点为空,并使用自引用指针使它指向空指针。除此之外,再定义一个p9,作为游标指针用于后续插入,显示,销毁。
LNode *p= new LNode;//动态分配空间,p为头结点用于存放
p->next=NULL;
LNode *p9;//定义p9为游标指针
然后通过while循环进行多次输入,当输入的值为1时,则进行有序插入链表操作,
int t=0;
cout << "请输入要插入的值:";
cin >> t;
p9=p;
while (p9->next != NULL && p9->next->date < t)//使游标后移至要插入的位置之前的节点
{
p9 = p9->next;
}
LNode *p2 = new LNode;//为要插入的数分配空间
p2->date = t;//赋值
p2->next = p9->next;
p9->next = p2;//将插入的节点与前后结点连接
首先声明并输入要插入的值t,然后使游标p9指向头节点p,通过while循环使p9后移至t值应该插入的位置之前的节点,通过动态分配为t分配空间,通过p2填充该节点的数据元素,最后将将插入的节点与前后的节点链接。
当输入的值为2时,即显示链表,仍通过p9来遍历来链表,输入链表。
p9=p->next;//显示链表
for (; p9!=NULL; p9=p9->next)
{
cout << p9->date<<" ";
}
cout <<endl;
进行完所有操作后仍通过p9来销毁链表
for(p9=p; p9!=NULL; p9=p9->next)//销毁链表
{
delete p9;
}
完整代码如下
#include <iostream>
using namespace std;
typedef struct LNode
{
int date;
struct LNode *next;//自引用指针
}LNode,*LinkList;
void lnode()
{
LNode *p= new LNode;//动态分配空间,p为头结点用于存放
p->next=NULL;
LNode *p9;//定义p9为游标指针
cout << "1----有序插入单链表"<<endl;
cout << "2----查看单链表"<<endl;
cout << "0----退出"<<endl;
int n;
while (cin >> n)
{
if (n==1)
{
int t=0;
cout << "请输入要插入的值:";
cin >> t;
p9=p;
while (p9->next != NULL && p9->next->date < t)//使游标后移至要插入的位置之前的节点
{
p9 = p9->next;
}
LNode *p2 = new LNode;//为要插入的数分配空间
p2->date = t;//赋值
p2->next = p9->next;
p9->next = p2;//将插入的节点与前后结点连接
}
else if(n==2)
{
p9=p->next;//显示链表
for (; p9!=NULL; p9=p9->next)
{
cout << p9->date<<" ";
}
cout <<endl;
}
else
{
break;
}
}
for(p9=p; p9!=NULL; p9=p9->next)//销毁链表
{
delete p9;
}
}
int main()
{
cout << "*******Data Structure*******"<<endl;
lnode();
return 0;
}
收获:链表时是基础的数据结构之一,对链表的学习可以帮助我深入理解动态数据结构的原理及其实现方式,其次链表的操作涉及动态内存分配,有利于我对内存管理和指针的使用,同时,链表的操作,比如插入,查找等锻炼了我的算法设计及逻辑思维能力,其次,本次代码的书写,加强了我对结构体,指针,引用等的理解与掌握,最后,链表概念与操作还是比较抽象的,加强了我的抽象思维能力。