最近不是太忙,整理些东西,工作也许用得到。

1,为什么要用到链表

数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。

我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态数组。它是在程序的执行过程中根据需要有数据存储就向系统要求申请存储空间,决不构成对存储区的浪费。

链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面将逐一介绍。

2,单向链表

单链表有一个头节点head,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL

如图所示

上图还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。

3,单向链表程序的实现

(1),链表节点的数据结构定义

struct node
{
int num;
struct node *p;
} ;  

在链表节点的定义中,除一个整型的成员外,成员p是指向与节点类型完全相同的指针。

在链表节点的数据结构中,非常特殊的一点就是结构体内的指针域的数据类型使用了未定义成功的数据类型。这是在C中唯一规定可以先使用后定义的数据结构。

(2),链表的创建、输出步骤

单链表的创建过程有以下几步:

1 ) 定义链表的数据结构;

2 ) 创建一个空表;

3 ) 利用malloc ( )函数向系统申请分配一个节点;

4 ) 将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新

节点接到表尾;

5 ) 判断一下是否有后续节点要接入链表,若有转到3 ),否则结束;

单链表的输出过程有以下几步

1) 找到表头;

2) 若是非空表,输出节点的值成员,是空表则退出;

3 ) 跟踪链表的增长,即找到下一个节点的地址;

4) 转到2 ).

(3),程序代码例子:

创建一个存放正整数单链表,输入0或小于0的数,结束创建链表,并打印出链表中的值,程序如下:

#include <stdlib.h> /*含ma l l o c ( ) 的头文件*/
#include <stdio.h>  //①定义链表数据结构
struct node
{  int num;  struct node *next;
};
//函数声明
struct node *creat();
void print();
main( )
{  struct node *head;  head=NULL;    //②建一个空表  head=creat(head);/*创建单链表*/  print(head);/*打印单链表*/
}
/******************************************/
struct node*creat(struct node *head)/*返回的是与节点相同类型的指针*/
{  struct node*p1,*p2;  int i=1;
//③利用malloc ( )函数向系统申请分配一个节点  p1=p2=(struct node*)malloc(sizeof(struct node));/*新节点*/   printf("请输入值,值小于等于0结束,值存放地址为:p1_ADDR= %d\n",p1);  scanf("%d",&p1->num);/*输入节点的值*/  p1->next=NULL;/*将新节点的指针置为空*/  while(p1->num>0)/*输入节点的数值大于0*/  {
//④将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新节点接到表尾;   if(head==NULL)  head=p1;/*空表,接入表头*/  else   p2->next=p1;/*非空表,接到表尾*/  p2=p1;  p1=(struct node*)malloc(sizeof(struct node));/*下一个新节点*/  i=i+1;  printf("请输入值,值小于等于0结束,值存放地址为:p%d_ADDR= %d\n",i,p2);  scanf("%d",&p1->num);/*输入节点的值*/
//⑤判断一下是否有后续节点要接入链表,若有转到3 ),否则结束;   }
//==============原来程序更正部分:(多谢@daling_datou提醒)================================  free(p1);  //申请到的没录入,所以释放掉    p1=NULL;   //使指向空    p2->next = NULL; //到表尾了,指向空    printf("链表输入结束(END)\n");
//==============================================  return head;/*返回链表的头指针*/
}
/*******************************************/
void print(struct node*head)/*出以head为头的链表各节点的值*/
{  struct node *temp;  temp=head;/*取得链表的头指针*/  printf("\n\n\n链表存入的值为:\n");  while(temp!=NULL)/*只要是非空表*/  {  printf("%6d\n",temp->num);/*输出链表节点的值*/  temp=temp->next;/*跟踪链表增长*/  }  printf("链表打印结束!!");
}  


在链表的创建过程中,链表的头指针是非常重要的参数。因为对链表的输出和查找都要从链表的头开始,所以链表创建成功后,要返回一个链表头节点的地址,即头指针。

转载自:http://blog.csdn.NET/xubin341719/article/details/7091583/

【C/C++】链表的理解与使用相关推荐

  1. 通过链表深入理解Java的引用和对象

    在正式介绍重点内容以前,先给像我这样的初学者强调一下 " = " 在引用和对象应用中的作用: 大致是 " = " 左边是引用," = " 右 ...

  2. 希尔排序、快速排序、KMP、链表的理解

    创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...

  3. C/C++ list链表的理解以及使用

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  4. 如何理解C语言链表,如何理解c语言链表

    C语言链表就是一种数据结构,可以在上面动态的进行传输分配还可以定义节点数据类别或者实现对节点的增删改查等 链表是一种常见的基础数据结构,结构体指针在这里得到了充分的借助.链表可以动态的进行传输分配,也 ...

  5. 链表的理解——造孽的儿子、操碎心的老妈和人狠话不多的老爸

    前言 初学C语言,请大佬多提宝贵意见,感激不尽.欢迎各位初学者前来交流. # include<stdio.h> # include<malloc.h>struct Studen ...

  6. 可由一个尾指针唯一确定的链表有_极客算法训练笔记(三),链表详细图解,别再逃避了朋友...

    目录 缓存引爆链表 链表单链表双向链表循环链表双向循环链表 LinkedHashMap实现LRU缓存,源码解析(JDK1.8) 算法 爬楼梯 算法 反转链表 算法 链表环检测 缓存引爆链表 存储结构 ...

  7. 链表用java实现简单单链表linkedlist

    链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 每个结点包括两个部分: 1是存储数据元素的数据域data 2是存储下一个结点地址的指针域p. 相 ...

  8. 面试中必知必会的那些题——单链表倒置

    (准备面试,多看点题.来自原文) 我想你去很多家公司面试的时候,遇到单链表倒置的问题可能比较多,如果一定要给面试题来一个排名,估计也能上top10吧,其实这个题目玩的是技巧和你对单链表的理解,其实我们 ...

  9. c语言中头结点不为零怎么写,C语言不带表头结点的单链表操作

    什么是链表 简单理解为链表的功能与数组功能相似用来存储数据,链表作为一种基本的数据结构在程序开发过程当中经常会使用到.对C语言来说链表的实现主要依靠结构体(可以存储多种数据类型)和指针,所以本文相关内 ...

最新文章

  1. linux系统下redhat7之虚拟机控制
  2. Android 如何使用GPU硬件加速
  3. 【五线谱】符干朝向与连音线 ( 符干朝向 | 第三线以下符干朝上 | 第三线以上符干朝下 | 连音线 )
  4. 【推荐系统】协同过滤 零基础到入门
  5. 手机900e模式如何救_苹果手机如何将显示模式改为黑底白字?这个简单!只需4步...
  6. 正则表达式及shell
  7. Maven 建立父子项目和跨项目调用内容的步骤
  8. shell中if条件字符串、数字比对,[[ ]]和[ ]区别
  9. 手机有一个时钟的标志_手机桌面时钟有这几款就够了
  10. 特斯拉柏林超级工厂最终环保审批结果有望周五揭晓
  11. php 判断是否为安卓,通过http user-agent判断是否为手机浏览器
  12. 不合群的人,经常习惯一个人独来独往,这样的人有出息吗?
  13. mfc之解决vs2010调试监视器(MSVSMON.EXE)未能启动的问题
  14. vs2019配置opencv4.3
  15. HDU1166-ZKW树
  16. ebay html描述模板,ebay产品描述模板
  17. Python程序设计经典题库及答案
  18. html网页中加入音乐播放器,如何在网页中插入音乐播放器
  19. Linux系统(三)系统基础扫盲大全
  20. Java Web 代码审计

热门文章

  1. 安徽专升本c语言真题卷大题_安徽成人高考难吗?专升本难吗?
  2. 计算机专业好的广东二本学校排名2015,2015年广东省二本大学排名名单
  3. 高级程序设计 c语言 在线作业,[北京师范大学]19秋《高级程序设计(C)》离线作业(资料)...
  4. 数组专题——找重复数字 利用下标
  5. javaweb学习总结——Filter高级开发
  6. scala class和object,trait的区别
  7. 关于SQL命令中不等号(!=,)
  8. VMware虚拟机三种联网方法及原理
  9. 我的android绘图学习笔记(二)
  10. [memcached] 2. 高级应用