数据结构学习笔记5

双链表

双链表不可随机存取,按位查找、按值查找操作都只能用遍历的方式实现。时间复杂度 O(n)

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
//双链表
typedef struct DNode {				//定义双链表结点类型
	int 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) {
	if(L->next==NULL)
		return true;
	else
		return false;
}
**********************************
//双链表的插入
//在p结点之后插入s结点
bool InsertNextDNode(DNode *p,DNode *s) {
	s->next=p->next;				//将结点*s插入到结点*p之后
	p->next->prior=s;
	s->prior=p;
	p->next=s;
}

//在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;				//找到p的后继结点q
	if(q==NULL)
		return false;					//p没有后继
	p->next=q->next;
	if(q->next!=NULL)				//q结点不是最后一个结点
		q->next->prior=p;
	free(q);						//释放结点空间
	return true;
}

void DestoryList(DLinkList &L) {
	//循环释放各个数据结点
	while(L->next!=NULL)
		DeleteNextDNode(L);
	free(L);						//释放头结点
	L=NULL;							//头指针指向NULL
}

//双链表的遍历

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


void testDLinkList() {
	//初始化链表
	DLinkList L;
	InitDLinkList(L);
	//后续代码...
}

int main() {
	testDLinkList;
}

今日总结

今日课程比较多,而且家里有客人,学习计划执行的并不是太彻底,并且学习开始存在一些浮躁,今晚上选择了看一场电影完美解决急躁心理,希望沉下起来继续学习,而且明日要补回今日所缺!

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页