何为链表

我们知道,一般用数组存放一组数据时,必须事先定义固定的长度(即元素的个数)。这在某些问题的解决中,并不是特别的适用。例如:记录不同的班级的学生数据时,由于各班人数不同,会出现开辟过大的数组导致内存浪费,开辟过小的数组导致数组元素不够用的情况。而链表可以根据需要动态开辟内存单元,是一种常见的重要数据结构。

链表如同铁链一样,一环扣一环,中间是不能断开的。打个通俗的比喻:幼儿园的老师带领小朋友出来散步,老师牵着第一个小朋友的手,第一个小朋友牵着第二个小朋友的手…这就是一个“链”,最后一个小朋友的手是空的。

老师即“头指针” 变量,以Head表示,它存放一个地址,链表中每一个元素称为“结点”,每个结点都应该包括两个部分:一为实际元素值,一为下一结点的地址。

最后一个元素不指向其他元素,它被称为“表尾”,以“NULL”表示,“NULL”在C++语言里指向“空指针”。

很显然,这种链表的数据结构,必须要用指针变量才能实现。

简单静态链表

下面的代码是一个简单的静态链表,它由3个学生的数据(学号,成绩)的结点组成。请考虑:(1)head的作用(2)p的作用

//简单静态链表
#include<iostream>
using namespace std;struct student
{long num;float score;struct student *next;
};int main()
{struct student a,b,c,*head,*p;a.num=34341; a.score=81.5;b.num=34341; b.score=81.5;c.num=34341; c.score=81.5;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{cout<<p->num<<" "<<p->score<<endl;p=p->next;}while(p!=NULL);getchar();
}

处理动态链表的函数

1.malloc
函数原型为

void *malloc(unsigned int size);

作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数返回的是一个指向分配域起始地址的指针,如果此函数未能成功地执行(如内存空间不足),则返回空指针(NULL)。

2.calloc
函数原型为

void *calloc(unsigned n,unsigned size);

作用是在内存的动态存储区中分配n个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如果分配不成功,则返回NULL。

3.free()
函数原型为

void free(void *p);

作用是释放由p指向的内存区,使这部分内存区能被其他变量使用。

动态链表的准备工作

一个完善的动态链表程序应该具有以下基本功能:建立链表,插入结点,删除结点,打印链表,释放链表等。扩展的动态链表程序还可能有获得链表长度,获得当前结点,查找结点位置,连续两个链表,比较两个链表等功能。下面将逐个实现其功能代码。

为了程序的易读性和可扩展性,有时需要在程序开头先进行预定义处理,请务必领会下面的代码用意,否则将影响对以后代码的理解

#include<stdlib.h>
#include<stdio.h>
typedef int ElemType;       //以 ElemType 代表 int 型数据
typedef struct List *link;  //以 link 代表链表指针
typedef struct List Lnode;  //以 Lnode 代表链表结点struct List
{ElemType data;           //此处仅以一个整型变量为例struct List *next;
};

主函数的建立:下面的主函数只是一个简单调用各功能的示范例子,读者可自行修改和添加代码以完成更复杂的任务。请根据主函数的代码考虑各功能子函数的原型应如何建立。

int main()
{int l;link head1;link head2;head1=create(head1);                              //建立链表1head2=create(head2);                              //建立链表2            connect(head1,head2);                             //连接两个链表head1=insert(head1,888,5);                        //在位置5处插入元素888head1=del(head1,3);                               //删除一个结点display(head1);                                   //打印链表printf("\n lenth is %d\n",lenth(head1));          //打印链表长度printf("\n get is %d\n",get(head1,3));            //获得当前结点值printf("\n locate 12 is %d",lenth(head1,12));     //查找元素12所在的位置head=setnull(head);                               //释放链表
}

链表的建立

由主函数调用create()函数的方式可知,该函数应该返回一个结点的指针,输入的参数也应该是一个结点指针,参考代码如下:

link create(link Head)
{ElemType newData;link NewPoint;//先创建一个结点Head=(link)malloc(sizeof(Lnoed));printf("please input number :\n");scanf("%d",&newData);Head->data=newData;   //结点赋值Head->next=NULL;     //结点指向空地址while(1)             //继续添加结点{NewPoint=(link)malloc(sizeof(Lnode));//开辟一个结点空间if(NewPoint==NULL){//如果开辟空间失败,则返回break;//此判断语句在某些类型的竞赛中用处不大,可忽略}printf("please input number : input '-1' means exit\n");scanf("%d",&newData);if(newData==-1){      //输入-1则添加结点结束并返回headreturn Head;}NewPoint->data=newData;NewPoint->next=Head;Head=NewPoint;}return Head;
}

链表的显示

该子函数无返回值,输入参数为链表的头指针,请考虑:指针p的作用是什么?如果不用指针p,直接用Head这个指针会出现什么后果?

void display(link Head)
{link p;p=Head;if(p==NULL)printf("\nList is empty\n");elsedo{printf("%d",p->data);p=p->next;}while(p!=NULL);
}

结点的插入

link insert(link Head,ElemType x,int i)
{link NewPoint,p=Head;int j=1;NewPoint=(link)malloc(sizeof(Lnode));NewPoint->data=x;if(i==1){NewPoint->next=Head;Head=NewPoint;}else{while(j<i-1&&p->next!=NULL){p=p->NULL;j++;}if(j==i-1){NewPoint->next=p->next;p->next=NewPoint;}elseprintf("insert is Failure,i is not right!!");}return Head;
}

2021-4-8 【链表】【】相关推荐

  1. 字节跳动2021年4月面试算法题库

    本文汇总了牛客2021.4.1~2021.4.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...

  2. 数据结构2021温习篇——队列(5a)

    前言 本节我们讨论队列.考虑有队头"指针"和队尾"指针"的情况. 目录: 数据结构2021温习篇--概况(1) 数据结构2021温习篇--线性表(2) 数据结构 ...

  3. Teddy van Jerry 的导航页

    我的 GitHub 账号 Teddy-van-Jerry. 学习经历 初中时对 C++ 略有接触,大概感知,并未能够系统化地学习. 2020暑假里开始用大段时间学习C++.截止至2020.8.28 1 ...

  4. 字节跳动3月面试遇到的高频算法题

    本文汇总了牛客2021.3.1~2021.3.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...

  5. 2021牛客暑假多校第二场 K题—Stack (链表)

    2021牛客暑假多校第二场 K题-Stack 题意: 一个单调栈,给你第n次操作时里面数据的数量,让你给出里面塞入的会是哪些数字. 主要思想:链表模拟 (代码里面有注释) (题解一开始说的是拓扑,后来 ...

  6. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

  7. 2021字节跳动校招秋招算法面试真题解题报告--leetcode148 排序链表,内含7种语言答案

    148.排序链表 1.题目描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序 2.解题报告 针对nlogn的排序算法,主要有快速排序,归并排序和堆排序.其中,堆排序利用了数 ...

  8. 【练习】2021下半年数据结构刷题笔记和总结 (三)栈 队列 链表 枚举算法

    题目来自书或者网站. 解密QQ 号--队列 回文字符串---栈 火柴棍等式 输入数字n,要求输出从1~n的全排列 [力扣]给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...

  9. Java面试题汇总2021最新(集合泛型含答案下载)

    Java面试题及答案2021最新24题(集合&泛型) 最近给大家整理了一批Java面试题一共24题,主要是搜集的Java集合&泛型这块的,是20201最新时间整理的,并且都含答案打包下 ...

  10. 最新Java面试题2021年,常见面试题及答案汇总

    2021最新Java面试题[附答案解析]java面试题及答案2021,java2021最新面试题及答案汇总,2021最Java面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集 ...

最新文章

  1. 你可能不清楚的 Vue Router 深度用法(一)
  2. FPGA之道(31)VHDL编写注意事项
  3. 实现物体绕不同轴旋转,并可以外部调用的函数
  4. ssh图片上传 java_ssh上传并显示图片
  5. ZigBee网络数据传递流程_Zigbee网络架构解析
  6. 思岚激光雷达+cartographer建图
  7. 优秀的博客地址-冰冻三尺非一日之寒
  8. Layui 后台管理模板 【Y-Admin】
  9. 第十三首歌曲《翱翔的骄鹰》
  10. 阿里云轻量应用服务器防火墙配置(全网最简单)
  11. 计算机桌面来回闪烁,电脑进去桌面就一直闪
  12. Unity Shader 学习记录(5) —— 实现漫反射光照模型
  13. chrome/edge解决不能打开问题
  14. 《重大人生启示录》极简版
  15. Android VideoView播放网络视频
  16. 阿里云IOT物联网终端设备代码简介
  17. 学术和编程:想一出是一出的艺术
  18. 2020年的UI设计师作品集策略
  19. 物联网国赛LORA模块开发基础教程(通用库)—输入(按键)
  20. Chisel入门------Chisel的基本语法3

热门文章

  1. 新MLC颗粒来了!让SSD写入提升2倍 寿命翻10倍
  2. 自建数据库与云数据库RDS性能比较
  3. s17王者服务器维护几点,王者荣耀S17赛季更新维护几点开始?王者荣耀四周年更新多久...
  4. 第五十七章 Caché 函数大全 $REPLACE 函数
  5. Vim 为什么把 HJKL 当作光标键?
  6. X86系统中EAX、ECX、EDX、EBX寄存器的作用
  7. TiDB 故障诊断与性能排查:发生即看见,一切可回溯,Continuous Profiling 应用实践
  8. NEYC 1702 排座 问题模型
  9. [Linux] 添加清华镜像
  10. SQL CAST与CONVERT区别