代码优化之基于双向链表插入的实现

来源:互联网 发布:如何利用阳台 知乎 编辑:程序博客网 时间: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 )
{
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;
}



原创粉丝点击