双向链表是数据结构中最常用的数据组织方式。下面介绍一些常见的操作。
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的节点。
以上是链表的定义及一些常用的操作,下一篇继续介绍一些操作。