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

本文介绍了一个双向链表的实现方法,包括插入、删除和释放内存等核心操作,并提供了一个简单的示例程序进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#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);
}

转载于:https://www.cnblogs.com/java201408/archive/2007/12/18/3901024.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值