初识线性链表

简介: 线性链表概述及其结构 所谓“线性”,即为一组数据元素形成前后关系。线性表主要以2种形式在内存中存放,一种是以数组的形式,用数组存放时是连续存放的,当我们需要对其中一个数据元素进行删除或者插入时,需要移动其他数据,并且用数组还需要申请合适的内存空间,太小装不下,太大会造成内存空间浪费。这时,就需要我们的线性链表出手,链表不需要在内存里面连续存放,而是以指针将各数据单元链接起来,所以,我们在进行删除或者插入数据元素时,不需要移动其他数据元素。 现在正式介绍链表,链表是由一系列的结点组成,每个节点包含两个域,一个是数据域,主要用来保存用户数据,可以是任意数据类型;另一个叫指针域,用来保存下一

线性链表概述及其结构


 所谓“线性”,即为一组数据元素形成前后关系。线性表主要以2种形式在内存中存放,一种是以数组的形式,用数组存放时是连续存放的,当我们需要对其中一个数据元素进行删除或者插入时,需要移动其他数据,并且用数组还需要申请合适的内存空间,太小装不下,太大会造成内存空间浪费。这时,就需要我们的线性链表出手,链表不需要在内存里面连续存放,而是以指针将各数据单元链接起来,所以,我们在进行删除或者插入数据元素时,不需要移动其他数据元素。


 现在正式介绍链表,链表是由一系列的结点组成,每个节点包含两个域,一个是数据域,主要用来保存用户数据,可以是任意数据类型;另一个叫指针域,用来保存下一个结点的地址。一个完整的链表包含头结点,中间结点,尾结点(有些代码可没有有尾结点)。其中头结点的数据域是不存放有效数据的,它的指针域存放实际数据链表的第一个数据单元的地址。尾结点的指针域指向NULL(空),作为链表结束的标志。下面是一个线性链表逻辑图借以参考:

基本结构已经知晓,那么接下来就是定义一个结点,定义结点用结构体类型来定义:


struct  LinkNode       //LinkNode为结点结构体类型名


{


  int data;                 //数据成员定义


struct  LinkNode *next;          //定义指针域(结点结构体类型名 *指针变量名)


};


线性链表的基本操作

 线性链表的基本操作包括创建,插入,删除,输入,销毁等。

1:链表的创建操作

基本思路:就是往空链表中插入若干个结点,并保持前后驱动关系。先创建一个头结点,让head和tail都指向它,并让它的指针域为空,再创建新的数据结点,用指针pnew指向新的数据结点,并将实际的数据放在该结点的数据域,而他的指针域置为NULL,最后将该节点插入到tail所指向结点的后面,同时使tail指向pnew所指向的结点

代码形式如下:

#include <stdio.h>#include <stdlib.h>Node*Create_LinkList()
{
intscore;
Node*head,*tail,*pnew;
head=(Node*)malloc(sizeof(Node));        //创建头结点if(head==NULL)             //创建失败,则返回{
printf("no enough memory\n");
return(NULL);
}
head->next=NULL;      //头结点的指针域置于NULLtail=head;            //开始时尾指针指向头指针printf("input the score of students:\n");
while(1)              //创建学生线性链表{
scanf("%d",&score);    //接收成绩if(score<0)            //成绩为负,退出break;
pnew=(Node*)malloc(Sizeof(Node));      //创建一个新结点if(pnew==NULL)               //若创建失败,返回{
printf("no enough memory\n");
return(NULL);
}
pnew->score=score;       //新结点数据域放输入的成绩pnew->next=NULL;         //新结点指针域指向NULLtail->next=pnew;         //新结点插入到链表尾tail=pnew;                //}
return(head);
}

2:链表插入

插入就只需要两步:


void insertData( Node *LinkList,*pnew,int data)


{


Node *newNode=create(data);      


newNode->next=headNode->next;      //第一步


headNode->next=newNode;                //第二步


}

3:链表删除

删除只需要一步,即图中绿色线的步骤:

preNode->next=curNode->next;

free(curNode);

链表的基本操作还有很多,在这就只讲述了三种,待掌握成熟,会继续精进,感谢友友的读取,记得一键三连哟,阿里嘎多 ,懒洋洋桑!

相关文章
|
7月前
|
存储 算法 C语言
线性表,双向链表,静态链表,循环链表(约瑟夫环)(上)
线性表,双向链表,静态链表,循环链表(约瑟夫环)
84 5
|
3月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
6月前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
81 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
7月前
|
存储 C语言
线性表,双向链表,静态链表,循环链表(约瑟夫环)(下)
线性表,双向链表,静态链表,循环链表(约瑟夫环)
76 6
|
存储
线性表的链式存储结构
线性表的链式存储结构
100 0
|
存储 算法 Java
Java数据结构与算法分析(三)链表(单链表、双链表、环形链表)
通过前篇文章《[数组](https://blog.csdn.net/gozhuyinglong/article/details/109702860)》了解到数组的存储结构是一块连续的内存,插入和删除元素时其每个部分都有可能整体移动。为了避免这样的线性开销,我们需要保证数据可以不连续存储。本篇介绍另一种数据结构:链表。
225 0
|
存储
线性表的链式存储——链表
线性表的链式存储——链表
221 0
线性表的链式存储实现(带头结点)
线性表的链式存储实现(带头结点)
|
存储 Java
求单向链表的中间结点
#### 需求 非空的单向链表,返回其中间节点。如果有两个中间结点,返回第二个。 链表大小控制在1~100之间。
|
存储 C++
C++实现线性表 - 02 单向链表
今天我们来动手实现一下链表结构,链表在我们后续的数据结构中用的十分频繁,可以说就是实现后续很多数据结构一个的基本工具,也是最容易的数据结构之一,我们先从最基础的单向链表讲起,小白刚开始学习肯定会被折磨的头疼,我也是这样的,但只要啃下这块硬骨头就已经前进一大步了!
186 0
C++实现线性表 - 02 单向链表

热门文章

最新文章