[数据结构]—带头双向循环链表——超详解

💓作者简介🎉:在校大二迷茫大学生

💖个人主页🎉:小李很执着

💗系列专栏🎉:数据结构

每日分享✨:旅行是为了迷路,迷路是为了遇上美好❣️❣️❣️

目录

💓1.总体布局

 💓2.详细解读

❣️1.创建双向链表节点

❣️2.初始化双向循环链表

❣️3.打印双向循环链表

❣️4.循环双向链表尾插

❣️5.双向循环链表中删除尾节点

❣️6.双向链表的头插操作

❣️7.双向链表的头部删除操作

❣️8.循环链表中查找指定值节点

❣️9.该函双向链表中指定节点pos的前面插入一个新的节点

❣️10.双向链表中删除某个节

❣️11.销毁一个循环双向链表

💓3.部分代码进阶

❣️1.根据2—9:void LTInsert(LTNode* pos, LTDataType x)

❣️2.根据2—10void LTErase(LTNode* pos)

💓4.整体代码

❣️1.List.h

❣️2.List.c

❣️3.Test.c


💓1.总体布局

1.创建双向链表节点

LTNode* CreateLTNode(LTDataType x);

2.初始化双向循环链表

LTNode* LTInit();

3.打印双向循环链表
void LTPrint(LTNode* phead);

4.循环双向链表尾插
void LTPushBack(LTNode* phead, LTDataType x);

5.双向循环链表中删除尾节点
void LTPopBack(LTNode* phead);

6.双向链表的头插操作

void LTPushFront(LTNode* phead, LTDataType x);

7.双向链表的头部删除操作
void LTPopFront(LTNode* phead);

8.循环链表中查找指定值节点

LTNode* LTFind(LTNode* phead, LTDataType x);

9.该函双向链表中指定节点pos的前面插入一个新的节点
void LTInsert(LTNode* pos, LTDataType x);

10.双向链表中删除某个节
void LTErase(LTNode* pos);

11.销毁一个循环双向链表

void LTDestroy(LTNode * phead); 

 💓2.详细解读

❣️1.创建双向链表节点

函数输入参数为节点的值x,函数返回一个指向节点的指针。

函数内部实现:

  1. 使用malloc函数为新节点分配内存空间,分配的大小为一个LTNode结构体的大小。

  2. 判断内存分配是否成功,如果分配失败,则输出错误信息并退出程序。

  3. 对新节点进行初始化,将节点的值设置为x,next指针和prev指针设置为NULL。

  4. 返回指向新节点的指针。

LTNode* CreateLTNode(LTDataType x)
{LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->val = x;newnode->next = NULL;newnode->prev = NULL;return newnode;
}

❣️2.初始化双向循环链表

链表中的每个节点都是LTNode类型的结构体,其中包含一个指向前一个节点的指针prev和一个指向后一个节点的指针next。该函数首先创建一个值为-1的头节点,并将头节点的前一个节点和后一个节点都指向头节点本身,以形成一个空的双向循环链表。最后返回头节点的指针。

LTNode* LTInit()
{LTNode* phead = CreateLTNode(-1);phead->next = phead;phead->prev = phead;return phead;
}

❣️3.打印双向循环链表

其参数为双向循环链表的头结点指针,函数内部会从头结点开始遍历链表,并依次打印每个节点的值,直到遍历到头结点为止。最终输出的内容是形如“哨兵位<=>x<=>y<=>z<=>哨兵位”的字符串,其中x、y、z分别表示链表中的元素值。

void LTPrint(LTNode* phead)
{assert(phead);printf("哨兵位<=>");LTNode* cur = phead->next;while (cur != phead){printf("%d<=>", cur->val);cur = cur->next;}printf("\n");
}

❣️4.循环双向链表尾插

将一个元素x插入到链表的最后一个节点的后面。

函数接收两个参数,一个是指向链表头结点的指针phead,另一个是要插入到链表尾部的元素x。

首先使用assert函数检查参数phead是否为NULL,如果是则直接终止程序。

接着定义两个指针tail和newnode,tail指向链表的最后一个节点,newnode是要插入到链表尾部的新节点。

然后将新节点插入到链表尾部。具体步骤如下:

  1. 让tail节点的next指针指向newnode节点,即tail->next = newnode。

  2. 让newnode节点的prev指针指向tail节点,即newnode->prev = tail。

  3. 让newnode节点的next指针指向链表头节点phead,即newnode->next = phead。

  4. 让phead节点的prev指针指向newnode节点,即phead->prev = newnode。

这样就完成了在链表尾部插入新节点的操作。

void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* tail = phead->prev;LTNode* newnode = CreateLTNode(x);// phead               tail  newnodetail->next = newnode;newnode->prev = tail;newnode->next = phead;phead->prev = newnode;
}

❣️5.双向循环链表中删除尾节点

具体分析如下:

  1. 首先使用assert函数来判断phead是否为空,如果为空则程序立即终止。

  2. 由于是双向循环链表,在删除尾节点之前需要判断链表中是否存在节点。使用assert函数来判断phead的next指针是否指向phead本身,如果是则链表为空,程序立即终止。

  3. 设置指针tail指向链表的尾节点,并使用tailPrev指针来记录尾节点的前一个节点。

  4. 释放tail指向的节点,即删除尾节点。

  5. 将tailPrev节点的next指针指向phead节点,即将链表尾节点删除后,将尾节点的前一个节点的next指针指向头节点。

  6. 将phead节点的prev指针指向tailPrev节点,即将链表尾节点删除后,将头节点的prev指针指向链表的倒数第二个节点,以保证链表仍然是双向循环的。

注意,该函数的前提条件是链表中至少存在一个节点,否则会因为assert函数判断失败而终止程序。在使用该函数时需要注意链表的状态。

void LTPopBack(LTNode* phead)
{assert(phead);// 空assert(phead->next != phead);LTNode* tail = phead->prev;LTNode* tailPrev = tail->prev;free(tail);tailPrev->next = phead;phead->prev = tailPrev;}

❣️6.双向链表的头插操作

将一个新节点插入到链表的第一个位置。

输入参数:

  • phead:头结点指针,其中包含链表的头指针和尾指针;
  • x:要插入的节点的值。

函数流程:

  1. 创建新节点,其数据域为x;
  2. 获取原链表中第一个节点的指针first;
  3. 将新节点插入到头结点之后的位置,使得新节点为原链表的第一个节点,first成为新节点的后继节点;
  4. 将原第一个节点的prev指针指向新节点,完成头插操作。

注意事项:

  • 函数中使用了assert宏,用于判断头结点是否存在;
  • 操作需要改变多个节点的指针,需要仔细考虑顺序和细节。
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = CreateLTNode(x);LTNode* first = phead->next;phead->next = newnode;newnode->prev = phead;newnode->next = first;first->prev = newnode;}

❣️7.双向链表的头部删除操作

1. 首先使用assert函数判断传入的链表头结点指针phead是否为空,如果为空则终止程序运行。

2. 再通过assert函数判断链表是否为空,即头结点的下一个结点是否还是头结点自身,如果是则说明链表为空,同样终止程序运行。

3. 取出链表头结点的下一个结点first,以及第二个结点second。

4. 将头结点的下一个结点指向第二个结点,同时将第二个结点的前一个结点指向头结点,完成删除操作。

5. 最后使用free函数释放被删除的结点first的内存空间,并将first指针置为空。

void LTPopFront(LTNode* phead)
{assert(phead);// 空assert(phead->next != phead);LTNode* first = phead->next;LTNode* second = first->next;phead->next = second;second->prev = phead;free(first);first = NULL;}

❣️8.循环链表中查找指定值节点

参数说明:

  • phead:指向循环链表头节点的指针。
  • x:需要查找的值。

函数实现步骤:

  1. 首先,断言链表头节点不为空。
  2. 定义一个指针 cur,指向链表的第一个节点。
  3. 遍历链表,如果找到了值为 x 的节点,直接返回该节点指针。
  4. 如果遍历完整个链表都没有找到值为 x 的节点,就返回 NULL 指针,表示没有找到。

需要注意的是,该函数是针对循环链表的查找实现,因此需要判断 cur 指针是否回到了头节点 phead,如果回到了头节点,则表示遍历完整个链表,需要退出循环。

LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->val == x){return cur;}cur = cur->next;}return NULL;
}

❣️9.该函双向链表中指定节点pos的前面插入一个新的节点

节点的值为x。函数实现需要注意以下几点:

  1. 首先需要判断pos节点是否存在,若不存在则直接返回。

  2. 创建一个新节点newnode,并将其值赋为x。

  3. 获取pos节点的前一个节点posPrev,posPrev节点和newnode节点之间需要插入新的节点。

  4. 将posPrev节点的next指针指向newnode节点,将newnode节点的prev指针指向posPrev节点,将newnode节点的next指针指向pos节点,将pos节点的prev指针指向newnode节点。

  5. 确保插入操作顺利完成后,函数返回。

// 在pos前面的插入
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* posPrev = pos->prev;LTNode* newnode = CreateLTNode(x);// posprev newnode posposPrev->next = newnode;newnode->prev = posPrev;newnode->next = pos;pos->prev = newnode;
}

❣️10.双向链表中删除某个节

输入参数是要删除的节点指针pos。

首先通过断言语句assert(pos)来检查输入参数是否为空。

然后通过pos指针找到它的前驱节点posPrev和后继节点posNext,将它们之间的连接断开,即将posPrev的next指针指向posNext,将posNext的prev指针指向posPrev。

最后通过free函数释放pos指向的内存空间,完成删除操作。

// 删除pos位置
void LTErase(LTNode* pos)
{assert(pos);LTNode* posNext = pos->next;LTNode* posPrev = pos->prev;posPrev->next = posNext;posNext->prev = posPrev;free(pos);}

❣️11.销毁一个循环双向链表

参数phead是链表的头指针,其指向一个LTNode类型的结构体,该结构体中有两个指针,分别指向链表的头节点和尾节点。

首先,函数中使用了断言assert(phead),判断参数phead是否为空指针,如果是,程序会终止运行,有助于在调用函数时发现错误。

然后,定义一个指针cur指向链表第一个节点,然后使用while循环遍历除了头节点之外的所有节点,直到遍历完所有节点为止。

在循环中,使用一个指针next指向当前节点的下一个节点,然后释放当前节点的内存空间,最后将cur指向下一个节点。

循环结束后,释放链表头节点的内存空间,销毁整个链表。

void LTDestroy(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){LTNode* next = cur->next;free(cur);cur = next;}free(phead);
}

💓3.部分代码进阶

❣️1.根据2—9:void LTInsert(LTNode* pos, LTDataType x)

 1.循环双向链表尾插操作

void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTInsert(phead, x);
}

2. 双向链表的头插操作

void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTInsert(phead->next, x);
}

❣️2.根据2—10void LTErase(LTNode* pos)

1.双向循环链表中删除尾节点

void LTPopBack(LTNode* phead)
{assert(phead);LTErase(phead->prev);
}

2. 双向链表的头部删除操作

void LTPopFront(LTNode* phead)
{assert(phead);// 空assert(phead->next != phead);LTErase(phead->next);
}

💓4.整体代码

❣️1.List.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int LTDataType;typedef struct ListNode
{struct ListNode* next;struct ListNode* prev;LTDataType val;
}LTNode;LTNode* CreateLTNode(LTDataType x);
LTNode* LTInit();
void LTPrint(LTNode* phead);
void LTPushBack(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);void LTPushFront(LTNode* phead, LTDataType x);
void LTPopFront(LTNode* phead);LTNode* LTFind(LTNode* phead, LTDataType x);void LTInsert(LTNode* pos, LTDataType x);void LTErase(LTNode* pos);void LTDestroy(LTNode * phead); 

❣️2.List.c

#include"List.h"LTNode* CreateLTNode(LTDataType x)
{LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->val = x;newnode->next = NULL;newnode->prev = NULL;return newnode;
}LTNode* LTInit()
{LTNode* phead = CreateLTNode(-1);phead->next = phead;phead->prev = phead;return phead;
}void LTPrint(LTNode* phead)
{assert(phead);printf("哨兵位<=>");LTNode* cur = phead->next;while (cur != phead){printf("%d<=>", cur->val);cur = cur->next;}printf("\n");
}void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);//LTNode* tail = phead->prev;//LTNode* newnode = CreateLTNode(x);phead               tail  newnode//tail->next = newnode;//newnode->prev = tail;//newnode->next = phead;//phead->prev = newnode;LTInsert(phead, x);
}void LTPopBack(LTNode* phead)
{assert(phead);// 空assert(phead->next != phead);/*LTNode* tail = phead->prev;LTNode* tailPrev = tail->prev;free(tail);tailPrev->next = phead;phead->prev = tailPrev;*/LTErase(phead->prev);
}//void LTPushFront(LTNode* phead, LTDataType x)
//{
//	assert(phead);
//	LTNode* newnode = CreateLTNode(x);
//
//	newnode->next = phead->next;
//	phead->next->prev = newnode;
//
//	phead->next = newnode;
//	newnode->prev = phead;
//
//}void LTPushFront(LTNode* phead, LTDataType x)
{/*assert(phead);LTNode* newnode = CreateLTNode(x);LTNode* first = phead->next;phead->next = newnode;newnode->prev = phead;newnode->next = first;first->prev = newnode;*/LTInsert(phead->next, x);
}void LTPopFront(LTNode* phead)
{assert(phead);// 空assert(phead->next != phead);/*LTNode* first = phead->next;LTNode* second = first->next;phead->next = second;second->prev = phead;free(first);first = NULL;*/LTErase(phead->next);
}LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->val == x){return cur;}cur = cur->next;}return NULL;
}// 在pos前面的插入
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* posPrev = pos->prev;LTNode* newnode = CreateLTNode(x);// posprev newnode posposPrev->next = newnode;newnode->prev = posPrev;newnode->next = pos;pos->prev = newnode;
}// 删除pos位置
void LTErase(LTNode* pos)
{assert(pos);LTNode* posNext = pos->next;LTNode* posPrev = pos->prev;posPrev->next = posNext;posNext->prev = posPrev;free(pos);//pos = NULL;
}void LTDestroy(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){LTNode* next = cur->next;free(cur);cur = next;}free(phead);//phead = NULL;
}

❣️3.Test.c

#include "List.h"void TestList1()
{LTNode* plist = LTInit();LTPushBack(plist, 1);LTPushBack(plist, 2);LTPushBack(plist, 3);LTPushBack(plist, 5);LTPushBack(plist, 4);LTPrint(plist);LTPushFront(plist, 10);LTPrint(plist);
}void TestList2()
{LTNode* plist = LTInit();LTPushFront(plist, 10);LTPushFront(plist, 20);LTPushFront(plist, 30);LTPushFront(plist, 40);LTPrint(plist);LTPopFront(plist);LTPrint(plist);LTPopFront(plist);LTPrint(plist);LTPopFront(plist);LTPrint(plist);LTPopFront(plist);LTPrint(plist);//LTPopFront(plist);//LTPrint(plist);
}void TestList3()
{LTNode* plist = LTInit();LTPushBack(plist, 1);LTPushBack(plist, 2);LTPushBack(plist, 3);LTPushBack(plist, 5);LTPushBack(plist, 4);LTPrint(plist);LTNode* pos = LTFind(plist, 3);if (pos){pos->val *= 10;}LTPrint(plist);LTInsert(pos, 30000);LTPrint(plist);LTInsert(plist, -1);LTPrint(plist);LTInsert(plist, -2);LTPrint(plist);
}void TestList4()
{LTNode* plist = LTInit();LTPushBack(plist, 1);LTPushBack(plist, 2);LTPushBack(plist, 3);LTPushBack(plist, 5);LTPushBack(plist, 4);LTPrint(plist);LTNode* pos = LTFind(plist, 3);if (pos){LTErase(pos);pos = NULL;}LTPrint(plist);LTDestroy(plist);plist = NULL;
}int main()
{TestList4();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XoT:一种新的大语言模型的提示技术

这是微软在11月最新发布的一篇论文&#xff0c;题为“Everything of Thoughts: Defying the Law of Penrose Triangle for Thought Generation”&#xff0c;介绍了一种名为XOT的提示技术&#xff0c;它增强了像GPT-3和GPT-4这样的大型语言模型(llm)解决复杂问题的潜力。 当前提…

Spring底层原理学习笔记--第九讲--(aop之ajc增强)

AOP实现之ajc编译器 AOP的另一种实现及原理 A10Application.java package com.lucifer.itheima.a10;import com.lucifer.itheima.a10.service.MyService; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframewor…

如何让组织的KPI成为敏捷转型的推手而不是杀手 | IDCF

作者&#xff1a;IDCF学员 伍雪锋 某知名通讯公司首席敏捷教练&#xff0c;DevOps布道者。2020年到2021年小100人团队从0-1初步完成敏捷转型&#xff0c;专注传统制造业的IT转型&#xff0c;研发效能提升。 一、前言 在公司我们常常听见这么一个流传的故事&#xff0c;只要…

HCIA-经典综合实验(二)

经典综合实验&#xff08;二&#xff09; 实验拓扑配置步骤配置Eth-Trunk聚合链路第一步 配置二层VLAN第二步 配置MSTP生成树第三步 配置相关IP地址第四步 配置DHCP及DHCP中继第五步 配置三层的网关冗余协议 VRRP及OSPF第六步 配置静态路由,NAT地址转换及其他配置完善 配置验证…

Linux Ubuntu系统中添加磁盘

在学习与训练linux系统的磁盘概念、文件系统等&#xff0c;需要增加磁盘、扩展现有磁盘容量等&#xff0c;对于如何添加新的磁盘&#xff0c;我们在“Linux centos系统中添加磁盘”中对centos7/8版本中如何添加、查看、删除等&#xff0c;作了介绍&#xff0c;而对Ubuntu版本中…

解决k8s通过traefik暴露域名失败并报错:Connection Refused的问题

我敢说本篇文章是网上为数不多的解决traefik暴露域名失败问题的正确文章。 我看了网上太多讲述traefik夸夸其谈的文章了&#xff0c;包含一大堆复制粘贴的水文和还有什么所谓“阿里技术专家”的文章&#xff0c;讲的全都是错的&#xff01;基本没有一个能说到点子上去&#xf…

Python之函数进阶-递归函数

Python之函数进阶-递归函数 递归 函数直接或者间接调用自身就是 递归递归需要有边界条件、递归前进段、递归返回段递归一定要有边界条件当边界条件不满足的时候&#xff0c;递归前进当边界条件满足的时候&#xff0c;递归返回 递归要求 递归一定要有退出条件&#xff0c;递…

SQL 主从数据库实时备份

在SQL数据库中&#xff0c;主从复制&#xff08;Master-Slave Replication&#xff09;是一种常见的实时备份和高可用性解决方案。这种配置允许将一个数据库服务器&#xff08;主服务器&#xff09;的更改同步到一个或多个其他数据库服务器&#xff08;从服务器&#xff09;&am…

解决:element ui表格表头自定义输入框单元格el-input不能输入问题

表格表头如图所示&#xff0c;有 40-45&#xff0c;45-50 数据&#xff0c;且以输入框形式呈现&#xff0c;现想修改其数据或点击右侧加号增加新数据编辑。结果不能输入&#xff0c;部分代码如下 <template v-if"columnData.length > 0"><el-table-colu…

八股文-面向对象的理解

近年来&#xff0c;IT行业的环境相较以往显得有些严峻&#xff0c;因此一直以来&#xff0c;我都怀有一个愿望&#xff0c;希望能够创建一个分享面试经验的网站。由于个人有些懒惰&#xff0c;也较为喜欢玩乐&#xff0c;导致计划迟迟未能实现。然而&#xff0c;随着年底的临近…

智慧城市项目建设介绍

1. 项目建设背景 随着城市化进程的加速&#xff0c;城市发展面临着诸多挑战&#xff0c;如环境污染、城镇综合管理、经济发展布局等。为了应对这些挑战&#xff0c;智慧城市应运而生&#xff0c;成为城市发展的重要方向。智慧城市通过运用信息技术和智能化技术&#xff0c;实…

Qt UDP通信

UDP通信中单个套接字既是服务器又是客户端。 创建UDP套接字&#xff1a; QUdpSocket *udpSocket; udpSocketnew QUdpSocket(this); 绑定本地端口作为服务端口&#xff1a; udpSocket->bind(port)解除绑定udpSocket->abort(); 向指定ip和端口的主机发送数据报&#…

mmdetection安装与训练

一、什么是mmdetection 商汤科技&#xff08;2018 COCO 目标检测挑战赛冠军&#xff09;和香港中文大学最近开源了一个基于Pytorch实现的深度学习目标检测工具箱mmdetection&#xff0c;支持Faster-RCNN&#xff0c;Mask-RCNN&#xff0c;Fast-RCNN等主流的目标检测框架&#…

Linux 图形界面配置RAID

目录 RAID 1 配置 RAID 5配置 , RAID 配置起来要比 LVM 方便&#xff0c;因为它不像 LVM 那样分了物理卷、卷组和逻辑卷三层&#xff0c;而且每层都需要配置。我们在图形安装界面中配置 RAID 1和 RAID 5&#xff0c;先来看看 RAID 1 的配置方法。 RAID 1 配置 配置 RAID 1…

力扣学习笔记——283. 移动零

力扣学习笔记——283. 移动零 题目描述 https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &a…

Java架构师分布式搜索词库解决方案

目录 1 IK分词器字典热加载实现思路2 分析IK分词器的配置3 基于MySQL更新字典的实现4 常见报错4.1 java.lang.ExceptionInInitializerError: null …access denied (“java.lang.RuntimePermission” “setContextClassLoader”)4.2 java.sql.SQLNonTransientConnectionExcepti…

OpenGL的学习之路-3

前面1、2介绍的都是glut编程 下面就进行opengl正是部分啦。 1.绘制点 #include <iostream> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h>void myMainWinDraw();int main(int argc,char** argv) {glutInit(&argc,argv);glutIni…

windows构建ROS2 Android App

windows构建ROS2 Android App 升级到ROS2之后,由于架构的不同,导致ROS1的Android App已经无法使用了,所以我们需要通过ROS2 java构建出Android的依赖库 环境要求 window10以上wsl(我用的是WSL构建的,你也可以用linux虚拟机)docker(安装的时候选择WSL)Ubuntu 18.04以上…

基于谐波参数空间的卷积神经网络自动三维牙齿分割

论文连接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1524070320300151 机构&#xff1a; a英国卡迪夫大学计算机科学与信息学院 b中国科学院大学北京 c中国科学院计算技术研究所北京 d深圳大数据研究院&#xff0c;深圳518172 代码链接&#x…

本机IP地址查询指令详解

本机IP地址是指在局域网内的计算机的私有IP地址&#xff0c;它是连接网络的基础。了解本机IP地址与相关指令的使用方法&#xff0c;在网络维护以及安全等方面都具有重要的意义。 一、查看本机IP地址 不同的操作系统使用不同的指令来查看本机IP地址。以下是一些常用操作系统的指…