插入链表结点

创建(调用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指向处,其自身被链首指向。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君姒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值