数据结构 链表 c++

线性表的链式表示和实现

单链表(带头节点):

typedef struct LNode {
	Elemtype data;
	struct LNode* next;
}LNode, *LinkList;
bool InitList(LinkList& L) {
	L = new LNode;
	if (L == NULL)return false;
	else L->next = NULL; return true;
}//创建空表
void DestroyList(LinkList& L) {
	delete L;
}//销毁
bool ListEmpty(LinkList L) {
	return(L->next == NULL);
}//判空
int ListLength(LinkList L) {
	int len = 0;
	LNode* p = L;
	while (p->next != NULL) {
		p = p->next;
		len++;
	}
	return len;
}//表长
LNode* GetElem(LinkList L,int i) {
	if (i < 0)return NULL;
	LNode* p; p = L;
	int j = 0;
	while (p != NULL && j < i) {
		p = p->next;
		j++;
	}
	return p;
}//返回L中第i个数据元素(按位查找)
LNode* LocateElem(LinkList L,int e,bool (*compare)(Elemtype,Elemtype)){
	LNode* p = L->next;
	while (p != NULL && !compare(e,p->data))p = p->next;
	return p;
}//返回表L中值为e的指针(按值查找)
bool ListInsert(LinkList &L,int i,Elemtype e) {
	if (i < 1)return false;
	LNode* p = GetElem(L, i - 1);
	if (p == NULL)return false;
	LNode* s = new LNode;
	if (s == NULL)return false;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}//在L的第i位的元素前插入元素e(带头结点)
bool InsertNextNode(LNode* p, Elemtype e) {
	if (p == NULL)return false;
	LNode* s = new LNode;
	if (s == NULL)return false;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}//在指定结点p后插入元素e
bool InsertPriorNode(LNode* p, Elemtype e) {
	if (p == NULL)return false;
	LNode* s = new LNode;
	if (s == NULL)return false;
	s->data = p->data;
	p->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}//在指定结点p前插入元素e
bool ListDelete(LinkList& L, int i, Elemtype &e) {
	if (i < 1)return false;
	LNode* p = GetElem(L, i - 1);
	if (p == NULL)return false;
	LNode* q = p->next;
	e = q->data;
	p->next = q->next;
	delete q; return true;
}//用e返回L中第i位元素并删除该元素
bool DeleteNode(LNode* p) {
	if (p == NULL)return false;
	LNode* q = p->next;
	p->data = q->data;
	p->next = q->next;
	delete q;return true;
}//删除指定结点p(p是最后一个结点此方法不可行)
bool ListTraverse(LinkList L, void (*visit)(Elemtype)) {
	LNode* p = L->next;
	if (p == NULL)return false;
	while (p != NULL){
		visit(p->data);
		p = p->next;
	} 
	return true;
}//用visit函数遍历L

双链表:

typedef struct DNode {
	Elemtype data;
	struct DNode* prior,* next;
}DNode, * DLinkList;
bool InitList(DLinkList& L) {
	L = new DNode;
	if (L == NULL)return false;
	else L->next = NULL; L->prior=NULL; return true;
}//创建空表
void DestroyList(DLinkList& L) {
	while (L->next != NULL)DeleteNextDNode(L);
	delete L;
	L = NULL;
}//销毁
bool ListEmpty(DLinkList L) {
	return(L->next == NULL);
}//判空
int ListLength(DLinkList L) {
	int len = 0;
	DNode* p = L;
	while (p->next != NULL) {
		p = p->next;
		len++;
	}
	return len;
}//表长
DNode* GetElem(DLinkList L, int i) {
	if (i < 0)return NULL;
	DNode* p; p = L;
	int j = 0;
	while (p != NULL && j < i) {
		p = p->next;
		j++;
	}
	return p;
}//返回L中第i个数据元素(按位查找)
DNode* LocateElem(DLinkList L, Elemtype e, bool (*compare)(Elemtype , Elemtype )) {
	DNode* p = L->next;
	while (p != NULL && !compare(e, p->data))p = p->next;
	return p;
}//返回表L中值为e的指针(按值查找)
bool ListInsert(DLinkList& L, int i, Elemtype e) {
	if (i < 1)return false;
	DNode* p = GetElem(L, i - 1);
	if (p == NULL)return false;
	DNode* s = new DNode;
	if (s == NULL)return false;
	s->data = e;
	s->next = p->next;
	s->prior = p;
	p->next = s;
	return true;
}//在L的第i位的元素前插入元素e(带头结点)
bool InsertNextDNode(DNode* p, DNode* s) {
	if (p == NULL || s == NULL)return false;
	s->next = p->next;
	if (p->next != NULL)
		p->next->prior = s;
	s->prior = p;
	p->next = s;
	return true;
}//在结点p后插入结点s
bool InsertPriorDNode(DNode* p, DNode* s) {
	if (p == NULL || s == NULL)return false;
	p = p->prior;
	if (InsertNextDNode(p, s))return true;
	else return false;
}//在结点p前插入结点s
bool InsertNextNode(DNode* p, Elemtype e) {
	if (p == NULL)return false;
	DNode* s = new DNode;s->data = e;
	if (InsertNextDNode(p, s))return true;
	else return false;
}//在指定结点p后插入元素e
bool InsertPriorNode(DNode* p, Elemtype e) {
	if (p == NULL)return false;
	DNode* s = new DNode;s->data = e;
	p = p->prior;
	if (InsertNextDNode(p, s))return true;
	else return false;
}//在指定结点p前插入元素e
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;
	delete q;return true;
}//删除p结点后面的一个结点
bool ListDelete(DLinkList& L, int i, Elemtype & e) {
	if (i < 1)return false;
	DNode* p = GetElem(L, i - 1);
	if (p == NULL)return false;
	DNode* q = p->next;
	e = q->data;
	p->next = q->next;
	if (q->next != NULL)q->next->prior = p;
	delete q; return true;
}//用e返回L中第i位元素并删除该元素
bool DeleteNode(DNode* p) {
	if (p == NULL)return false;
	p->prior->next = p->next;
	if (p->next != NULL)p->next->prior = p->prior;
	delete p; return true;
}//删除指定结点p
bool ListTraverse(DLinkList L, void (*visit)(Elemtype )) {
	DNode* p = L->next;
	if (p == NULL)return false;
	while (p != NULL) {
		visit(p->data);
		p = p->next;
	}
	return true;
}//用visit函数遍历L
bool ListTraverse_Next(DNode* p, void (*visit)(Elemtype )) {
	if (p == NULL)return false;
	while (p != NULL) {
		visit(p->data);
		p = p->next;
	}
	return true;
}//用visit函数后向遍历结点p
bool ListTraverse_Prior(DNode* p, void (*visit)(Elemtype )) {
	if (p == NULL)return false;
	while (p->prior != NULL) {
		visit(p->data);
		p = p->prior;
		
	}
	return true;
}//用visit函数前向遍历结点p(跳过头节点)

循环双链表:

typedef struct DNode {
	Elemtype data;
	struct DNode* prior, * next;
}DNode, * DLinkList;
bool InitList(DLinkList& L) {
	L = new DNode;
	if (L == NULL)return false;
	else L->next = L; L->prior = L; return true;
}//创建空表
bool ListEmpty(DLinkList L) {
	return(L->next == L);
}//判空
bool ListTail(DLinkList L, DNode* p) {
	return(p->next == L);
}//判断p结点是否是循环双链表L的表尾结点
int ListLength(DLinkList L) {
	int len = 0;
	DNode* p = L;
	while (!ListTail(L,p)) {
		p = p->next;
		len++;
	}
	return len;
}//表长
DNode* GetElem(DLinkList L, int i) {
	if (i < 0)return NULL;
	DNode* p; p = L;
	int j = 0;
	while (!ListTail(L, p) && j < i) {
		p = p->next;
		j++;
	}
	return p;
}//返回L中第i个数据元素(按位查找)
DNode* LocateElem(DLinkList L, int e, bool (*compare)(Elemtype , Elemtype )) {
	DNode* p = L->next;
	while (!ListTail(L, p) && !compare(e, p->data))p = p->next;
	return p;
}//返回表L中值为e的指针(按值查找)
bool ListInsert(DLinkList& L, int i, Elemtype e) {
	if (i < 1)return false;
	DNode* p = GetElem(L, i - 1);
	if (p == NULL)return false;
	DNode* s = new DNode;
	if (s == NULL)return false;
	s->data = e;
	s->next = p->next;
	s->prior = p;
	p->next = s;
	return true;
}//在L的第i位的元素前插入元素e(带头结点)
bool InsertNextDNode(DNode* p, DNode* s) {
	if (p == NULL || s == NULL)return false;
	s->next = p->next;
	s->prior = p;
	p->next->prior = s;
	p->next = s;
	return true;
}//在结点p后插入结点s
bool InsertPriorDNode(DNode* p, DNode* s) {
	if (p == NULL || s == NULL)return false;
	if (InsertNextDNode(p->prior , s))return true;
	else return false;
}//在结点p前插入结点s
bool InsertNextNode(DNode* p, Elemtype e) {
	if (p == NULL)return false;
	DNode* s = new DNode; s->data = e;
	if (InsertNextDNode(p, s))return true;
	else return false;
}//在指定结点p后插入元素e
bool InsertPriorNode(DNode* p, Elemtype e) {
	if (p == NULL)return false;
	DNode* s = new DNode; s->data = e;
	if (InsertNextDNode(p->prior, s))return true;
	else return false;
}//在指定结点p前插入元素e
bool DeleteNextDNode(DNode* p) {
	if (p == NULL)return false;
	DNode* q = p->next;
	if (q == NULL)return false;
	p->next = q->next;
	q->next->prior = p;
	delete q; return true;
}//删除p结点后面的一个结点
void DestroyList(DLinkList& L) {
	while (L->next != L)DeleteNextDNode(L);
	delete L;
	L = NULL;
}//销毁
bool ListDelete(DLinkList& L, int i, Elemtype& e) {
	if (i < 1)return false;
	DNode* p = GetElem(L, i - 1);
	if (p == NULL)return false;
	e = p->next->data;
	if (DeleteNextDNode(p)); return true;
}//用e返回L中第i位元素并删除该元素
bool DeleteNode(DNode* p) {
	if (p == NULL)return false;
	p->prior->next = p->next;
	p->next->prior = p->prior;
	delete p; return true;
}//删除指定结点p
bool ListTraverse(DLinkList L, void (*visit)(int)) {
	DNode* p = L->next;
	if (p == NULL)return false;
	while (!ListTail(L, p->prior)) {
		visit(p->data);
		p = p->next;
	}
	return true;
}//用visit函数遍历L

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值