二、单链表的头插法建表和尾插法建表

2024-01-03 23:18
文章标签 建表 单链 插法

本文主要是介绍二、单链表的头插法建表和尾插法建表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链式存储结构:

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

单链表(线性链表)

使用链式存储结构表示每个数据元素 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

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

这篇关于二、单链表的头插法建表和尾插法建表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567379

相关文章

Go语言构建单链表

package mainimport "fmt"type ListNode struct {Val intNext *ListNode}func main() {list := []int{2,4,3}head := &ListNode{Val:list[0]}tail := head //需要头尾两个指针for i:=1;i<len(list);i++ {//方法一 数组直接构建链表tai

[数据结构]线性表之单链表的类模板实现

类的具体实现如下: /#include"LinearList.h"#include <iostream>#include <cstdlib>using namespace std;template<class T>struct LinkNode //链表节点类{T data;LinkNode<T>* link;LinkNode(LinkNode<T>* ptr=NULL):

逆序和顺序创建单链表

单链表是一种顺序的存储方式,数据结构学的不好,考研又是必考内容,只好从头开始学习,相信不断地积累会有更好的爆发! 首先单链表的创建,单链表是建立在结构体的基础上,要创建单链表首先要建立起一个储存数据的结构体: struct node{int elem;node *next;};elem是数据域,用来存放你要输入的数据,next是指向下个存放数据节点的指针同为node 类型; 下面是

单链表核心操作代码

头插法建立单链表 代码: void createListByHead(LinkList &L,int n){LNode *s;//移动指针s int x;//要插入的元素 L = (LinkList)malloc(sizeof(LNode));//创建头结点 L->next=NULL;//初始化头结点 for(int i=0;i<n;i++){scanf("&d",&x);//输入要插入的值

浅谈单链表与双链表的区别

数组的优点 随机访问性强(通过下标进行快速定位) 查找速度快 数组的缺点 插入和删除效率低(插入和删除需要移动数据) 可能浪费内存(因为是连续的,所以每次申请数组之前必须规定数组的大小,如果大小不合理,则可能会浪费内存) 内存空间要求高,必须有足够的连续内存空间。 数组大小固定,不能动态拓展 链表的优点 插入删除速度快(因为有next指针指向其下一个节点,通过改变指针的指向可以方便的增加删除元素)

数据结构——单链表查询、逆序、排序

1、思维导图 2、查、改、删算法 //快慢排序法找中间值int mid_link(Link_t *plink){Link_Node_t *pfast = plink->phead;Link_Node_t *pslow = pfast;int m = 0;while(pfast != NULL){pfast = pfast->pnext;++m;if(m % 2 == 0){pslow

数据结构--单链表C/C++

最近在学习数据结构,其中有介绍单链表跟单循环链表的,现在复习一下。首先要定义一下数据结构(节点),如下: typedef int DataType; //方便后面修改数据类型,有点像C++/JAVA中的泛型typedef struct Node {DataType data;struct Node *next;}Node; 单链表:  接下来是定义一个获取链表某个位置节点的函数,如

入门数据结构JAVA DS——如何实现简易的单链表(用JAVA实现)

前言 链表(Linked List)是一种线性数据结构,它由一系列节点组成,每个节点包含两个部分:存储数据的部分和指向下一个节点的指针(或引用)。链表的结构使得它能够动态地增长和收缩,适合在不固定长度的序列中进行插入和删除操作。 链表的基本概念: 节点(Node):链表的基本单位,每个节点包含两个部分: 数据域(Data):存储节点的具体数据。指针域(Pointer/Next):存储指

数据结构——单链表相关操作

zhuzhu1、结构框图: 2、增删改查: 定义链表节点和对象类型 /*************************************************************************> File Name: link.h> Author: yas> Mail: rage_yas@hotmail.com> Created Time: Tue 03 Sep

算法---------数组-----------翻转单链表

题目: 反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出