双向非循环递增链表——插入,删除,清空

 

#include  < stdio.h >
#include 
< malloc.h >
#include 
< stdlib.h >
#include 
< string .h >

typedef 
struct  node {
    
struct node *prev;
    
int value;
    
struct node *next;
}
Node,  * NodeList;

/*
 *    链表为空时,初始化
 *        非空时,插入操作
 *    返回值:
 *            0        成功
 *            -1        参数为空
 *            -2        malloc失败
 
*/

int  InsertNode(NodeList  * pNodeListHead,  int  value)
{
    Node 
*n, *p;    /*链表遍历用指针prev, next*/
    Node 
*newNode;    /*新节点指针*/
    
    
/*参数检查*/
    
if(NULL == pNodeListHead)
        
return -1;
    
    
/*为新节点分配空间*/
    newNode 
= (Node*)malloc(sizeof(Node));
    
if(NULL == newNode)
        
return -2;
    
    newNode
->value = value;    /*数据赋值*/
    
    
if(NULL == *pNodeListHead)/*空链表,初始化*/
    
{        
        newNode
->prev = NULL;
        newNode
->next = NULL;
        
*pNodeListHead = newNode;/*重新设置头指针*/
    }

    
else
    
{
        p 
= (*pNodeListHead)->prev;/*设置p,n指针*/
        n 
= *pNodeListHead;        

        
while( NULL != n )
        
{   
            
if(n->value <= value){    /*当前项<value*/
                p 
= n;    /*记录前一项*/
                n 
= n->next;   
            }

            
else
                
break;            
        }
   

        
/*设置newNode的pre和next*/
        newNode
->prev = p;
        newNode
->next = n;

        
if(NULL == p)/*插在头部*/
            
*pNodeListHead = newNode;/*重新设置头指针*/
        
else if(NULL == n)/*插在尾部*/
            p
->next = newNode;            
        
else{/*插在中部*/
            p
->next = newNode;
            n
->prev = newNode;
        }

    }

    
    
return 0;    
}


/*
 *    返回值:
 *            0        成功
 *            -1        参数为空
 
*/

int  FreeNode(NodeList  * pNodeListHead)
{
    Node 
*p, *q;

    
/*参数检查*/
    
if(NULL == pNodeListHead)
        
return -1;

    
/*空链表*/
    
if(NULL == *pNodeListHead)
        
return 0;
    
    p 
= q = *pNodeListHead;
    
while(p)
    
{
        q 
= p;
        p 
= p->next; 
        free(q);
/*释放当前节点*/        
    }


    
*pNodeListHead = NULL;

    
return 0;
}


/*
 *    返回值:
 *            0        成功
 *            -1        参数为空
 
*/

int  DeleteNode(NodeList  * pNodeListHead,  int  value)
{
    Node 
*n, *p;

    
/*参数检查*/
    
if(NULL == pNodeListHead)
        
return -1;

    
/*空链表*/
    
if(NULL == *pNodeListHead)
        
return 0;

    p 
= (*pNodeListHead)->prev;    /*设置p,n指针*/
    n 
= *pNodeListHead;    
    
    
while( NULL != n )/*链表遍历*/
    
{   
        
if(n->value != value){    /*当前表项不符合,p和n向后移动*/
            p 
= n;    
            n 
= n->next;   
        }

        
else
            
break;            
    }
   
    
    
if(NULL == p)/*第一项符合*/{
        
*pNodeListHead = n->next;    /*重新设置头指针*/
        
if(NULL != n->next)            /*符合项后面非空*/
            n
->next->prev = NULL;
        free(n);
    }

    
else if(NULL == n)/*无符合项目*/
        
return 0;            
    
else{/*中间项符合*/
        p
->next = n->next;
        
if(NULL != n->next)            /*符合项后面非空*/
            n
->next->prev = p;
        free(n);
    }


    
return 0;
}



void  main(  void  )
{
    NodeList head 
= NULL;

    InsertNode(
&head, 5);
    InsertNode(
&head, 1);
    InsertNode(
&head, 10);
    InsertNode(
&head, 8);
    InsertNode(
&head, 8);
    InsertNode(
&head, 1);
    InsertNode(
&head, 5);
    InsertNode(
&head, 10);

    DeleteNode(
&head, 8);
    DeleteNode(
&head, 1);
    DeleteNode(
&head, 5);
    DeleteNode(
&head, 10);
    DeleteNode(
&head, 6);
    DeleteNode(
&head, 1);
    DeleteNode(
&head, 10);
    DeleteNode(
&head, 8);

    FreeNode(
&head);

    DeleteNode(
&head, 8);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pony12

助力1000篇OpenDDS文

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值