线性表--双向链表学习笔记(3)

线性表

定义参考线性表(1)

双向链表

为克服单链表这种单向性的缺点,可利用双向链表(Double Linked List).
双向链表:有两个指针域,一个指向直接后继,另一个指向直接前驱。
存储结构

typedef struct DuLNode
{
	ElemType data;
	struct DuLNode *prior;
	struct DuLNode *next;
}DuLNode, *DuLinkList;

算法描述

  1. 插入
Status ListInsert_DuL(DuLinkList &L, int i, ElemType e)
{
	if(!(p = GetElemP_DuL(L, i)))
		return ERROR;
	if(!(s = (DuLinkList)malloc(sizeof(DuLNode)))) return ERROR;
	s->data = e;
	s->prior = p->prior; p->prior->next = s;
	s->next = p; p->prior = s;
	return OK;
}
  1. 删除
Status ListDelete_DuL(DuLinkList &L, int i)
{
	if(!(p = GetElemP_DuL(L, i)))
		return ERROR;
	e = p->data;
	p->prior->next = p->next;
	p->next->prior = p->prior;
	free(p);
	return OK;
}


由于链表在空间的合理利用上和插入、删除不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构。然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点;另一方面,由于在链表中,结点之间的关系用指针来表示,则数据元素在线性表中的“位序”的概念已淡化,而被数据元素在线性链表中的“位置”所代替。为此,从实际应用角度出发重新定义线性表及其基本操作

typedef struct LNode {
	ElemType data;
	struct LNode *next;
}*Link, *Position;

typedef struct {
	Link head, tail;
	int len;
}

Status ListInsert_L(LinkList &L, int i, ElemType e) {
	if(!LocatePos(L, i-1, h)) return ERROR;
	if(!MakeNode(s, e)) return ERROR;
	InsFirst(h, s);
	return OK;
}

Status MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc, int (*compare)(ElemType, ElemType)) {
	// 已知单链线性表La和Lb的元素
	if(!InitList(Lc)) return ERROR;
	ha = GetHead(La); hb = GetHead(Lb);
	pa = NextPos(La, ha); pb = NextPos(Lb, hb);
	while(pa && pb) {
		a = GetCurElem(pa); b = GetCurElem(pb);
		if((*compare)(a, b) <= 0) {
			DelFirst(ha, q);  Append(Lc, q); pa = NextPos(La, ha);
		else 
			DelFirst(hb, q); Append(Lc, q); pb = NextPos(Lb, hb);
	}
	if(pa) Append(Lc, pa);
	else Append(Lc, pb);
	FreeNode(ha); FreeNode(hb);
	return OK;	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值