0
点赞
收藏
分享

微信扫一扫

C语言实现双链表

奔跑的酆 2022-04-03 阅读 74

双链表

结构体

typedef struct DNode {				/* 定义双链表结点类型 */
	ElemType data;					/* 数据域 */
	struct DNode *prior,*next;		/* 前驱和后继指针 */
}DNode, *DLinklist;

双链表的初始化(带头结点)

/* 初始化双链表 */
bool InitDLinklist(DLinklist &L) {
	L = (DNode *)malloc(sizeof(DNode));	/* 分配一个头结点 */
	if (L == NULL) return false;		/* 内存不足,分配失败 */
	L->prior = NULL;					/* 头结点的prior永远指向NULL */
	L->next = NULL; 					/* 头结点之后暂时还没有结点 */
	return true;
}

/* 判断双链表是否为空(带头结点) */
bool Empty(DLinklist L) {
	return L->next == NULL;
}

双链表的插入

/* 在p结点之后插入s结点 */
bool InsertNextDNode(DNode *p, DNode *s) {
	if (p == NULL || s == NULL)		/* 非法参数 */ 
		return false;

	s->next = p->next;
	if (p->next != NULL) 			/* 如果p结点有后继结点 */
		p->next->prior = s;
	s->prior = p;
	p->next = s;
	return true; 
}

双链表的删除

/* 删除p结点的后继结点*/
bool DeleteNextDNode(DNode *p) {
	if (p == NULL)
		return false;
	DNode *q = p->next;
	if (q == NULL)
		return false;
	p->next = q->next;
	if (q->next != NULL)
		q->next->prior = p;
	free(q);
	return true;
}

双链表的遍历

/* 后向遍历 */
while(p != NULL) {
	/* 对节点p做相应处理,如打印 */
	p = p->next;
}

/* 前向遍历 */
while(p != NULL) {
	/* 对节点p做相应处理,如打印 */
	p = p->prior;
}

/* 前向遍历 (跳过头结点*/
while(p->prior != NULL) {
	/* 对节点p做相应处理,如打印 */
	p = p->prior;
}
举报

相关推荐

0 条评论