浅析线性表的链式存储结构——链表

合集下载

数据结构中linklist的理解

数据结构中linklist的理解

数据结构中linklist的理解LinkList(链表)的理解。

在数据结构中,链表(LinkList)是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

链表是一种线性数据结构,它可以用来表示一系列元素的顺序。

与数组不同,链表中的元素在内存中不是连续存储的,而是通过指针相互连接起来的。

这种特性使得链表具有一些独特的优势和应用场景。

链表的基本结构。

链表由节点组成,每个节点包含两部分,数据和指针。

数据部分用来存储元素的值,指针部分用来指向下一个节点。

链表的第一个节点称为头节点,最后一个节点称为尾节点,尾节点的指针指向空值(NULL)。

链表的分类。

链表可以分为单向链表、双向链表和循环链表三种基本类型。

单向链表,每个节点只包含一个指针,指向下一个节点。

双向链表,每个节点包含两个指针,分别指向前一个节点和后一个节点。

循环链表,尾节点的指针指向头节点,形成一个闭环。

不同类型的链表适用于不同的场景,选择合适的链表类型可以提高数据操作的效率。

链表的优势。

链表相对于数组有一些明显的优势:插入和删除操作高效,由于链表中的元素不是连续存储的,插入和删除操作可以在常数时间内完成,而数组中的插入和删除操作需要移动大量元素,时间复杂度为O(n)。

动态扩展,链表的大小可以动态调整,不需要预先分配固定大小的内存空间。

链表的应用场景。

由于链表的优势,它在一些特定的应用场景中得到了广泛的应用:LRU缓存,链表可以用来实现LRU(Least Recently Used)缓存淘汰算法,当缓存空间不足时,链表可以高效地删除最久未使用的元素。

大整数运算,链表可以用来表示大整数,实现大整数的加减乘除运算。

图论算法,在图论算法中,链表常常用来表示图的邻接表,用于表示图中的顶点和边的关系。

链表的实现。

链表的实现可以使用指针或者引用来表示节点之间的关系。

在C语言中,可以使用指针来表示节点之间的连接关系;在Java等语言中,可以使用引用来表示节点之间的连接关系。

线性表 知识点总结

线性表 知识点总结

线性表知识点总结线性表的特点:1. 有序性:线性表中的元素是有序排列的,每个元素都有唯一的前驱和后继。

2. 可变性:线性表的长度是可变的,可以进行插入、删除操作来改变表的元素数量。

3. 线性关系:线性表中的元素之间存在明确的前驱和后继关系。

4. 存储结构:线性表的存储结构有顺序存储和链式存储两种方式。

线性表的操作:1. 查找操作:根据元素的位置或值来查找线性表中的元素。

2. 插入操作:将一个新元素插入到线性表中的指定位置。

3. 删除操作:将线性表中的某个元素删除。

4. 更新操作:将线性表中的某个元素更新为新的值。

线性表的顺序存储结构:顺序存储结构是将线性表的元素按照其逻辑顺序依次存储在一块连续的存储空间中。

线性表的顺序存储结构通常采用数组来实现。

数组中的每个元素都可以通过下标来访问,因此可以快速的进行查找操作。

但是插入和删除操作会导致元素位置的变动,需要进行大量数据搬移,效率较低。

线性表的链式存储结构:链式存储结构是将线性表的元素通过指针相连,形成一个链式结构。

每个元素包含数据和指向下一个元素的指针。

链式存储结构不需要连续的存储空间,可以动态分配内存,适合插入和删除频繁的场景。

但是链式结构的元素访问不如顺序结构高效,需要通过指针来逐个访问元素。

线性表的应用场景:1. 线性表适用于数据元素之间存在明确的前后关系,有序排列的场景。

2. 顺序存储结构适用于元素的插入和删除操作较少,对元素的随机访问较频繁的场景。

3. 链式存储结构适用于插入和删除操作较频繁的场景,对元素的随机访问较少。

线性表的操作的时间复杂度:1. 查找操作:顺序存储结构的时间复杂度为O(1),链式存储结构的时间复杂度为O(n)。

2. 插入和删除操作:顺序存储结构的时间复杂度为O(n),链式存储结构的时间复杂度为O(1)。

线性表的实现:1. 顺序存储结构的实现:使用数组来存储元素,通过下标来访问元素。

2. 链式存储结构的实现:使用链表来实现,每个元素包含数据和指向下一个元素的指针。

cy24 线性表--循环链表解读

cy24 线性表--循环链表解读

2)链表: n 个结点由指针链组成一个链表。 它是线性表的链式存储映像, 称为线性表的链式存储结构。 3)单链表、双链表、循环链表: • 结点只有一个指针域的链表,称为单链表或线性链表 • 有两个指针域的链表,称为双链表(但未必是双向链表) • 首尾相接的链表称为循环链表。
拓展:静态链表 静态链表借用一维数组来描述线性链表。数组中 的一个分量表示一个结点,同时使用游标(指示器cur即 为伪指针)代替指针以指示结点在数组中的相对位置。 数组中的第0个分量可以看成头结点,其指针域指示静 态链表的第一个结点。 这种存储结构仍然需要预先分配一个较大空间,但 是在进行线性表的插入和删除操作时不需要移动元素, 仅需要修改“指针”,因此仍然具有链式存储结构的主 要优点。
下图给出了一个静态链表的示例。图(a)是一个修改之前的 静态链表,图(b)是删除数据元素“陈华”之后的静态链表,图(c) 插入数据元素“王华”之后的静态链表,图中用阴影表示修改 的游标。
数据域 0 1 2 3 4 5 6 7 8 9 (a) 张斌 刘丽 李英 陈华 王奇 董强 王萍 游标域 1 2 3 4 5 6 7 0 0 1 2 删除“陈华” 3 4 5 6 7 8 9 (b) 张斌 刘丽 李英 陈华 王奇 董强 王萍 数据域 游标域 1 2 3 5 5 6 7 0 0 1 在 “刘丽” 之后 2 插入“王华” 3 4 5 6 7 8 9 (c) 王奇 董强 王萍 王华 6 7 0 3 张斌 刘丽 李英 数据域 游标域 1 2 8 5
例:实现将两个线性表heada(a1,a2,a3,…an)和 headb(b1,b2,b3,…bn)链接成一个线性表的运算。 假设线性表为单循环链表。 linklist connect(linklist heada,linklist headb) //若heada,headb分别指向表头结点 { linklist p=heada->next; while (p->next!=heada) p=p->next; //p指向表a的尾结点 p->next=headb->next; //链接表a、b while (p->next!=headb) p=p->next; free(headb); p->next=heada; 讨论: return(heada); 有没有更快的方法? }

线性表可用顺序表或链表存储的优缺点

线性表可用顺序表或链表存储的优缺点

线性表可⽤顺序表或链表存储的优缺点顺序存储表⽰是将数据元素存放于⼀个连续的存储空间中,实现顺序存取或(按下标)直接存取。

它的存储效率⾼,存取速度快。

但它的空间⼤⼩⼀经定义,在程序整个运⾏期间不会发⽣改变,因此,不易扩充。

同时,由于在插⼊或删除时,为保持原有次序(没有规定元素进栈顺序),平均需要移动⼀半(或近⼀半)元素,修改效率不⾼。

链接存储表⽰的存储空间⼀般在程序的运⾏过程中动态分配和释放,且只要存储器中还有空间,就不会产⽣存储溢出的问题。

同时在插⼊和删除时不需要保持数据元素原来的物理顺序,只需要保持原来的逻辑顺序,因此不必移动数据,只需修改它们的链接指针,修改效率较⾼。

但存取表中的数据元素时,只能循链顺序访问,因此存取效率不⾼。

1 顺序表和链表的时间性能⽐较所谓时间性能是指实现基于这种存储结构的基本运算(即算法)的时间复杂度。

像取出线性表中第 i 个元素这样的按位置随机访问的操作,使⽤顺序表更快⼀些;取前趋和后继结点的操作在顺序表中可以很容易调整当前的位置向前或向后,因此这两种操作的时间为O(1) ;相⽐之下,单链表不能直接访问上述的元素,按位置访问只能从表头开始,直到找到那个特定的位置,所需要的平均时间为O( n ) 。

给出指向链表中某个合适位置的指针后,插⼊和删除操作所需的时间仅为O( 1 ),⽽顺序表进⾏插⼊和删除操作需移动近乎表长⼀半的元素,需要的平均时间为O( n ) 。

这在线性表中元素个数较多时,特别是当每个元素占⽤的空间较多时,移动元素的时间开销很⼤。

对于许多应⽤,插⼊和删除是最主要的操作,因此它们的时间效率是举⾜轻重的,仅就这个原因⽽⾔,链表经常⽐顺序表更好。

作为⼀般规律,若线性表需频繁查找却很少进⾏插⼊和删除操作,或其操作和“数据元素在线性表中的位置”密切相关时,宜采⽤顺序表作为存储结构;若线性表需频繁进⾏插⼊和删除操作时,则宜采⽤链表做存储结构。

2 顺序表和链表的空间性能⽐较所谓空间性能是指这种存储结构所占⽤的存储空间的⼤⼩。

第3章线性表的链式存储

第3章线性表的链式存储
L
(a) 空循环链表
L
a1
a2
...
an
(b) 非空循环链表
3.1.3 双向链表
在单链表结点中只有一个指向其后继结点的next 指针域,而找其前驱则只能从该链表的头指针开始,顺 着各结点的next指针域进行查找,也就是说找后继的时 间复杂度是O(1),找前驱的时间复杂度是O(n)。如果也 希望找前驱像后继那样快,则只能付出空间的代价:每 个结点再加一个指向前驱的指针域prior,结点的结构修 改为下图,这样链表中有两个方向不同的链,用这种结 点组成的链表称为双向链表。
1.带头结点的单链表 2.不带头结点的单链表
3.3.3 单链表插入操作的实现
单链表的插入操作是指在表的第i个位置结点处插入 一个值为data的新结点。插入操作需要从单链表的第一个结 点开始遍历,直到找到第i个位置的结点。插入操作分为在 结点之前插入的前插操作和在结点之后插入的后插操作。
1.前插操作 2.后插操作
2.整数型单链表算法
3.不带头结点的单链表算法
3.2.2 尾插法单链表的创建实现
用头插法实现单链表的创建,比较简单,但读入的 数据元素的顺序与生成的链表中元素的顺序是相反的。若希 望两者次序一致,则用尾插法创建单链表。为了快速找到新 结点插入到链表的尾部位置,所以需加入一个尾指针r用来 始终指向链表中的尾结点。初始状态:头指针L和尾指针r均 为空,把各数据元素按顺序依次读入,申请结点,将新结点 插入到r所指结点的后面,然后r指向新结点,直到读入结束 标志为止。
3.2.2 尾插法单链表的创建实现
L
插入P前的尾指针 插入P后的尾指针
r
3
4
P1
x^
2
3.3 单链表运算的实现

线性表的链式存储结构实验报告

线性表的链式存储结构实验报告

实验一:线性表的链式存储结构【问题描述】某项比赛中,评委们给某参赛者的评分信息存储在一个带头结点的单向链表中,编写程序:(1)显示在评分中给出最高分和最低分的评委的有关信息(姓名、年龄、所给分数等)。

(2)在链表中删除一个最高分和一个最低分的结点。

(3)计算该参赛者去掉一个最高分和一个最低分后的平均成绩。

【基本要求】(1)建立一个评委打分的单向链表;(2)显示删除相关结点后的链表信息。

(3)显示要求的结果。

【实验步骤;】(1)运行PC中的Microsoft Visual C++ 6.0程序,(2)点击“文件”→“新建”→对话窗口中“文件”→“c++ Source File”→在“文件名”中输入“X1.cpp”→在“位置”中选择储存路径为“桌面”→“确定”,(3)输入程序代码,程序代码如下:head=create(PWRS);printf("所有评委打分信息如下:\n");print(head);//显示当前评委打分calc(head);//计算成绩printf("该选手去掉 1 最高分和 1 最低分后的有效评委成绩:\n");print(head);//显示去掉极限分后的评委打分}void input(NODE *s) #include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <iostream.h>#include <conio.h>#define NULL 0#define PWRS 5 //定义评委人数struct pw //定义评委信息{ char name[6];float score;int age;};typedef struct pw PW;struct node //定义链表结点{struct pw data;struct node * next;};typedef struct node NODE;//自定义函数的声明NODE *create(int m); //创建单链表int calc(NODE *h); //计算、数据处理void print(NODE *h); //输出所有评委打分数据void input(NODE *s);//输入评委打分数据void output(NODE *s);//输出评委打分数据void main(){NODE *head;float ave=0;float sum=0;{printf("请输入评委的姓名: ");scanf("%S",&s->);printf("年龄: ");scanf("%d",&s->data.age);printf("打分: ");scanf("%f",&s->data.score);printf("\n");}void output(NODE *s){printf("评委姓名: %8s ,年龄: %d,打分: %2.2f\n",s->,s->data.age,s->data.score);}NODE *create(int m){NODE *head,*p,*q;int i;p=(NODE*)malloc(sizeof(NODE));head=p;q=p;p->next=NULL;for(i=1;i<=m;i++){p=(NODE*)malloc(sizeof(NODE));input(p);p->next=NULL;q->next=p;q=p;}return (head);}void print(NODE *h){ for(int i=1;((i<=PWRS)&&(h->next!=NULL));i++){h=h->next;output(h); }printf("\n");}int calc(NODE *h){NODE *q,*p,*pmin,*pmax;float sum=0;float ave=0;p=h->next; //指向首元结点pmin=pmax=p; //设置初始值sum+=p->data.score;p=p->next;for(;p!=NULL;p=p->next){if(p->data.score>pmax->data.score) pmax=p;if(p->data.score<pmin->data.score) pmin=p;sum+=p->data.score;}cout<<"给出最高分的评委姓名:"<<pmax-><<"年龄: "<<pmax->data.age<<"分值:"<<pmax->data.score<<endl;cout<<"给出最低分的评委姓名:"<<pmin-><<"年龄: "<<pmin->data.age<<"分值:"<<pmin->data.score<<endl;printf("\n");sum-=pmin->data.score;sum-=pmax->data.score;for (q=h,p=h->next;p!=NULL;q=p,p=p->next){if(p==pmin){q->next=p->next; p=q;}//删除最低分结点if(p==pmax) {q->next=p->next; p=q;}//删除最高分结点}ave=sum/(PWRS-2);cout<<"该选手的最后得分是:"<<ave<<endl;return 1;}实验结束。

数据结构(二):线性表的链式存储结构

数据结构(⼆):线性表的链式存储结构1、为什么要使⽤链式存储结构?因为我们前⾯讲的线性表的顺序存储结构,他是有缺点的。

最⼤的缺点就是插⼊和删除时需要移动⼤量元素,这显然就需要耗费时间。

要解决这个问题,我们就需要分析⼀下为什么当插⼊和删除时,就要移动⼤量元素,因为相邻两元素的存储位置也具有相邻关系,它们在内存中的位置也是挨着的,中间没有空隙,当然就⽆法快速介⼊,⽽删除之后。

当中就会留出空隙,⾃然就需要弥补。

问题就出在这⾥。

为了解决这个问题,⾃然⽽然的就出现了链式存储结构。

2、线性表链式存储结构的特点:线性表的链式存储结构不考虑元素的存储位置,⽽是⽤⼀组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,这就意味着,这些数据元素可以存在内存未被占⽤的任意位置。

顺序存储结构:只需要存储数据元素信息。

链式存储结构:除了要存储数据元素信息之外,还要存储⼀个指⽰其直接后继元素的存储地址。

3、关键词:数据域:存储数据元素信息的域。

指针域:存储直接后继位置的域。

指针或链:指针域中存储的信息。

结点(Node):指针域+数据域组成数据元素的存储映像。

头指针:链表中第⼀个结点的存储位置。

头节点:在单链表的第⼀个结点前附设⼀个结点,成为头结点。

头结点的数据域不可以存储任何信息,可以存储线性表的长度等附加信息,头结点的指针域存储指向第⼀个结点的指针。

4、单链表:定义:n个结点链成⼀个链表,即为线性表的链式存储结构,因此此链表的每个结点中只包含⼀个指针域,所以叫做单链表。

PS:线性链表的最后⼀个结点指针为“空”,通常⽤NILL或“^”符号表⽰。

头节点:在单链表的第⼀个结点前附设⼀个结点,成为头结点。

头结点的数据域不可以存储任何信息,可以存储线性表的长度等附加信息,头结点的指针域存储指向第⼀个结点的指针。

5、头结点与头指针的异同(1)头结点头结点是为了操作的统⼀和⽅便⽽设⽴的,放在第⼀个元素的结点之前,其数据域⼀般⽆意义(也可存放链表的长度)有了头结点,对第⼀元素结点前插⼊和删除第⼀结点,其操作就统⼀了头结点不⼀定是链表的必要素(2)头指针头指针式指向第⼀个结点的指针,若链表有头结点,则是指向头结点的指针。

线性表的链式存储结构

1
线性表的链式存储结构
线性表的链式存储结构是指用一组任意的存储单 元(可以连续,也可以不连续)存储线性表中的数据 元素。为了反映数据元素之间的逻辑关系,对于每个 数据元素不仅要表示它的具体内容,还要附加一个表 示它的直接后继元素存储位置的信息。假设有一个线 性表(a,b,c,d),可用下图2所示的形式存储:
27
p
s
图 2-9
28
完整的算法:
int DuListInsert(DuLinkList *L,int i,EntryType e)
if (L.head->next==NULL) return TRUE; else return FALSE; }
12
6. 通过e返回链表L中第i个数据元素的内容 void GetElem(LinkList L,int i,EntryType *e) {
LNode *p; int j; //j为计数器,记载所经过的结点数目 if (i<1||i>ListLength(L)) exit ERROR; //检测i值的合理性 for (p=L.head,j=0; j!=i;p=p->next,j++); //找到第i个结点 *e=p->data; //将第i个结点的内容赋给e指针所指向的存储单元中 }
10
4. 求链表L的长度
int ListLength(LinkList L)
{
LNode *p;
int len;
for(p=L.head, len=0;p->next==NULL; p=p->next,len++);
return(len);
循环条件表达式 重复执行的语句

数据结构-链表

链表一种数据结构的链接实现是指按链式存储方式构建其存储结构,并在此链式存储结构上实现其基本运算。

线性表的常见链式存储结构有单链表、循环链表和双链表,其中最简单的单链表。

本节讨论单链表的组织方法以及线性表的基本运算在单链表上的实现。

单链表示法的基本思想是用指针表示结点间的逻辑关系。

因此单链表的一个存储结点包含两个部分,结点形式如下:其中,data部分称为数据域,用于存储线性表的一个数据元素。

next部分称为指针域或链域,用于存放一个指针,该指针指向本结点所含数据元素的直接后继所在的结点。

从上述单链表中可以联想到我们生活中的火车,还有一种火车只有火车头。

假设数据元素的类型为Datatype。

单链表的类型定义如下:typedef struct node{Datatype data;struct node * next;} node,* LinkList;struct node表示链表的结点,一个结点是由两个域数据域data和指针域next组成的记录(每个域实际上相当于一个变量),而next本身又是一个pointer类型的指针型变量。

这个定义与上面给出的单链表的结点形式一致。

单链表的简单操作:1、初始化建立一个空表。

空表由一个头指针和一个头结点(该结点同时也是尾结点)组成。

LinkList Initiate_LinkList()/* 建立一空表 */{ LinkLis head;head= malloc(sizeof(node));head -> next = NULL;return head;}2、定位:按值查找。

按从前往后的顺序,依次比较单链表中各表结点数据域的值与给定值X,第一个值与X相等的表结点的序号就是结果。

若没有这样的结点,运算结果为0。

int Locate_LinkList(LinkList head,Datatype x){ Node *p;p = head; /* 置初值 */p=p->next;j = 0; /* 置初值 */while((p!= NULL)&&(p -> data != x)){ p = p -> next;j ++;} /* 未达尾结点又未找到等于x的结点时继续扫描 */if (p -> data == x)return(j+1);elsereturn(0);}3、插入:把新的结点x插入到i结点之前。

数据结构—链表

数据结构—链表链表⽬录⼀、概述1.链表是什么链表数⼀种线性数据结构。

它是动态地进⾏储存分配的⼀种结构。

什么是线性结构,什么是⾮线性结构?线性结构是⼀个有序数据元素的集合。

常⽤的线性结构有:线性表,栈,队列,双队列,数组,串。

⾮线性结构,是⼀个结点元素可能有多个直接前趋和多个直接后继。

常见的⾮线性结构有:⼆维数组,多维数组,⼴义表,树(⼆叉树等)。

2.链表的基本结构链表由⼀系列节点组成的集合,节点(Node)由数据域(date)和指针域(next)组成。

date负责储存数据,next储存其直接后续的地址3.链表的分类单链表(特点:连接⽅向都是单向的,对链表的访问要通过顺序读取从头部开始)双链表循环链表单向循环链表双向循环链表4.链表和数组的⽐较数组:优点:查询快(地址是连续的)缺点:1.增删慢,消耗CPU内存链表就是⼀种可以⽤多少空间就申请多少空间,并且提⾼增删速度的线性数据结构,但是它地址不是连续的查询慢。

⼆、单链表[1. 认识单链表](#1. 认识单链表)1. 认识单链表(1)头结点:第0 个节点(虚拟出来的)称为头结点(head),它没有数据,存放着第⼀个节点的⾸地址(2)⾸节点:第⼀个节点称为⾸节点,它存放着第⼀个有效的数据(3)中间节点:⾸节点和接下来的每⼀个节点都是同⼀种结构类型:由数据域(date)和指针域(next)组成数据域(date)存放着实际的数据,如学号(id)、姓名(name)、性别(sex)、年龄(age)、成绩(score)等指针域(next)存放着下⼀个节点的⾸地址(4)尾节点:最后⼀个节点称为尾节点,它存放着最后⼀个有效的数据(5)头指针:指向头结点的指针(6)尾指针:指向尾节点的指针(7)单链表节点的定义public static class Node {//Object类对象可以接收⼀切数据类型解决了数据统⼀问题public Object date; //每个节点的数据Node next; //每个节点指向下⼀结点的连接public Node(Object date) {this.date = date;}}2.引⼈头结点的作⽤1. 概念头结点:虚拟出来的⼀个节点,不保存数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

插入算法 :
St at us I ns er t L (L i n k L i s t& L , { p = L ; j = 0 ; w h i l e (P & &j < i 一 1 ) {p = p 一 ) n e x t ; j + + ;} i f( P& &j := i 一 1 ) { s = ( L i n k L i s t )m a l l o c( s i z e o f( L N o d e ))

S - > d a t a= e ;s - > n e x t = p 一 > n e x t ;
p - > n e x t : s ;r e t u r n o k ; ) r e t u r n e r r o r ;} ( 二) 删 除。 在一个链表 中存在三个相邻 的数据域分别为 a ,b和 C的结点 ,通过删 除数据元素 b实现数据 元素 a ,b和 C 之间逻辑关系的变化 。 我们只需要改变结点 a中指针 的指 向, 让其指 向结点 c即可 。 假设 P为指 向结点 a的指针 ,则删 除过 程 的语 句为 :q = p 一 > n e x t ;p - > n e x t = q一 > n e x t ;f r e e ( q ) ; 删 除算 法: S t a t u s D e l e t eL (L i n k L i s t& L ,i n t i , E l e m T y p e& e ) { p = L ; j = 0 ;
消费 电子
计 算机科学
C o n s u me r E l e c t r o n i c s Ma g a z i n e 2 0 1 3年 4月 下
浅析线性表的链式存储结构
— —
链表
万 淑 兰
( 1 . 中国海洋大学 ,山东青岛 2 6 6 1 0 0 ;2 . 潍坊科技 学院 ,山 东寿光 2 6 2 7 0 0 ) 摘 要 :线性表是一种线性结构 ,是数据结构 中最常用且最 简单的一种数据结构。采用顺序存 储结构的线性表 称之为顺序表 ,采用链 式存储 结构 的线性表称之为链表。线性表 采用不 同的存储 结构 , 对应 的算法操作过程也不 同, 实现起来效率也就有差异。通 过对线性表 的链式存储 结构进行分析与研究 ,进一步加 深广大学习者对链表 的理解 。 关键词 :线性表 ;数据结构 ;链表 ;存储 结构 中图分类号 :T P 3 3 3 文献标识码 :A 文章编号 :1 6 7 4 — 7 7 1 2( 2 0 1 3 )0 8 — 0 1 0 2 — 0 1
— —
个数据域为 x的结点 。为插入元素 X ,首先要找到指 向结点 a 的指针 P ,然 后再为元 素 x申请 一个存储空问 ,假设 S是指 向 该空 问的地址指针 。实现插入过程 的语 句依 次为 :s 一 ) n e x t = p
> n ex t; p -) ne xt =s;


线性结构
线性表是一种 数据 元素之 间具有 1 : 1的线 性关系的数据 结构,每个线性表都是 由 n个数据元素组成的。 采用顺序存储结构 的线性表称之为顺序表 , 顺序表所具有 的逻辑 结构特 点是 : 用一组地址连续的存储 单元, 依次存储线 性表 中的数据元素 , 逻辑关系上相邻的两个 数据元 素在存储 的 物 理位 置上 一定也要相邻 。因此 , 线性表 的顺序存储 结构是一 种 可 以 随机 存 取 的存 储 结 构 。 顺序表 中任何一个数据元素 a j的存储位置 L O C( a j )都 可 以用一个简单 、直观 的公式:L O C( a j )= L O C( a 1 ) + ( j - 1 ) 木 L 来表示 。 采用链式存储结构 的线性表称之为链表 , 链表所具有 的逻 辑 结构特 点是 : 用一组任意的存储单元来存储线性表 中的数据 元素 , 这些存储 单元 的地 址可 以是连续 的, 也可 以是不连 续的。 二 、链表 ( 一 )链表的相关概念 。在链表 中, 用来表示一个数据元 素 的结构称之为结点 。 每个结点结构都含有两个域 , 一个用来 存储数据元素 自身 的信息 , 称之为数据域 ; 另一个用来存储其 直接后继 的存储位置 , 称之 为指针域 。在链表中,一个数据元 素与其直接后继之间的逻辑关系 , 是通过指针域 中存储 的信息 指针来实现 的。 为 了便于操作, 有 时在单链表 的第一个结 点之前增加一个被称为头结点的结点 。 链表 中的每个结点结构 中都只含一个指针域 ,所 以称其为单链表 。 ( 二) 链表的结构 。 链表 是一种常见 的且动态分配存储空 间的数据结构 。当用静态的数组来存放数据 时, 我们必须事先 预定义一定 的、 足够大的空间, 以便能存放足够多的数据元素 。 链表则不需要预定义一定 的空间 , 它是根据 需要开辟 内存空 间

w h i l e (p - > n e x t& &j < i 一 1 )
{ p = p 一 > n e x t ; j + + ; ) i f (! (p - ) n e x t l j > i — 1 )r e t u r n e r r o r ;
q = p 一 > n e x t ;p - > n e x t = q 一 > n e x t ;
的。
ቤተ መጻሕፍቲ ባይዱ
e = q 一 > d a t a ;f r e e ( q ) ; r e t u r n o k ;} 综上所述 ,在链表 中某一指定位置插 入一个元素或删 除
头指针是用来存放第一个数据元素的存储地址 的, 它代表 了整个单链表 的开始 , 因此, 在单链表 中读取每个数据元素时 , 必须从它 开始 。 最后一个数据元素之后不再有其它元素, 它代 表 了整个单链表 的结束 , 因此称它为尾结点。 在单链表 中要找 到某一个数据元素 , 必须先找到它的直接前驱, 所 以线性表 的 链式存储结构是一种顺序存取的存储结构。 由此可 见,如果没有头指针 ,则整个链条都将无法访问 。 所 以单链表是 由头指针唯一确定 的。 ( 三 )链表 的分类 。( 1 )单向链表 。在单 向链表 中,每个 结点包含两个域 ,一个是数据域 ,一个是指针域。( 2 )双 向链 表 。在双 向链表 中,每个结点都包含三个域,一个 是数据域 , 另外 两个 是指针域 , 其 中一个指 向其直接后继 , 另一个指 向其 直接前驱 。( 3 )循环链表 。链表中 的首尾结点相连接 ,则从链 表 中任意一个结 点出发 , 都能访 问到链表中的所有结点, 它 的 结构特 点是最后一个结点 的指针域指 向头结点 , 使整个链表形 成一个环 。双 向循环链表也有循环结构 。 三、链表 的基本操作 ( 一) 插入 。 假设在一个链表中存在两个相邻 的数据域分 别 为 a和 b的结 点 , 则 通 过 插 入 操 作 实现 在 a 和 b 之 间插 入 一
相关文档
最新文档