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)用代码定义单链表

// ********************************* < 定义单链表 > *********************************

	typedef struct LNode     // 定义单链表结点类型
	{
		int data;            // 每个结点存放一个数据元素 
		struct LNode *next;  // 指针指向下一个结点
	}LNode, *LinkList;


	// 要定义一个单链表时,只需声明一个头指针 “L”,指向单链表的第一个结点

	LNode *L;   // 声明一个指向单链表 "头节点" 的指针(强调这是一个结点!!!)

	// 或者(两种形式等价)
	LinkList L;  // 声明一个指向单链表 "头节点" 的指针(强调这是一个单链表)
	

?

???(2)创建单链表

// ********************************* < 创建单链表 > *********************************
	
	// 创建“不带头节点”的单链表!!!!!!!!!!!!!!!!!!!(操作不方便)

	LinkList L;   // 声明一个指向单链表的指针

	bool InitList(LinkList &L)
	{
		
		L = Null;  // 空表,没有任何结点

		return true;
	}

	// 初始化一个空表
	InitList(L);



	// 创建“带头节点”的单链表!!!!!!!!!!!!!!!!!!!(操作方便)

	LinkList L;   // 声明一个指向单链表的指针

	bool InitList(LinkList &L)
	{

		L = (LNode *)malloc(sizeof(LNode));  // 分配一个头节点

		if (L == NULL)   // 若内存不足,则创建失败(增加代码健壮性)
		{
			return false;
		}

		L->next = NULL;  // 头节点之后暂时还没有节点(防止脏数据)

		return true;
	}

	// 初始化一个空表
	InitList(L);

?

???(3)单链表的插入

// ********************************* < 单链表的插入 > *********************************

	// 单链表“按位序插入”(带头节点)!!!!!!!!!!!!!!!!!!!
	bool ListInsert(LinkList &L, int i, int e)     // 注意链表前的(&)引用符号!!!
	{
		if (i < 1) 
		{
			return false;
		}

		LNode *p;      // 指针 p 指向当前扫描到的结点
		int j = 0;     // 当前 p 指向的是第几个结点
		p = L;         // L指向头节点,头节点是第 0  个结点(不存数据)

		while (p != NULL && j < i - 1)    // 循环找到第 i-1 个结点
		{
			p = p->next;
			j++;
		}

		if (p == NULL)  // i 值不合法时
		{
			return false;
		}

		LNode *s = (LNode *)malloc(sizeof(LNode));

		s->data = e;
		s->next = p->next;
		p->next = s;    // 将结点 s 连到 p 之后
		return true;    // 插入成功

	}


	// 单链表“按位序插入”(不带头节点)!!!!!!!!!!!!!!!!!!!
	bool ListInsert(LinkList &L, int i, int e)     // 注意链表前的(&)引用符号!!!
	{
		if (i < 1)
		{
			return false;
		}

		if (i == 1)    // 插入第 1 个结点的操作与其他结点操作不同!!!!!!!!!!!!!!!!!!!!!!
		{
			LNode *s = (LNode *)malloc(sizeof(LNode));
			s->data = e;  // 插入数据 e
			s->next = L;
			L = s;        // 头指针指向新节点
			return true;
		}


		LNode *p;      // 指针 p 指向当前扫描到的结点
		int j = 1;     // 当前 p 指向的是第几个结点 !!!!!!!!!!!!!!!!!!!!!!!!  与带头结点的不同之处 !!!!!!!!!!!!!!!!!!!!!!
		p = L;         // L指向头节点,头节点是第 1  个结点(不存数据)

		while (p != NULL && j < i - 1)    // 循环找到第 i-1 个结点
		{
			p = p->next;
			j++;
		}

		if (p == NULL)  // i 值不合法时
		{
			return false;
		}

		LNode *s = (LNode *)malloc(sizeof(LNode));

		s->data = e;
		s->next = p->next;
		p->next = s;    // 将结点 s 连到 p 之后
		return true;

	}




	// 指定结点的后插操作 !!!!!!!!!!!!!!!!!!!
	bool InsertNextNode(LinkList *p, int e)
	{
		if (p == NULL)     // 若内存分配失败
		{
			return false;
		}
		LNode *s = (LNode *)malloc(sizeof(LNode));
		if (s == NULL)     // 若内存分配失败
		{
			return false;
		}


		s->data = e;
		s->next = p->next;
		p = s;

		return true;
	}



	// 指定结点的前插操作 !!!!!!!!!!!!!!!!!!!
	bool InsertPriorNode(LinkList *p, int e)
	{
		if (p == NULL)     // 若内存分配失败
		{
			return false;
		}
		LNode *s = (LNode *)malloc(sizeof(LNode));
		if (s == NULL)     // 若内存分配失败
		{
			return false;
		}

		// 即创建一个 结点s 来代替 结点p,结点p 作为前插结点!!!!!!
		s->next = p->next;
		p->next = s;
		s->data = p->data;  // p中元素复制给 s
		p->data = e;        // p中元素覆盖为 e

		return true;
	}

?

???(4)单链表的删除

	// ********************************* < 单链表的删除 > *********************************

	// 单链表“按位序删除”(带头节点)!!!!!!!!!!!!!!!!!!!
	bool ListDelete(LinkList &L, int i, int &e) 
	{
		if (i < 1)
		{
			return false;
		}

		LNode *p;     // 指针 p 指向当前扫描到的结点
		int j = 0;	  // 当前 p 指向的是第几个结点
		p = L;        // L 指向头节点,头节点为第0个结点(不存数据)

		while (p != NULL && j < i - 1)  // 循环找到第 i-1 个结点
		{
			p = p->next;
			j++;
		}

		if (p == NULL)   // i值不合法
		{
			return false;
		}

		if (p->next == NULL)  // 第 i-1 个结点后已无结点
		{
			return false;
		}

		LNode *q = p->next;   // 令 q 指向需要被删除结点
		e = q -> data;        // 用 e 存放返回元素的值
		p->next = q->next;    // p 指向 q 之后结点,即断开 q 结点

		free(q);     // 释放 q 结点,删除成功

		return true;
	}


	// 指定结点的删除操作 !!!!!!!!!!!!!!!!!!!
	bool DeleteNode(LNode *p) 
	{
		if (p == NULL)
		{
			return false;
		}
		
		LNode *q = p->next;        // 令 q 指向 p 的后继节点
		p->data = p->next->data;   // 和后继节点交换数据域
		p->next = q->next;         // p 指向 q 的后继节点,即断开 q

		free(q);   // 释放结点 q,即删除成功
		
		return true;
	}

?

???(5)单链表的查找及长度计算

// ********************************* < 单链表的查找 > *********************************

	// 按值查找操作 !!!!!!!!!!!!!!!!!!!
	LNode *FindElem(LinkList L, int e) 
	{
		LNode *p = L->next;  // p 指向第一个结点

		while (p != NULL && p->data != e) // 从第一个结点开始查找数据为 e 的结点
		{
			p = p->next;
		}

		return p;  // 找到后返回该结点指针,否则返回 NULL
	}

	// 求链表长度 !!!!!!!!!!!!!!!!!!!
	int GetLength(LinkList L)
	{
		LNode *p = ;  // p 指向头节点!!!!!!
		int len = 0;  // 统计表长

		while (p != NULL) // 从第一个结点开始查找数据为 e 的结点
		{
			p = p->next;
			++len;
		}

		return len;  // 找到后返回该结点指针,否则返回 NULL
	}

?

???(6)“尾插法” 建立单链表

// ********************************* < 尾插法建立单链表 > *********************************

	LinkList  List_TailInsert(LinkList &L)     // 正向建立链表
	{
		L = (LinkList)malloc(sizeof(LNode)); // 建立头节点

		LNode *s;    // s 指向待插入部分
		LNode *r = L;    // r 为表尾指针

		int x;   // 待插入元素
		scanf("%d", &x);

		while (x != 9999)    // 假定输入 9999 表示插入结束
		{
			// 在 r 之后插入元素 x
			s = (LinkList)malloc(sizeof(LNode));
			s->data = x;
			r->next = s;

			r = s;     // r 始终指向表尾

			scanf("%d", &x);
		}

		r->next = NULL;   // 尾结点指针置空

		return L;   // 返回建立好的链表的头结点
	}

?

???(7)“头插法” 建立单链表(链表逆置)

// ********************************* < 头插法建立单链表(链表逆置) > *********************************
// 将需要逆置的链表顺序遍历,用头插法插入到另一个链表中,即实现了链表逆置!!!!!!!!!!!

	LinkList  List_HeadInsert(LinkList &L)     // 正向建立链表
	{
		L = (LinkList)malloc(sizeof(LNode)); // 建立头节点
		L->next = NULL;    // 初始为空链表 !!!!!!!!很重要!!!!!!!!!

		LNode *s;    // s 指向待插入部分

		int x;   // 待插入元素
		scanf("%d", &x);

		while (x != 9999)    // 假定输入 9999 表示插入结束
		{
			// 在 r 之后插入元素 x
			s = (LinkList)malloc(sizeof(LNode));
			s->data = x;
			s->next = L->next;
			L->next = s;        // 插入新结点,L 为头指针

			scanf("%d", &x);
		}


		return L;   // 返回建立好的链表的头结点
	}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 22:03:13  更:2022-03-13 22:05:43 
 
开发: 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 13:29:25-

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