代码优化之基于双向链表插入的实现
来源:互联网 发布:如何利用阳台 知乎 编辑:程序博客网 时间:2024/05/22 05:14
/*
*”复杂“的双链表插入实现
*/
#include <stdlib.h>
#include <stdio.h>
typedef struct NODE
{
struct NODE *fwd;
struct NODE *bwd;
int value;
} Node;
/*
*param 1:指向第一个节点的指针; param 2:新节点的值
*function:向一个双链表中插入新节点
*/
int
dll_insert( Node **rootp, int new_value )
{
/*
*this:指向当前节点的指针
*next:指向下一个节点的指针
*newnode:指向新节点的指针
*/
Node *this;
Node *next;
Node *newnode;
/*
*通过循环遍历所有节点
*当检测出新节点值和原节点值重复时 >函数返回0
*当检测出当前节点值大于新节点值时 >跳出循环进行新节点插入操作
*/
for( this = rootp; (next = this->fwd); this = next )
{
if( next->value == new_value )
{
printf("插入的新值重复!\n");
return 0;
}
if( next->value > new_value )
break;
}
/*
*为新节点分配内存空间并赋予新值
*/
newnode = (Node *)malloc( sizeof(Node) );
if( newnode == NULL )
{
printf("分配内存出错!\n");
return -1;
}
newnode->value = new_value;
/*
*如果当前节点的下一个节点不是空节点(不是在链表的尾部进行插入)
*/
if( next != NULL)
{
//如果当前节点的上一个节点不是根节点(不是在链表的头部进行插入)
if( this != rootp)
{
newnode->fwd = next;
newnode->bwd = this;
this->fwd = newnode;
next->bwd = newnode;
}
//在链表头部插入
else
{
newnode->fwd = next;
newnode->bwd = NULL;
this->bwd = newnode;
rootp->fwd = newnode;
}
}
//在链表的尾部插入
else
{
//如果当前节点的上一个节点不是根节点(不是在链表的头部进行插入)
if( this != rootp)
{
newnode->fwd = NULL;
newnode->bwd = this;
this->fwd = newnode;
rootp->bwd = newnode;
}
//在链表头部插入(空链表进行插入)
else
{
newnode->fwd = NULL;
newnode->bwd = NULL;
rootp->fwd = newnode;
rootp->bwd = newnode;
}
}
return 1;
*”复杂“的双链表插入实现
*/
#include <stdlib.h>
#include <stdio.h>
typedef struct NODE
{
struct NODE *fwd;
struct NODE *bwd;
int value;
} Node;
/*
*param 1:指向第一个节点的指针; param 2:新节点的值
*function:向一个双链表中插入新节点
*/
int
dll_insert( Node **rootp, int new_value )
{
/*
*this:指向当前节点的指针
*next:指向下一个节点的指针
*newnode:指向新节点的指针
*/
Node *this;
Node *next;
Node *newnode;
/*
*通过循环遍历所有节点
*当检测出新节点值和原节点值重复时 >函数返回0
*当检测出当前节点值大于新节点值时 >跳出循环进行新节点插入操作
*/
for( this = rootp; (next = this->fwd); this = next )
{
if( next->value == new_value )
{
printf("插入的新值重复!\n");
return 0;
}
if( next->value > new_value )
break;
}
/*
*为新节点分配内存空间并赋予新值
*/
newnode = (Node *)malloc( sizeof(Node) );
if( newnode == NULL )
{
printf("分配内存出错!\n");
return -1;
}
newnode->value = new_value;
/*
*如果当前节点的下一个节点不是空节点(不是在链表的尾部进行插入)
*/
if( next != NULL)
{
//如果当前节点的上一个节点不是根节点(不是在链表的头部进行插入)
if( this != rootp)
{
newnode->fwd = next;
newnode->bwd = this;
this->fwd = newnode;
next->bwd = newnode;
}
//在链表头部插入
else
{
newnode->fwd = next;
newnode->bwd = NULL;
this->bwd = newnode;
rootp->fwd = newnode;
}
}
//在链表的尾部插入
else
{
//如果当前节点的上一个节点不是根节点(不是在链表的头部进行插入)
if( this != rootp)
{
newnode->fwd = NULL;
newnode->bwd = this;
this->fwd = newnode;
rootp->bwd = newnode;
}
//在链表头部插入(空链表进行插入)
else
{
newnode->fwd = NULL;
newnode->bwd = NULL;
rootp->fwd = newnode;
rootp->bwd = newnode;
}
}
return 1;
}
/*
*简化后的双链表插入实现
*/
#include <stdlib.h>
#include <stdio.h>
typedef struct NODE
{
struct NODE *fwd;
struct NODE *bwd;
int value;
} Node;
/*
*param 1:指向第一个节点的指针; param 2:新节点的值
*function:向一个双链表中插入新节点
*/
int
dll_insert( Node **rootp, int new_value )
{
Node *this;
Node *next;
Node *newnode;
for( this = rootp; (next = this->fwd); this = next )
{
if( next->value == new_value )
{
printf("插入的新值重复!\n");
return 0;
}
if( next->value > new_value )
break;
}
newnode = (Node *)malloc( sizeof(Node) );
if( newnode == NULL )
{
printf("分配内存出错!\n");
return -1;
}
newnode->value = new_value;
newnode->fwd = next;
this->fwd = newnode;
newnode->bwd = ( (this!=rootp) ? this : NULL );
( (next!=NULL) ? next : rootp )->bwd = newnode;
return 1;
}
- 代码优化之基于双向链表插入的实现
- 精简双向链表的插入代码
- 二级指针实现单链表的插入、删除及 linux内核源码双向链表之奇技
- 二级指针实现单链表的插入、删除及 linux内核源码双向链表之奇技
- 双向循环链表插入算法的C++程序实现
- 10实现有序双向循环链表的插入操作
- 有序双向链表的插入 C语言实现
- C++实现双向链表的创建,插入,修改,删除
- Linux实现插入排序的双向链表
- 如何实现双向链表的插入、删除操作
- C语言实现双向链表删除、插入、双向输出
- 双向链表实现 插入删除
- 关于双向链表之插入+删除
- 数据结构之双向链表的实现
- 简单列表的实现(基于双向链表)
- 基于java的双向链表实现方法
- 自己实现Java中基于双向链表的LinkedList
- C语言实现链表之双向链表(五)头结点前插入结点
- Android中如何提高UI的性能
- 黑马程序员_Dom的window对象的方法和属性
- tcpreplay,tcprewrite的使用
- 数据挖掘是如何解决问题的
- 微软2012暑假实习生笔试题解析
- 代码优化之基于双向链表插入的实现
- NGINX模块开发入门
- ruby常用快捷键
- linux php扩展模块安装。
- dual---数据库
- 删除所有约束、表、视图
- 猴子选大王问题的实现
- 数字图像处理
- 黑马程序员_静态代码块