创建(调用Create())链表时,结点按number值由小到大顺序排列。
前言
插入操作不能破坏链表关系。
插入操作包含一个插入位置查找的子过程,面临链表是空表或插入到链首的特殊情况。
具体内容
代码如下(示例):
#include<iostream>
#include<iomanip>
using namespace std;
//--------------------------------------------
struct Student
{
long number;
float score;
Student* next;//Student结构指针,指向另一个Student结点
};
//全局指针head是头指针,它在各种链表操作(插入,删除,输出)中,作为关键而又公共的数据被取用
Student* head = NULL;//链首指针初始值为空
//------------------------------------------------------------------------------------
Student* getnode()
{
//新建一个结点给head指针
//getnode如果返回NULL,表示后面再无新结点,head只能获得NULL值
//getnode如果返回 从堆中申请到的 结点地址 ,表示 已新建结点 ,循环插入链尾,直到再无新结点
int num;
float sc;
cin >> num >> sc;
if (num == 0)
return NULL;//节点无效,结束创建过程
Student* p = new Student;//创建新结点,准备插入链表
p->number = num;
p->score = sc;
p->next = 0;
return p;
}
//--------------------------------
void Create()//创建链表函数
{
if ((head = getnode()) == 0)//新建第一个结点,挂入链首
return; //返回空链表
for (Student* pEnd = head, *pS; pS = getnode(); pEnd = pS)//Student* pEnd;创建链尾结点指针,用于在尾部插入结点
pEnd->next = pS;
}
// Create()函数结束后,head指针指向 一个 由堆中申请的 各个结点链接而成的 链首
//-------------------------------------
void ShowList()
{
//取得链首指针head,输出链表每个结点
//需要定义 另一个 p指针,从 head开始,遍历链表结点。
//不能用head指针去遍历结点,防止链首地址丢失
cout << "now the item of list are:\n";
for (Student* p = head; p; p = p->next)
cout << p->number << "," << p->score << endl;;
}
//--------------------------------
void Insert(Student& stud)
{
Student* pS = new Student;//链结点统一由 堆空间结点 构成
*pS = stud; //复制成堆接点
if (!head || pS->number < head->number)
{
//链表为空或插在链首
pS->next = head;
head = pS;
return;
}
Student* pGuard = head;
for (Student* p = pGuard->next; p; pGuard = p, p = p->next)
{
//插在pGuard与p中间
if (pS->number < p->number)
{
pS->next = p;
pGuard->next = pS;
return;//不写return则无法运行该部分程序
}
}
pGuard->next = pS;//直到链尾还未插入,则插在最后
pS->next = NULL;
}
void main()
{
cout << fixed << setprecision(1);
Create();//调用Create()函数,从无到有创建一个链表
Student ps = { 32,3.7 };
Insert(ps);
ShowList();//调用ShowList()函数,输出整个链表
}
输出结果:
15 4.1
13 4.2
66 3.2
33 5.1
0 0.0
now the item of list are:
15,4.1
13,4.2
32,3.7
66,3.2
33,5.1
总结
如果链表为空,则只要将pS结点指空,而后自己被链首指针指向。
如果插入的结点恰好在链首,则只要将pS 结点指向head指向处,其自身被链首指向。