双向链表

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值