关于链表插入数据的简单理解
单链表
// 单链表
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.新值可能必须既插入到链表的中间位置, 又插入到链表的结束位置(即链表为空).
★我们只需这样记忆
- 前一个数据指针的fwd指向新值( thisnode->fwd = newnode; )
- 新值的fwd指向后一个数据指针 ( newnode->fwd = nextnode; )
- 判断后一个数据指针是否为空(是否是结尾位置) ( if(nextnode != NULL) )
- 不为空: 将后一个数据指针的bwd指向新值 ( nextnode->bwd = newnode; )
- 为空: 将根节点的bwd指向新值 ( rootp->bwd = newnode; )
- 判断前一个数据指针是否为根节点(是否是初始位置) ( if(thisnode != rootp) )
- 不是: 新值的bwd指向前一个数据指针 ( newnode->bwd = thisnode; )
- 是: 新值的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
是否可以转载: 可以, 但转载务必要署名作者和声明文章地址