关于链表插入数据的简单理解

关于链表插入数据的简单理解

单链表
// 单链表
typedef struct NODE{
	struct NODE *link;
	int value;
}Node;
// 从单链表插入数据
void insert(register Node **linkp, int value){
	register Node *newnode;
	register Node *cur;

	// 找到插入位置, 判断大小排序
	while( (cur = *linkp) != NULL && cur->value < value){
		linkp = &cur->link;
	}

	// 构造新值
	newnode = new Node();
	if(newnode == NULL){
		cout << "memory error!" << endl;
		return;
	}
	newnode->value = value;

	// 插入值
	newnode->link = cur;
	*linkp = newnode;
	return;
}
重点:

**linkp:
函数传入的是链表指针的地址, 以便于获取数据指针(cur)指向的下一条数据指针成员(link成员)的地址.
&cur->link:
这里并不是指指向下一条数据的地址, 应该是取数据指针(cur)的link成员的地址.
*linkp = newnode:
这里*linkp是把原先取的数据指针(cur)的link成员地址进行间接访问(*), 也可以称作"解引", 解引后, 这个值就是数据指针(cur)指向的下一条数据指针的地址了(注意这里不是指向成员地址而是指向数据地址), 然后将新值赋值给他, 相当于使cur的link数据指针指向新值(newnode).

多链表
// 多链表
typedef struct NODELL{
	struct NODELL *fwd;	//前面数据指针
	struct NODELL *bwd;	//后面数据指针
	int value;
}Nodell;
// 从多链表插入数据
void llinsert(register Nodell *rootp, int value){

	register Nodell *thisnode;
	register Nodell *nextnode;
	register Nodell *newnode;

	// 找到插入位置, 判断重复值不插入
	for( thisnode = rootp; (nextnode = thisnode->fwd) != NULL; thisnode = nextnode){
		if(nextnode->value == value){
			return;
		}
		if(nextnode->value < value){
			break;
		}
	}

	// 构造新值
	newnode = new Nodell();
	if(newnode == NULL){
		cout << "memory error!" << endl;
		return;
	}
	newnode->value = value;

	// 插入新值
	thisnode->fwd = newnode;
	newnode->fwd = nextnode;
	if(nextnode != NULL){
		nextnode->bwd = newnode;
	}else{
		rootp->bwd = newnode;
	}
	if(thisnode != rootp){
		newnode->bwd = thisnode;
	}else{
		newnode->bwd = NULL;
	}

	return;
}
重点:

这里的难点就是插入新值的判断, 一共需要满足以下可能存在条件:

1.新值可能必须插入到链表的中间位置.
2.新值可能必须插入到链表的起始位置.
3.新值可能必须插入到链表的结束位置.
4.新值可能必须既插入到链表的中间位置, 又插入到链表的结束位置(即链表为空).

★我们只需这样记忆

  1. 前一个数据指针的fwd指向新值( thisnode->fwd = newnode; )
  2. 新值的fwd指向后一个数据指针 ( newnode->fwd = nextnode; )
  3. 判断后一个数据指针是否为空(是否是结尾位置) ( if(nextnode != NULL) )
    1. 不为空: 将后一个数据指针的bwd指向新值 ( nextnode->bwd = newnode; )
    2. 为空: 将根节点的bwd指向新值 ( rootp->bwd = newnode; )
  4. 判断前一个数据指针是否为根节点(是否是初始位置) ( if(thisnode != rootp) )
    1. 不是: 新值的bwd指向前一个数据指针 ( newnode->bwd = thisnode; )
    2. 是: 新值的bwd指向空 ( newnode->bwd = NULL; )
构造调用示例
// 单链表
	Node *root = new Node();
	insert(&root, 10);		//测试值
	cout << root->link->value << endl;

	cout << endl;

	// 多链表
	Nodell *rootp = new Nodell();
	llinsert(rootp, 10);	//测试值
	cout << rootp->fwd->value << endl << rootp->bwd->value << endl;
作者声明

感谢阅读! 希望我的文章对您有帮助!
作者: tofu
QQ: 2890851110
是否可以转载: 可以, 但转载务必要署名作者和声明文章地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值