IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【第二节】线性表--链表 -> 正文阅读

[数据结构与算法]【第二节】线性表--链表

🍔链表许多结构

单链表,单循环链表,双链表,双循环链表,带头节点的单链表,不带头节点的双向链表......

1.线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)

2.一个结点包括两个域:其中存储数据元素的叫数据域,存储直接后继存储位置的域叫指针域

3.用线性链表表示线性表时,数据元素之间的逻辑关系是由结点中的指针指示的,指针为数据元素之间的逻辑关系映像,所以逻辑上相邻的两个数据元素其存储的物理位置不要求相邻

?

🍔搞清楚带头节点和不带头节点的链表的区别

大家可以参照这个文章

单链表带头结点和不带头节点的区别

🍔以下是不带头节点的单链表的基本操作

🍟定义单链表

typedef struct Dlist{
	int data;//以整形为例子
	struct Dlist *next;//指针域
}Dlist;

🍟初始化

void InitDlist(Dlist *head){
	assert(head);
	head = NULL;
}

🍟动态申请结点

//动态申请结点
Dlist *BuyNode(int x){
	Dlist* s = (Dlist *)malloc(sizeof(Dlist));
	assert(s != NULL);
	s->data = x;
	s->next = NULL;
	return s;
}

🍟打印

//打印
void DlistPrint(Dlist *head){
	assert(head);
	Dlist *p = head;
	while (p != NULL){
		printf("%d->", p->data);
		p = p->next;
	}
}

?

🍟尾插

//尾插
void PushbackDlist(Dlist **head,int x){
	//assert(head);
	Dlist *s = BuyNode(x);
	assert(s != NULL);//判断结点是否申请成功
	Dlist *p = *head;
	//如果此时链表是空的,s就是链表的第一个结点
	if (p==NULL){
		*head = s;
	}
	//链表不为空,需要遍历整个单链表去找到最后一个结点,把结点s插在后面
	else{
		while (p->next != NULL){
			p = p->next;
		}
		p->next = s;
		
	}
}

🍟头插

//头插
void PushFrontDlist(Dlist **head, int x){
	assert(*head);//避免空指针
	Dlist *s = BuyNode(x);
	assert(s != NULL);//判断结点是否申请成功
	Dlist *p = *head;
	//如果此时链表是空的,需要改变头指针
	if (*head == NULL){
		(*head) = s;
	}
	else{
		s->next = p;
		(*head) = s;

	}
}

?

🍟尾删

//单链表尾删
void PopBackDlist(Dlist **head){
	assert(*head);
	Dlist *prev = *head;
	Dlist *p = *head;
	Dlist *tail = p->next;
	if (*head == NULL){
		printf("空表");
	}//只有一个结点时,删除后要改变头指针,指向NULL
	else{
		if (p->next == NULL){
			free(*head);//free掉唯一一个结点
			*head = NULL;
		}
		else{//需要找到最后一个元素的前一个结点,才可以删除
			while (tail->next != NULL){
				prev = tail;
			}
			tail = tail->next;
		}
		free(tail);
		tail = NULL;
		prev->next = NULL;//最后一个结点的前一个结点指向空
	}

}

🍟头删

//头删
void PopTopDlist(Dlist **head){
	assert(*head);
	if (*head == NULL){
		return;
	}
	else{
		Dlist *cur= (*head)->next;//定义一个变量指向首结点的
		free(*head);
		*head = cur;//改变首结点的位置
	}
}

🍟按位置后插入

//按指定位置后插入
void InsertAfterDlist(Dlist *pos, int x){
	assert(pos);
	Dlist *s = BuyNode(x);
	assert(s);
	s->next = pos->next;
	pos->next = s;//pos指向新节点
}

🍟按位置前插入

//按指定位置前插入
void InsertBeforeDlist(Dlist *pos, int x){
	assert(pos);
	Dlist *s = BuyNode(x);
	assert(s);
	//在pos位置后面尾插,然后交换新节点和pos的data值
	s->next = pos->next;
	pos->next = s;
	int temp = pos->data;
	pos->data =s->data;
	s->data = temp;
}

🍟按位置删除后一个结点

//按指定位置后删
void EraseAfterDlist(Dlist *pos)
{
	assert(pos);
	//如果要删除的位置后面是空的,则代表没有东西删除
	if (pos->next == NULL){
		return;
	}
	//代表删除这个结点以后,pos也指向空了
	if (pos->next->next == NULL){
		pos->next = NULL;
		return;
	}
	Dlist *p = pos->next;
	pos->next = p->next;
	free(p);
	p = NULL;
}

🍟按位置删除前一个结点

//按指定位置头删
void EraseBeforeDlist(Dlist **head, Dlist* pos){
	assert(pos);
	assert(*head);
	if (*head == pos){
		return;
	}
	if ((*head)->next == pos){
		*head = pos;
		return;
	}
	Dlist *prev = *head;
	Dlist *cur = prev->next;
	while (prev->next->next != pos){
		prev = prev->next;
	}
	prev->next = pos;
	free(cur);
	pos = NULL;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 13:06:58  更:2021-12-13 13:07:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:27:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码