链式存储结构:

用一组不一定连续的存储单元存储逻辑上相邻的元素,元素间的逻辑关系是由附加的指针域表示的,由此得到的存储结构称为链式存储结构。

单链表(线性链表)

使用链式存储结构表示每个数据元素 ai 时,除了存储 ai 本身信息之外,还需要一个存储指示其后继元素 ai+1 存储位置的指针。由这两部分组成元素 ai 的存储映像称为 结点。它包括两个域:存储数据元素的域称为数据域,存储直接后继存储地址的域称为指针域。利用这种存储方式表示的线性表称为链表,n个结点链成一个链表,即为线性表的链式存储结构。由于这种链表的每个结点中只包含一个指针域,因此又称为单链表



一个单链表可由头指针唯一确定,因此单链表可以用头指针的名字来命名。
链式存储结构如下:

typedef int DataType;   //定义数据类型
typedef struct node     //结点类型定义
{DataType data;      //结点的数据域struct node * next; //结点的指针域,存储下一个结点的地址
}ListNode;
typedef ListNode * LinkList; //定义一个指针类型

头插法建表

头插法建表是从一个空表开始,重复读入数据,生成新节点,将读入的数据存放到新节点的数据域中,然后将新节点插入到当前链表的表头上,直到读入结束标志为止。

/*头插法建表,并返回头指针
*/
LinkList CreateListF(int arr[],int length)
{LinkList head;  //声明指向单链表的头指针ListNode * p;   //定义一个指向结点的指针变量head = NULL;    //置空单链表for(int i = 0; i < length; i++){p = (ListNode *)malloc(sizeof(ListNode));   //申请一个新的结点p->data = arr[i];   //数据域复制p->next = head;     //指针域赋值head = p;           //头指针指向新的结点printf("data=%d p=%p\n",p->data,p);}return head;
}

头插法建立的链表是将新结点插入在表头,算法比较简单,但新建链表中的结点次序和数组顺序相反。如果想要和数组顺序一致,可以使用尾插法建表。

尾插法建表

将新节点插入当前链表的表尾上,因此需要增设一个尾指针near,使其始终指向链表的尾节点。

/*尾插法建表,并返回头指针
*/
LinkList CreateListR(int arr[],int length){LinkList head,rear;ListNode *p;head = NULL; rear = NULL;   //置空单链表for(int i = 0; i < length; i++){p = (ListNode *)malloc(sizeof(ListNode));   //申请新节点p->data = arr[i];   //数据域赋值if (head == NULL) {head = p;       //新节点*p插入空表}else{rear->next = p; //新节点*p插入到非空表的表尾节点*rear之后}rear = p;   //表尾指针指向新的表尾指针printf("data=%d p=%p\n",p->data,p);}if (rear != NULL) {rear->next = NULL;  //终端结点的指针域置空}return head;
}

主程序代码:

#include <stdio.h>
#include "E:/Dev/C/DataStructure/chapter2/LinkList.c"void printLink();
int main(){int arr[] = {1,2,3};LinkList head = NULL;printf("头插法\n");head = CreateListF(arr,3);printf("head= %p\n",head);printLink(head);printf("尾插法\n");head = CreateListR(arr,3);printf("head= %p\n",head);printLink(head);return 0;
}/*打印输出链表
*/
void printLink(LinkList head){printf("输出:");LinkList temp = head; while(temp != NULL){printf("%d ",temp->data);temp = temp->next;  }printf("\n");
}

编译运行,输出结果:

可以看出头插法输入123,输出321。尾插法输入123,输出123。

头插法新建链表节点的次序和输入时的顺序相反,尾插法新建链表节点次序和输入次序相同。

引入带头节点

为了简化算法,方便操作,在链表开始结点前附加一个结点,称为头结点。如下

尾插法建立单链表算法可简化:

/*尾插法建立带头节点的单链表算法
*/
LinkList CreateListR1(int arr[],int length){LinkList head = (ListNode *)malloc(sizeof(ListNode));   //申请头结点ListNode *p,*r;r = head;       //尾指针初始指向头结点for(int i = 0; i < length; i++){p = (ListNode *)malloc(sizeof(ListNode));   //申请新节点p->data = arr[i];r->next = p;    //新节点连接到尾结点之后r = p;          //尾结点指向新节点  printf("data=%d p=%p\n",p->data,p);  }r->next = NULL; //终端结点指针域置空return head;
}

输出结果

尾插法建立带头结点单链表
data=1 p=0000000000176CF0
data=2 p=0000000000176D10
data=3 p=0000000000176D30
输出:1512480 1 2 3

因为增加了头结点,所以输出也就多了一位。因为头结点没有赋值,所以值是没有意义的。

二、单链表的头插法建表和尾插法建表相关推荐

  1. 单链表-史上最清晰的尾插法和头插法

    02.单链表-史上最清晰的尾插法和头插法 1.单链表 链表是一系列的存储数据元素的单元,通过指针(引用)串联起来的,因此每个单元至少有两个域,一个域用于数据元素的存储,另一个域是指向其他单元的指针. ...

  2. 单链表——单链表的定义及基本操作(初始化、头插法尾插法建表、查找、插入、删除、判空等)

    文章目录 单链表的定义 单链表上的操作 初始化 建立单链表 头插法建立单链表 尾插法建立单链表 遍历单链表 求单链表的长度 查找操作 按值查找 按位查找 插入操作 删除操作 判空操作 完整代码及实例 ...

  3. 数据结构(二)——单链表的头插与尾插

    一.引言 上篇文章我们知道了顺序表的缺点: 插入和删除操作需要移动大量元素. 数组的大小不好确定. 存储分配需要一整段连续的存储空间,不够灵活,造成很多碎片(空闲的空间得不到利用). 所以我们就引入了 ...

  4. 创建单链表的头插法与尾插法详解

    创建单链表 关于数据结构的入门,就是从顺序表和单链表开始. 我们不讲顺序表,直接从单链表开始我们的数据结构和算法的学习之路. 单链表就是一种特殊的结构体组合而成的数据结构,关于单链表的创建方法有很多种 ...

  5. 单链表的头插法与尾插法详解

    创建单链表 关于数据结构的入门,就是从顺序表和单链表开始. 我们不讲顺序表,直接从单链表开始我们的数据结构和算法的学习之路. 单链表就是一种特殊的结构体组合而成的数据结构,关于单链表的创建方法有很多种 ...

  6. 单链表的头插法和尾插法c语言实现

    /*单链表的头插法和尾插法c语言实现*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #d ...

  7. 单链表的头插法尾插法及删除节点操作

    带头节点的单链表的头插法尾插法及删除节点操作 链表的操作对于初学者来说理解非常有难度,初学的同学们应该在学习链表的过程中多再练习本上画图,写一行代码就画出代码执行后链表各节点图的变化,方便理解.我也是 ...

  8. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表

    http://blog.csdn.net/abclixu123/article/details/8210109 链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的.在C语言中,链表是通过 ...

  9. 双链表——双链表的定义及其基本操作(初始化、头插法尾插法建表、插入、查找、删除、判空等)

    文章目录 双链表的定义 双链表上的操作 初始化 插入操作 建立双链表 头插法建立双链表 尾插法建立双链表 遍历操作 求双链表的长度 查找操作 按值查找 按位查找 删除操作 判空操作 完整代码及实例 总 ...

最新文章

  1. python数据类型详解(全面)
  2. Magento 获取当前店铺信息(首页,类别,地址等)
  3. 使用datareader检索数据
  4. 贾跃亭旗下FF公司遭做空 美国机构质疑其造车能力:卖不出一辆FF91
  5. GPT2模型训练,50w个多轮中文对话语料
  6. ThingsBoard 提示Too many updates!
  7. python3--环境搭建说明;
  8. puttygen convert ppk file to xshell key file
  9. 使用最小二乘法计算机器学习算法之线性回归(计算过程与python实现)
  10. Hive常用命令之MSCK REPAIR TABLE命令概述
  11. SQL Server常用函数整理
  12. git --暂存区存在的意义
  13. sendgrid html text,在Node.js中的SendGrid的“发件人”字段中添加名称
  14. 台式计算机蓝牙如何安装,台式电脑没有蓝牙怎么安装
  15. Python3 - pillow的基本用法(第三天)
  16. 特斯拉Tesla Model 3整体架构解析
  17. 淮阴工学院计算机科学讲师,淮阴工学院计算机与软件工程学院统战人士工作业绩...
  18. 【网络学习】LSTM 长期依赖(Long-Term Dependencies)问题
  19. 爬虫需谨慎!那些你不知道的爬虫反爬虫套路,学起来!
  20. 国产化7K325T板卡学习资料: 基于国产化Ch-7K325T 的 FMC接口PCIe卡 国产化板卡

热门文章

  1. Unity Shader UV动画之高光材质加上透明材质与UV动画
  2. UE4学习笔记-材质篇(一)UV动画制作
  3. Ansible剧本示例
  4. CISP-PTE靶机练习(me-and-my-girlfriend)
  5. Office 2003: 使用Excel去除重复数据
  6. nginx配置访问白名单
  7. 拨号上网、ISDN、ADSL、光纤上网比较
  8. 出版一本书可以赚多少钱_出版商精选:2015年29本书
  9. 二进制bit0是什么意思_阜平吧在讨论5G的问题,感觉挺有意思,科普下……
  10. 学计算机专业的打字要快么,怎样学电脑打字最快电脑新手如何快速学会打字