范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

数据结构学习总结

  本文主要记录自己学习和记录相关总结,比较乱勿怪,
  1、C语言链表
  c语言的单向链表翻转是面试官常问的问题之一,故此,咱就谈一谈,链表并不是如此可怕,学不会,想不通.
  链表和数组一样都是存储数据,链表是非连续,非顺序的存储结构.
  链表是灵活的内存动态管理(随机分配空间),删除创建结点非常方便
  链表组成:由一系列结点组成.
  链表结点:实际上是结构体变量.
  typedef struct _LINKNODE
  {
  int data;// 数据域
  struct _LINKNODE *next;// 指针域
  }Link_Node;
  链表结点包含两个部分:
  1.存储数据元素的数据域(结构体),
  2.存储下一个结点地址的指针域.
  上图中的就是一个简单的单向链表,明白了单向链表就可以进军其余的链表结构了,都是一一相通的.
  结点:data数据域就是存放的结构体(含有各种数据),或者理解为int data;
  next就是链表的核心了,就是一个指针,指向下一个结点,与下一个结点建立联系
  2. 链表和数组的区别
  数组:一次性分配连续的存储区域,int num[60] = {0};
  优点:随机访问元素效率高
  缺点:
  l 开辟内存过大时,易分配失败
  l 插入和删除元素效率低下
  链表:无需一次性分配连续的存储空间,只需要分配n块结点存储区域,通过指针建立联系
  优点:
  l 不需要一次性分配连续的存储区域
  l 删除和插入效率高
  缺点:
  随机访问元素效率低
  3. 链表分类
  l 1. 静态链表和动态链表
  链表按照线性表链式存储结构分为静态链表和动态链表
  静态链表:是在初始化的时候分配好足够的内存空间,存储空间是静态的,分配在栈上,模拟数组实现的,是顺序的存储结构
  动态链表:是动态申请内存的,每个节点物理地址不连续
  静态链表实例:
  #pragma warning(disable:4996)
  #include 
  #include 
  #include 
  // 定义链表结点
  typedef struct _LINKNODE
  {
  int data;// 数据域
  struct _LINKNODE *next;// 指针域
  }Link_Node;
  int main(int argc, char *argv[])
  {
  // 初始化三个链表结点(结构体)
  Link_Node Node1 = {1,NULL};
  Link_Node Node2 = {2,NULL};
  Link_Node Node3 = {3,NULL};
  // 链表串联起来,第一个结点指向第二个
  Node1.next = &Node2;// Node1的next指针指向Node2
  Node2.next = &Node3;
  Node3.next = NULL;// 尾结点
  // 定义头结点,指向第一个结点
  Link_Node *head = &Node1;
  // 遍历链表,头结点-->尾结点
  while (head != NULL)
  {
  printf("data : [ %d ] ",head->data);
  // 指针下移
  head = head->next;
  }
  printf("hello... ");
  system("pause");
  return 0;
  }
  动态链表实例:
  #pragma warning(disable:4996)
  #include 
  #include 
  #include 
  // 定义链表结点
  typedef struct _LINKNODE
  {
  int data;// 数据域
  struct _LINKNODE *next;// 指针域
  }Link_Node;
  int main(int argc, char *argv[])
  {
  // 动态申请3个结点
  Link_Node *Node1 = (Link_Node *)malloc(sizeof(Link_Node));
  // 初始化数据域
  Node1->data = 1;// Node是指针所以用指向箭头
  Link_Node *Node2 = (Link_Node *)malloc(sizeof(Link_Node));
  Node2->data = 2;
  Link_Node *Node3 = (Link_Node *)malloc(sizeof(Link_Node));
  Node3->data = 3;
  // 建立结点关系
  Node1->next = Node2;// Node1的next指向Node2;
  Node2->next = Node3;
  Node3->next = NULL;
  // 定义头结点指向第一个结点Node1
  Link_Node *head = Node1;
  // 遍历链表
  while (head != NULL)
  {
  printf("data:[ %d ] ",head->data);
  // 指针下移
  head = head->next;
  }
  printf("hello... ");
  system("pause");
  return 0;
  }
  l 2. 带头链表和不带头链表
  n 带头链表:固定一个节点作为头结点,不关心数据域,起一个标志位的作用,链表结点如何变化,此头结点固定不变
  n 不带头结点:头结点不固定,所有结点都可以作为头,可以随机变化
  链表的基本操作基于单向链表1. 创建链表结点域
  链表结点:数据域和指针域à结构体
  typedef struct _LINKNODE
  {
  int data;// 数据域
  struct _LINKNODE *next;// 指针域
  }Link_Node;
  2. 创建链表
  建立带头结点的单向链表,循环创建结点,结点数值为<=0时,作为结束,链表的头结点地址作为函数值返回.
  Link_Node* Init_Link_Node()
  {
  Link_Node *cur = NULL;// 保存上一个结点
  Link_Node *pNew = NULL;// 辅助指针
  Link_Node *head = NULL;// 固定为头结点
  // 创建头结点
  pNew = (Link_Node *)malloc(sizeof(Link_Node));
  // 初始化头结点(有头结点不保证数据安全)
  pNew->data = -1;
  pNew->next = NULL;
  head = cur = pNew;// head作为头结点,cur保存结点
  // 循环创建结点
  int dataid = 0;
  while (1)
  {
  printf("请输入data id编号:");
  scanf("%d",&dataid);
  if (dataid <= 0)
  {
  break;// 跳出循环
  }
  // 创建新结点
  pNew = (Link_Node *)malloc(sizeof(Link_Node));
  pNew->data = dataid;
  // 建立关联,头结点指向新结点
  cur->next = pNew;// 此时head已经指向了新结点
  pNew->next = NULL;
  cur = pNew;// 指针下移
  }
  return head;
  }
  3. 遍历链表
  // 遍历结点,传入链表
  int Print_Link_Node(Link_Node *head)
  {
  if (head == NULL)
  {
  return -1;
  }
  // 保存链表(带头链表的除了头之外的链表)
  Link_Node *cur = head->next;
  printf("head --> ");
  while (cur != NULL)
  {
  // 打印结点数据域
  printf("%d --> ",cur->data);
  // 指针下移操作
  cur = cur->next;
  }
  printf("NULL  ");// cur指向了NULL
  }
  4. 在头部插入结点
  // 头插法
  void Init_Head_Link_Node(Link_Node *head,int dataid)
  {
  if (head == NULL)
  {
  return;
  }
  // 保存第一个有效结点
  Link_Node *cur = head->next;
  // 创建新结点
  Link_Node *pNew = (Link_Node *)malloc(sizeof(Link_Node));
  pNew->data = dataid;
  // 建立关系
  head->next = pNew;
  pNew->next = cur;
  }
  5.尾部插入
  // 尾插法
  void Init_Tail_Link_Node(Link_Node *head,int dataid)
  {
  if (head == NULL)
  {
  return;
  }
  // 保存结点,获取最后一个结点
  Link_Node *cur = head;
  while (cur->next != NULL)
  {
  // 结点后移
  cur = cur->next;
  }
  // 创建新结点,插入
  Link_Node *pNew = (Link_Node *)malloc(sizeof(Link_Node));
  pNew->data = dataid;
  // 尾结点的next指向新结点
  cur->next = pNew;
  // 新结点的next指向NULL
  pNew->next = NULL;
  }
  6.指定位置
  // 找到data为num的前面插入,找不到就尾插
  void Init_Insert_Link_Node(Link_Node *head,int num,int dataid)
  {
  if (head == NULL)
  {
  return;
  }
  // cur为第一个有效结点
  Link_Node *cur = head->next;
  Link_Node *pre = head;//保存前结点
  while (cur != NULL)
  {
  if (cur->data == num)
  {
  break;
  }
  // 循环查找data
  // 指针下移
  pre = pre->next;
  cur = cur->next;
  }
  // 1.找到匹配结点,cur为匹配结点,pre为上一个结点
  // 2.没有找到,说明cur指向NULL,pre为cur的上一个结点
  // pre->next = cur
  // cur = NULL
  // 插入新结点
  Link_Node *pNew = (Link_Node *)malloc(sizeof(Link_Node));
  pNew->data = dataid;
  // 尾结点的next指向新结点
  pre->next = pNew;
  // 新结点的next指向NULL
  pNew->next = cur;
  }
  7. 删除指定data第一个值
  // 删除指定data第一个值
  void Del_Link_Node(Link_Node *head,int dataid)
  {
  if (head == NULL)
  {
  return;
  }
  // cur为第一个有效结点
  Link_Node *cur = head->next;
  // pre保存cur的上个结点
  Link_Node *pre = head;
  // 没有找到匹配结点,1代表找到
  int flag = 0;
  while (cur != NULL)
  {
  if (cur->data == dataid)
  {
  // 找到匹配结点
  flag = 1;
  pre->next = cur->next;
  free(cur);
  cur = NULL;
  break;
  }
  pre = pre->next;
  cur = cur->next;
  }
  if (0 == flag)
  {
  printf("没有找到%d的结点 ",dataid);
  }
  }
  8.释放链表
  // 清空链表
  void Destroy_Link_Node(Link_Node *head)
  {
  Link_Node *cur = head;
  while (cur->next != NULL)
  {
  // 先保存下一个结点
  head = head->next;
  // 释放第一个结点
  free(cur);
  cur = NULL;
  // 当前结点下移
  cur = head;
  }
  printf("链表清空 ");
  }
  9.main函数
  int main(int argc, char *argv[])
  {
  // 创建链表
  Link_Node *headLink_Node = Init_Link_Node();
  Print_Link_Node(headLink_Node);
  // 头插
  Init_Head_Link_Node(headLink_Node,1111);
  // 尾插法
  Init_Tail_Link_Node(headLink_Node,2222);
  Print_Link_Node(headLink_Node);
  // 查找4,插入
  Init_Insert_Link_Node(headLink_Node,4,3333);
  Print_Link_Node(headLink_Node);
  // 删除2
  Del_Link_Node(headLink_Node,2);
  Print_Link_Node(headLink_Node);
  // 清空链表
  Destroy_Link_Node(headLink_Node);
  printf("hello... ");
  system("pause");
  return 0;
  }

智能双刷吸拖一体!石头智能双刷洗地机U10评测人类高质量清洁工具如何高效完成日常清洁工作可以说是生活里的永恒话题,毕竟按照中国人的清洁习惯,一次简单的清扫就包括扫地和拖地两个步骤,如果赶上雨季,拖完地还要擦干,也就是说要完成一次清扫总共需要三道这样选择智能手机都不会吃亏现在的智能手机类目几乎是五花八门,季季都有新款,厂商的不断广告炒作让我们很多人都不知道该怎么选择?有时候被销售员洗脑,买回来才发现,根本就不是那么回事?图片源自网络,仅供参考那么今三星75QN85A决战华为V75super,智能体验恰到好处如今,电视早已成为了人们日常生活的必需品,科技的发展与进步让电视也更加智能化,为我们的生活提供了更多的便利,在众多电视品牌当中,两款高端电视腾空而出十分出彩,三星75QN85A和华定位中高端,三星GalaxyM52新品配置曝光骁龙778G虽然国内市场上已经逐渐见不得三星的身影了,但不可否认的是,即使失去了中国的市场,三星依然凭借着强悍的硬件和强大的品牌效应,保持着全球手机销量第一。前不久,三星也带来了两款全新的折叠华为申请新专利智能机镜头配备可变性摄像头近些年,智能机照相的图像品质得到较大提高,即便是目前最划算的费用预算型号也配备了多个监控摄像头,便于在各种各样状况下拍攝让人印象深刻的照片或视頻。但目前许多智能机的监控摄像头仍有许ZOL早餐iPhone13谍照,拼多多农产品零佣金8月25日晨,为您推送科技行业最新消息1iPhone13谍照泄露,全新粉红配色曝光据爆料,即将发布的iPhone13系列除了经典黑色和白色以外,还将有2种全新配色,从图片中可以看出增强还是变弱,p40到p50,华为采用计算光学方案替代ryyb方案了?p50系列受制裁很多想用的技术无法找到供应链提供配件,虽然计算光学很给力,但还是留下太多遗憾。最遗憾的是,新一代ryyb传感器搭配新一代芯片麒麟9000的手机没有了。保留华为最多特还有人说国产手机不行吗?中国移动亲自正名,苹果连个影子都没有就在刚刚,中国移动发布2021年智能硬件质量报告,同时发布了2021年5G手机综合评测TOP排名。一石惊起千层浪,瞬间就引爆了数码圈。5G技术的应用,小到人们的衣食住行,大到军事航全新14ampamp39ampamp39和16ampamp39ampamp39MacBookPro的芯片相同泄密者Dylan今天在推特上爆料称,苹果即将发布的14英寸MacBookPro和16英寸MacBookPro会搭载相同型号的苹果芯片,下一代苹果芯片可能被称为M1X。目前的13英寸大型真香!BeatsStudioBuds一个月使用心得编买编测栏目致力于分享编辑个人购买的科技数码产品的使用体验,对消费者的选购提供参考和建议,本栏目将根据编辑购买产品的频率不定期更新,感兴趣的网友可以在文章首页关注编辑本人,获得最新微信iOS版8。0。12正式发布,更新了个寂寞昨天下午,疯师傅发现微信iOS8。0。12正式版已经推出了。但仔细一看,发现这个版本更新了个寂寞啊!上周四微信更新了iOS版8。0。11,这个版本还不错,至少给大家伙带来了三个新功
人为气候变化导致2020年飓风降雨科技日报北京4月12日电(记者张梦然)英国自然通讯杂志12日发表的一篇论文认为,与工业化前水平相比,人类引发的气候变化致2020年大西洋飓风季的小时降雨量增加多达10。2020年飓当断则断,评芒格减仓阿里4月11日,从美国市场传来消息,98岁的查理芒格先生旗下的DailyJournal公司对外界正式披露了其2022年第一季度持仓明细,其中最令外界关注的是相对2021年底,这家报纸和2020冲击高端的国产手机对比今年的国产手机到现在虽然已经发布了很多,但是真正在冲击高端的也就这么三款吧,第一就是OPPO的findx5pro,还有就是刚刚发布的Vivoxnote,最后一个就是荣耀magic4竟不到千元!小米新款全面屏电视要被疯抢小米43英寸全高清电视EA432022款近日于京东商城限时促销中,到手价仅为999元,不到千元的价格就能享受到全高清智能影音,立体声扬声器,还有小米AI生态控制,卧室的第一台观影神网传骑手送餐加价?回应商家只给米饭配送费却要求送40斤大米4月12日,一段视频迅速在网上传播。视频中,一名外卖骑手在电话中告诉对方你是(送)大米的,不加价我不帮你送疑似向客户要求送餐加价。该视频被上传至抖音平台后,迅速引发广泛关注。事件真观测显示银河系中,它俩相遇会制造出大量恒星参考消息网4月13日报道据美国科学新闻双周刊网站4月1日报道,就像两位伟大的词曲作者并肩工作,相互激励,创作出他们最好的作品一样,大小麦哲伦星云每次相遇时都会产生新的恒星。肉眼可见女朋友最近看上了一款OPPOReno7手机,吵着要我给她买女朋友最近看上了一款OPPOReno7手机,吵着闹着要我给她买,可是明明前不久才换的新手机,OPPO简直就是女孩子的收割机啊。不过话说回来,这款手机是真漂亮,不得不说OPPO手机系人民快评理性看待快递小哥日入万元来源人民网顺丰同城骑士日入过万?据报道,顺丰同城回应称,该顺丰同城骑士共完成60笔同城配送订单,系企业用户下单,订单佣金计提总额达10067。75元。其中基础佣金534元,各类特殊如果这题都不会面试官还会继续问我JVM如何判断对象是否可回收不懂就问,世界都快毁灭了我为啥还要在这背八股写论文(滑稽)首先,对于JVM来说,什么是垃圾?简单说就是内存中已经不再被使用到的空间就是垃圾其次,什么是垃圾收集(GarbageCol做活党建赋能数字经济大文章来源中工网近年来,大数据云计算人工智能区块链等技术加速创新,日益融入经济社会发展各领域全过程,数字经济发展速度之快辐射范围之广影响程度之深前所未有,正在成为重组全球要素资源重塑全球特斯拉在华部分进口及国产Model3电动汽车北京商报讯(记者刘洋刘晓梦)4月7日,国家市场监督管理总局发布消息称,特斯拉汽车(北京)有限公司特斯拉(上海)有限公司根据缺陷汽车产品召回管理条例和缺陷汽车产品召回管理条例实施办法