单向链表:每个链表节点都有一个next指针,通过名字知道,next存放的是下一个节点的位置,从而串起来的数据结构。
双向链表:每个链表节点除了next指针外还有prev指针。哪个节点next指针指向我,我的prev就指向那个节点。
typedef int ElementType;
typedef struct _NODE
{
struct NODE * next;
struct NODE * prev;
ElementType e;
} NODE;
typedef struct _LIST
{
NODE * head;/*记录链表头*/
unsigned int count;/*记录链表元素个数*/
} LIST;
#define __prev /*用于提示在前面操作*/
双向链表在确定节点前面插入是不用遍历链表的。
我写一个函数,在一个指定节点前插入一个节点的,其他的就类似了:
NODE * InsertToList( __ prev NODE * node, ElemType elem)
{
if (! list || ! node)
return NULL;
NODE * p = (NODE *)malloc(sizeof(NODE));
if (! p)
return NULL;
p ->e = elem;
p ->prev = node ->prev;/*让两个指针指向同一个地方*/
node ->prev ->next = p;/*断开连接*/
node ->prev = p;/*断开连接*/
p ->next = node;/*完成连接*/
return p;
}