#include <stdio.h>
#include <stdlib.h>
struct data
{
int link_value;
};
struct link_node
{
struct link_node *p_pre_link;
struct link_node *p_next_link;
struct data value;
};
struct link_node *create_node(struct data node_value)
{
struct link_node *p_node = NULL;
p_node = (struct link_node *)malloc(sizeof(struct link_node));
if(NULL == p_node)
{
return NULL;
}
p_node->p_next_link = p_node->p_pre_link = NULL;
p_node->value = node_value;
return p_node;
}
struct link_node *add_node_by_inc_order(struct link_node *p_head, struct link_node *p_add_node)
{
struct link_node *p_link = NULL;
struct link_node *p_link_pri = NULL;
if(NULL == p_add_node)
{
return NULL;
}
p_link = p_head;
if(NULL == p_link)
{
p_link = p_add_node;
p_link->p_next_link = NULL;
p_head = p_link;
return p_head;
}
while(p_link != NULL)
{
if(p_link->value.link_value >= p_add_node->value.link_value)
{
break;
}
else
{
p_link_pri = p_link;
p_link = p_link->p_next_link;
}
}
if(NULL == p_link)
{
p_link = p_link_pri;
p_link->p_next_link = p_add_node;
p_add_node->p_pre_link = p_link;
}
else if(p_link == p_head)
{
p_link = p_link->p_pre_link;
p_link->p_pre_link = p_add_node;
p_add_node->p_next_link = p_link;
p_head = p_add_node;
}
else
{
p_link = p_link->p_pre_link;
p_add_node->p_next_link = p_link->p_next_link;
p_link->p_next_link->p_pre_link = p_add_node;
p_link->p_next_link = p_add_node;
p_add_node->p_pre_link = p_link;
}
return p_head;
}
struct link_node *del_node(struct link_node *p_head, struct data value)
{
struct link_node *p_link = NULL;
struct link_node *p_tmp_link = NULL;
p_link = p_head;
while(p_link != NULL)
{
if(p_link->value.link_value == value.link_value)
{
break;
}
else
{
p_link = p_link->p_next_link;
}
}
if(NULL == p_link)
{
return p_head;
}
else if(p_link == p_head)
{
p_tmp_link = p_link->p_next_link;
free(p_link);
p_link = p_tmp_link;
p_head = p_link;
}
else if(NULL == p_link->p_next_link)
{
p_link->p_pre_link->p_next_link = p_link->p_next_link;
free(p_link);
}
else
{
p_link->p_pre_link->p_next_link = p_link->p_next_link;
p_link->p_next_link->p_pre_link = p_link->p_pre_link;
free(p_link);
}
return p_head;
}
int main(void)
{
int value[] = {0,2,4,5,6,5,4,3,2,1};
int value_num = 0, i = 0;
struct data add_node;
struct link_node *p_link = NULL;
struct link_node *p_head = NULL;
struct link_node *p_tmp = NULL;
struct link_node *p_new_node = NULL;
value_num = sizeof(value) / sizeof(int);
for(i = 0; i < value_num; i++)
{
add_node.link_value = value[i];
p_new_node = create_node(add_node);
p_link = add_node_by_inc_order(p_link, p_new_node);
}
p_head = p_link;
while(p_link != NULL)
{
printf("%d\n", p_link->value.link_value);
p_link = p_link->p_next_link;
}
add_node.link_value = 6;
p_head = del_node(p_head, add_node);
p_link = p_head;
printf("\n");
while(p_link != NULL)
{
printf("%d\n", p_link->value.link_value);
p_link = p_link->p_next_link;
}
while(p_link != NULL)
{
p_tmp = p_link->p_next_link;
free(p_link);
p_link = p_tmp;
}
return 0;
}