双向链表
在单链表的基础上,给每个物理结点增加一个指向后继结点的指针域
优点:
- 从任一结点出发可以快速找到其前趋结点和后继结点
- 从任一结点出发可以访问其他结点
typedef struct Dnode{
int data;
struct Dnode *prior;
struct Dnode *next;
}dnode;
成员 | 作用 |
---|---|
data | 数据域 |
prior | 指针域,指向前趋结点 |
next | 指针域,指向后继结点 |
双链表中结点的插入
在p指向的结点之后插入s指向的结点
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
int
listInsert( dnode *l, int i, int e )
{
int j = 0;
dnode *s;
while( j < i - 1 && l != NULL ){
j++;
l = l->next;
}
if( l == NULL ){
return FALSE;
}else{
s = ( dnode* )malloc( sizeof( dnode ) );
s->data = e;
s->next = l->next;
if( l->next != NULL ){
l->next->prior = s;
}
s->prior = l;
l->next = s;
return TRUE;
}
}
双链表中删除结点
p->next->next->prior = p;
p->next = p->next->next;
int
listDelete( dnode *l, int i )
{
int j = 0;
dnode *q;
while( j < i - 1 && l != NULL ){
j++;
l = l->next;
}
if( l == NULL ){
return FALSE;
}else{
q = l->next;
if( q == NULL ){
return FALSE;
}
l->next = q->next;
if( l->next != NULL ){
l->next->prior = l;
}
free( q );
return TRUE;
}
}
建立双链表的方法
头插法
void
createList1( dnode *l, int *a, int n )
{
int i;
dnode *s;
l->prior = l->next = NULL;
for( i = 0; i < n; i++ ){
s = ( dnode* )malloc( sizeof( dnode ) );
s->data = a[i];
s->next = l->next;
if( l->next != NULL ){
l->next->prior = s;
}
l->next = s;
s->prior = l;
}
}
尾插法
void
createList2( dnode *l, int *a, int n )
{
int i;
dnode *s, *tail = l;
for( i = 0; i < n; i++ ){
s = ( dnode* )malloc( sizeof( dnode ) );
s->data = a[i];
tail->next = s;
s->prior = tail;
tail = s;
}
tail->next = NULL;
}
参考链接
https://www.icourse163.org/learn/WHU-1001539003?tid=1002049010#/learn/content