C/C++数据结构函数定义(3)线性表-双向链表

1.初始设置定义

typedef int ElemType; // ElemType代表元素数据类型,可自定义类型 

2.双向链表结点设置定义

typedef struct DuLNode{ // 双向链表的结点定义 
	ElemType data;
	struct DuLNode *prior, *next; // prior指向前驱结点,next指向后继结点 
}DuLNode, *DuLinkList;

3.初始化创建带头结点的双向链表

bool InitList_L(DuLinkList &L){ // 构造一个空的双向链表L 
	L = new DuLNode; // 生成新结点作为头结点,以头指针L指向头结点 
	if(!L)return false; // 生成结点失败 
	L->prior = L->next = NULL; // 头结点的两个指针域置空 
	return true;
} 

4.利用头插法创建双向链表

void CreatDuList_H(DuLinkList &L){ // 利用头插法创建双向链表 
	int n;
	DuLinkList s;
	L = new DuLNode; // 生成新结点作为头结点,以头指针L指向头结点
	L->prior = L->next = NULL; // 头结点的两个指针域置空 
	printf("请输入元素个数n:");
	scanf("%d",&n); 
	printf("请依次输入n个元素:\n");
	while(n--){
		s = new DuLNode; // 生成新结点s 
		scanf("%d",&s->data);
		if(L->next) // 若L后有结点,则修改其后面结点的前驱指针 
			L->next->prior = s;
		s->next = L->next;
		s->prior = L;
		L->next = s; // 将新结点插入头结点后 
	}
} 

5.在双向链表的第i个位置插入元素e

bool ListInsert_L(DuLinkList &L, int i, int &e){ // 在带头结点的的双向链表L中第i个位置插入e 
	int j = 0;
	DuLinkList p,s;
	p = L;
	while(p && j<i){ // 查找第i个结点,令p指向该结点 
		p = p->next;
		j++;
	}
	if(!p || j>i)return false; // 当第i位为空或不存在则插入失败 
	s = new DuLNode; // 生成新结点s 
	s->data = e; // 令新结点s数据域为e 
	p->prior->next = s;
	s->prior = p->prior;
	s->next = p;
	p->prior = s;
	return true;
}

6.在双向链表中删除第i个结点

bool ListDelete_L(DuLinkList &L, int i){ // 在带头结点的双向链表中删除第i个结点 
	DuLinkList p;
	int j = 0;
	p = L;
	while(p && j<i){ // 查找第i个结点,令p指向该结点 
		p = p->next;
		j++;
	}
	if(!p || j>i) return false; // 若第i位为空或不存在则删除失败 
	if(p->next) p->next->prior = p->prior; // 若第i位存在后继结点 
	p->prior->next = p->next;
	delete p; // 释放被删除结点 
	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘枫--odin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值