#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