双向链表

在单链表的基础上,给每个物理结点增加一个指向后继结点的指针域
在这里插入图片描述
在这里插入图片描述
优点:

  • 从任一结点出发可以快速找到其前趋结点和后继结点
  • 从任一结点出发可以访问其他结点
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

posted @ 2020-07-12 00:43  LanceHansen  阅读(24)  评论(0编辑  收藏  举报