C 语言实例10——双链表插入

/*双链表的插入
** 把一个值插入到双链表,rootp是一个指向根节点的指针
** value 是欲插入的新值
** 返回值:如果欲插入的值已存在链表中,函数返回0;
** 如果内存不足导致无法插入,函数返回-1;,如果插入成功,函数返回1;
*/

int dll_insert(Node *rootp,int value)
{
    Node *thist;
	Node *next;
	Node *newnode;
	/*查看value是否存在链表中,有就返回,
	** 否则为新值创建一个新的节点
	**  thist 指向新节点之前那个节点
	**  next  指向新节点之后那个节点
	*/
	for(thist = rootp;(next = thist->fwd) != NULL;thist = next)
	{
		if (next->value == value)
			return 0;
		if (next->value > value)
			break;
	}
	newnode = (Node *)malloc(sizeof(Node));
	if(newnode == NULL)
		return -1;
	newnode->value = value;

	/*
	** 把新值添加到链表中
	*/

/*
**最初版,分析了四种不同情况。
*/
/*
	if(next != NULL)
	{
	       // 情况1或者2:并非位于链表尾部
		   if(thist!=rootp)         //情况1:并非位于链表的起始位置
		   {
			   newnode->fwd = next;
			   thist->fwd = newnode;
			   newnode->bwd = thist;
			   next->bwd = newnode;
		   }
		   else                     //情况2:位于链表的起始位置
		   {
			   newnode->fwd = next;
			   rootp->fwd = newnode;
			   newnode->bwd = NULL;
			   next->bwd = newnode;
		   }
	}
	else    //情况3或者4:位于链表尾部
	{
	     if(thist != rootp)   //情况3:并非位于链表的起始位置
		 {
			 newnode->fwd = NULL;
			 thist->fwd = newnode;
			 newnode->bwd = thist;
			 rootp->bwd = newnode;
		 }
		 else                 //情况4:位于链表的起始位置
		 {
			 newnode->fwd = NULL;
			 rootp->fwd = newnode;
			 newnode->bwd = NULL;
			 rootp->bwd = newnode;
		 }
	}
*/

/*
**简化版,对比上面可读性不强,运行速度并不比前面的快。
*/
	 newnode->fwd = next;
     thist->fwd = newnode;
	if(thist!=rootp)         
	    newnode->bwd = thist;
	else                     
		newnode->bwd = NULL;	
	if(next != NULL)    
	    next->bwd = newnode;
	else   
	    rootp->bwd = newnode;

  return 1;  
}

猜你喜欢

转载自blog.csdn.net/qq_27762895/article/details/83243667