初识线性链表

简介: 线性链表概述及其结构 所谓“线性”,即为一组数据元素形成前后关系。线性表主要以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);

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

相关文章
|
6月前
|
存储 算法 C语言
线性表,双向链表,静态链表,循环链表(约瑟夫环)(上)
线性表,双向链表,静态链表,循环链表(约瑟夫环)
77 5
|
6月前
特殊链表(循环单链表,循环双链表,静态链表)
特殊链表(循环单链表,循环双链表,静态链表)
50 3
|
6月前
|
存储 C语言
线性表,双向链表,静态链表,循环链表(约瑟夫环)(下)
线性表,双向链表,静态链表,循环链表(约瑟夫环)
71 6
|
6月前
|
算法
链表的回文结构
链表的回文结构
|
6月前
|
算法 程序员
【算法训练-链表 三】【特殊链表】环形链表、环形链表II、回文链表、相交链表
【算法训练-链表 三】【特殊链表】环形链表、环形链表II、回文链表、相交链表
53 0
|
存储
链表(一) 单链表操作详解
链表(一) 单链表操作详解
49 0
|
存储 算法 Java
Java数据结构与算法分析(三)链表(单链表、双链表、环形链表)
通过前篇文章《[数组](https://blog.csdn.net/gozhuyinglong/article/details/109702860)》了解到数组的存储结构是一块连续的内存,插入和删除元素时其每个部分都有可能整体移动。为了避免这样的线性开销,我们需要保证数据可以不连续存储。本篇介绍另一种数据结构:链表。
219 0
|
存储
线性表的链式存储——链表
线性表的链式存储——链表
201 0
链表带环问题
链表带环问题
102 0