双向链表的实现0

双向链表是数据结构中最常用的数据组织方式。下面介绍一些常见的操作。

1) 一般会有如下定义:

//struct definition
typedef struct __node list;

struct __node
{
	struct __node *pre;
	struct __node *next;
	void *p_data;
};

这里pre和next分别指向前一个和后一个结点, p_data指向一个任意类型的数据或者一般特定类型的数据。

2)创建一个节点:

list *create()
{
	list *lst = (list*) malloc (sizeof(list));
	if (lst == NULL)
		return NULL;

	lst->pre = NULL;
	lst->next = NULL;
	lst->p_data = NULL;

	return lst;
}

3)追加一个节点:

int add_tail(list *old, list *new)
{
	if (new == NULL)
		return -1;

	list *p;
	for (p = old; p->next != NULL; p = p->next) ;

	p->next = new;
	new->next = NULL;
	new->pre = p;

	return 0;
}

3)在特定节点后插入一个新节点:

int add_node(list *head, void *data0, void *data1)
{
	if (head == NULL)
		return -1;

	int value;
	list *p, *new;

	value = *((int *)data0);

	for (p = head; p->next != NULL; p = p->next)
	{
		if (value == *((int *)p->p_data))
		{
			new = (list *)malloc(sizeof(list));
			if (new != NULL)
			{
				new->p_data = malloc(sizeof(int));
				if (new->p_data != NULL)
				{
					*((int *)(new->p_data)) = *((int *)data1);		
				}
				else
				{
					free(new);
					return -1;
				}
		
				new->pre = p;
				new->next = p->next;
				p->next->pre = new;
				p->next = new;
			}
			else
			{
				return -1;
			}

			break;
		}
	}

	return 0;
}

这里p_data指向的数据类型为int,在data0后插入数据域为data1的节点。

4)删除一个节点:

int del_node(list *head, void *data)
{
	if (head == NULL)
		return -1;
	
	int value;
	list *p, *new;

	value = *((int *)data);
	for (p = head; p->next != NULL; p = p->next)
	{
		if (value == *((int *)p->p_data))
		{
			p->pre->next = p->next;
			p->next->pre = p->pre;
	
			free(p->p_data);
			free(p);

			break;
		}
	}

	return 0;
}

删除第一个数据域为data的节点。

以上是链表的定义及一些常用的操作,下一篇继续介绍一些操作。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值