第02章_线性表B

合集下载

第 2 章 线性表

第 2 章 线性表
2.4 线性表实现方法的比较 2.5 循环链表 2.6 双链表 2.7 *静态链表 (*2.8 算法设计举例)
2020/1/28
5
线性表(Linear List)定义
定义: n个具有相同特性的数据元素组成 的有限序列;
表示:(a1,…,ai-1,ai,ai+1,…,an) ai必须具有相同特性,即属于同一数据对
C
2020/1/28
7
抽象数据类型定义
ADT List{
数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R={<ai-1,ai>|ai,ai-1∈D,i=2,…,n} 基本操作:
1. ListInit (L) ; 2. ListLength (L) ;
3. ListGet(L,i) ;
// LA和LB是顺序存储的线性表,元素按非递减有序排列,本算法将 LB合并到LA中,元素仍非递减有序 {m=st; n=st;//m,n分别为线性表LA和LB的长度。 k=m+n-1; //k为结果线性表的工作指针(下标) i=m-1;j=n-1;//i,j分别为线性表LA和LB的工作指针(下标) while (i>=0 && j>=0) if (LA.data[i]>=LB.data[j]) LA.data[k--]=LA.data[i--]; else LA.data[k--]=LB.data[j--]; while (j>=0) LA.data[k--]=LB.data[j--]; st=m+n; }
象 ai-1是ai的直接前驱元素,ai+1是ai的直接后
继元素 数据元素ai在线性表中有确定的位置i,i称

数据结构第二章:线性表

数据结构第二章:线性表
实现逻辑上相邻—物理地址相邻 实现逻辑上相邻— 实现随机存取 实现随机存取
实现:可用C 实现:可用C语言的一维数组实现
6
V数组下标 0 1
内存 a1 a2
元素序号 1 2
typedef int DATATYPE; #define M 1000 DATATYPE data[M]; 例 typedef struct card { int num; char name[20]; char author[10]; char publisher[30]; float price; }DATATYPE; DATATYPE library[M];
4
{加工型操作 加工型操作} 加工型操作
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, &e ) 初始条件:线性表L已存在,1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值同 e 的值 ListInsert( &L, i, e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)+1。 操作结果:在 L 的第 i 个元素之前插入新的元素 e,L 的长度增1。 ListDelete( &L, i, &e ) 初始条件:线性表 L 已存在且非空,1≤i≤LengthList(L)。 操作结果:删除 L 的第 i 个元素,并用 e 返回其值,L 的长度减1。 }ADT LIST
3
PriorElem( PriorElem L, cur_e, &pre_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 pre_e 返回 它的前驱,否则操作失败,pre_e 无定义。 NextElem( NextElem L, cur_e, &next_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返 回它的后继,否则操作失败,next_e 无定义。 GetElem( GetElem L, i, &e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)。 操作结果:用 e 返回 L 中第 i 个元素的值。 LocateElem( LocateElem L, e, compare( ) ) 初始条件:线性表 L 已存在,compare( ) 是元素判定函数。 操作结果:返回 L 中第1个与 e 满足关系 compare( ) 的元 素的位序。若这样的元素不存在,则返回值为0。 ListTraverse(L, visit( )) ListTraverse 初始条件:线性表 L 已存在,visit( ) 为元素的访问函数。 操作结果:依次对 L 的每个元素调用函数 visit( )。 一旦 visit( ) 失败,则操作失败。

第二章线性表(DOC)

第二章线性表(DOC)

第二章线性表线性结构:在数据元素的非空集中,①存在唯一的一个首元素,②存在唯一的一个末元素,③除首元素外每个元素均只有一个直接前驱,④除末元素外每个元素均只有一个直接后继。

第一节逻辑结构形式定义:Linear_list=(D,S,P)D = {a i| a i∈ElemSet, i=0,1,2,…,n-1}S = {<a i-1,a i>| a i-1,a i∈D, i=1,2,…,n-1}<a i-1,a i>为序偶,表示前后关系基本操作P:①插入、删除、修改,存取、遍历、查找。

void ListAppend(List L, Elem e) ;void ListDelete(List L, int i) ;int SetElem(List L, int i, Elem e);int GetElem(List L, int i, Elem &e);int ListLength(List L);void ListPrint(List L);int LocateElem(List L, Elem e);②合并、分解、排序基本操作的用途:集合的并、交、差运算有序线性表的合并、多项式的运算例:利用线性表LA和LB分别表示集合A和B,求A=A∪B。

void union(List &La,List Lb){ int La_len, Lb_len;La_len=ListLength(La); // 计算表长Lb_len=ListLength(Lb);for(i=1; i<=Lb_len; i++){ GetElem(Lb, i, e); // 取Lb的第i个元素 if(!LocateElem(La, e)) // 在La中查找eListAppend(La, e); // 在La中插入e}}第二节顺序存储结构一、概念逻辑结构中的“前后关系”:物理结构中的“相邻关系”loc(a i)=loc(a0)+i*sizeof(单个数据元素)静态顺序存储结构:一维数组。

第2章 线性表(链表)

第2章  线性表(链表)

}
4.判线性表是否为空表ListEmpty(L)
若单链表L没有数据结点,则返回1,否则返回0。
int ListEmpty(LinkList *L)
{
return(L->next==NULL); }
5.求线性表的长度ListLength(L)
返回单链表L中数据结点的个数。
int ListLength(LinkList *L) { LinkList *p=L->next;int i=0; while (p!=NULL)
第三步:尾插法链接结点
r->next=s; r=s;
• 再循环23步骤直到n个结点完成插入
r
L
s
r
头结点
a
void CreateListR(LinkList *L,ElemType a[],int n) { LinkList *s,*r;int i; r=L; for (i=0;i<n;i++) { s=(LinkList *)malloc(sizeof(LinkList)); /*创建新结点*/ s->data=a[i]; r->next=s; /*将*s插入*r之后*/ r=s; } r->next=NULL; /*终端结点next域置为NULL*/ }
存储结点包含 数据域:所有存元素本身的信息;
指针域:元素之间逻辑关系的信息;包含有后 继结点的地址信息。
2个问题 如何构造链表数据类型? 链表上可进行什么基本操作?
解决第一个问题---如何构造链表数据类型
在每个结点中除包含有数据域外,只设置一个指针域, 用以指向其后继结点,这样构成的链接表称为线性单 向链接表,简称单链表;
{ s=(LinkList *)malloc(sizeof(LinkList));

第2章线性表

第2章线性表

17图2.1 线性表的逻辑结构第2章线性表2.1 线性表的逻辑结构线性表(Liner_List )是最常用和最简单的一种数据结构,定义为具有n(n ≥0)个元素的有限序列。

它的特点是:除首元素和尾元素外,均有一个前趋和一个后继(首元素只有一个后继,尾元素只有一个前趋)。

这n 个元素是同类型元素,可以是一个字母、一个数字等等。

线性表的抽象数据类型定义一个抽象数据类型定义了一个模型,但不涉及模型的具体实现问题。

线性表的抽象数据类型定义如下:ADT liner-list{数据元素:D ={a i | a i ∈elemset i=1..n (n ≥0)}数据关系:S ={<a i-1,a i >| a i-1,a i ∈D i=2..n (n ≥) = 基本操作:(1) InitList(L)L 是没有初始化的线性表, 为L 开辟空间并将L 置为空表。

(2) DestroyList(L)线性表L 已存在, 将L 存储空间释放。

(3) ClearList(L)线性表L 已存在, 将表L 置为空表。

(4) emptyList(L)线性表L 已存在, 如果L 为空表则返回真否则返回假。

(5) ListLength(L)线性表L 已存在, 如果L 为空表则返回0,否则返回表中的元素个数。

(6) Locate(L ,e)表L 已存在,e 为线性表中元素或与之同型元素, 如果L 中存在元素e ,则返回元素e 所在位置,如果L 中不存在元素e ,则返回0。

(7) Getelem(L ,i)表L 存在,i 为整数,i 值合法,即1<i<ListLength(L)。

返回线性表L 中第i 个元素的值。

否则提示出错。

(8) InsertList(L ,i ,e)表L 已存在,e 的数据类型同线性表中数据元素,且1<i<ListLength(L)+l,在L 中第i 个位置前插入新的数据元素e ,现行表L 的长度加1。

第2章线性表

第2章线性表

插入过程说明
在顺序表中,结点的物理顺序必须和结点的逻辑顺 序保持一致,因此必须将表中位置为n ,n-1,…,i 上的结点,依次后移到位置n+1,n,…,i+1上, 空出第i个位置,然后在该位置上插入新结点x。仅 当插入位置i=n+1时,才无须移动结点,直接将e插 入表的末尾。
插入算法
#define OK 1 #define ERROR 0 void InsertList(SeqList *L,ElemType e,int i) {//将新结点 x插入L所指的顺序表的第i个结点的位置
第2章 线性表
概述
线性表是最很简单也是最重要的数据结构, 它是线性结构。所以我们学习数据结构从线 性表开始。从本章开始到第四章都是讨论线 性。是整个数据结构的基础
按逻辑结构 、存储结构、算法设计这三个顺 序进行分析。
2.1线性表的逻辑结构
线性表(Linear List)是由n(n≥0)个数据元素(结 点)a1,a2,…,an组成的有限序列。
L->last--;
//表长减小
return OK; }
时间复杂度
Ede(n)=(n-1)/2 所以平均时间复杂度为O(n)
3. 查找操作
按序号查找 GetData(L,i) return L.elem[i-1];
按内容查找 Locate(L,e)
Locate(L,e)
int Locate(SeqList L,ElemType e) { int i=0;
7. GetData(L,i)
操作前提:表L已存在,且i值 合法,返 回线性表L中第i个元素的值。
8. InsList(L,i,e)
在线性表L的第i个位置上插入一个元素e,i+1,…, n的结点变为编号为i+1,i+2,…,n+1的结点。这 里1≤i≤n+1,而n是原表L的长度。插入后,表L的长 度加1。

第2章线性表顺序表


1)
n
n 1 i1
2
T n On
3.删除运算
线性表的删除是指将第i(1≤i≤n)个元素删除,使长度为 n的线性表:
a 1 , a 2 , , a i 1 , a i , a n
变成长度为n-1的线性表:
a 1 , a 2 , , a i 1 , a i 1 , a n
第2章 线性表
2.1 线性表的逻辑结构
2.1.1 线性表的定义
1、定义:线性表是相同数据类型的n个数据元素的有限序列。 A=(a1,a2,…ai,ai+1,……,an) a1为第一个元素,称表头元素; an为最后一个元素,称表尾元素; n 表示线性表A的长度,当n=0时,表示A是空表。 当1<i<n时: ai的直接前驱是ai-1,a1无直接前驱。 ai的直接后继是ai+1,an无直接后继。
if(L->data[i]<x ) {y= L->data[i];
【例2.1】以a1为基准将顺序表分为两个部分
for(j=i-1;j>=0;j--) L->data[j+1]= L->data[j];
L->data[0]=y; } }
最坏情况下时间渐进复杂度为O(n2)
【例2.2】求顺序表A、B的并集C。
LOC(a1)+(i-1)*L
2. 顺序表的特点
(3)线性表顺序存储的特点 1) 逻辑上相邻的数据元素,其物理地址 也相邻,即用物理上的相邻表示逻辑 上的相邻。 2) 实现随机存取
3. 顺序表的结构定义
(4)线性表的顺序存储结构的描述
#define Max 1000 typedef int DataType; typedef struct

第2章 线性表

第二章 线性表基本概念:1、线性结构的特点2、线性表的概念3、线性表的顺序存储和链式存储以及它们各自的特点。

4、顺序表的基本操作(插入、删除算法、插入、删除的元素移动次数)5、链表的基本操作:(1)单链表的插入和删除(2)循环链表的插入和删除(3)双向循环链表的插入和删除(4)链表为空的判断条件(有头单链表、无头单链表、循环链表)(5)判定已到链表尾部的条件(单链表、循环链表)6、各个算法的时间复杂度分析讲课提要【主要内容】1.线性表的概念和基本运算2.顺序表(线性表的顺序存储结构)3.链表(线性表的链式存储结构)(1)单链表和循环单链表(2)双向链表和循环双链表4.线性表应用(1)栈(2)队列【教学目标】1.了解线性表的概念及其常用运算2.熟悉顺序表的结构及基本算法描述3.掌握单链表的结构及基本算法描述,了解双向链表及循环链表4.掌握栈和队列的结构特点及其插入和删除算法5.了解栈在程序设计中的实际应用学习指导1.线性表的定义线性表是n个数据元素的有限序列,其中n(n≥0)为线性表的长度。

线性表中各个元素的类型相同。

对于线性表(a1,a2,…,a i,…,a n)而言,数据元素a1没有直接前趋,a n没有直接后继,表中的其它元素a i(2≤i≤n-1)有且仅一个直接前趋a i-1和直接后继a i+1。

2.顺序表顺序表是指线性表的顺序存储结构,即用一组连续的存储单元依次存放线性表的数据元素。

在C语言中可用一维数组来表示。

在顺序表中,以数据元素在计算机内“物理位置相邻”来表示表中数据元素间的逻辑关系。

顺序表是一种随机存储结构,只要确定了存储顺序表的起始位置,则表中任一元素都可以随机存取。

所以在顺序表中可以方便的进行数据元素的查找及存取。

但是在进行插入和删除操作时,将会引起元素的大量移动,因而效率比较低,并且易产生空间浪费或“上溢”现象。

顺序表的操作还应注意元素的存储位置,即数组下标(C语言中下标从0开始)。

2第二章 线性表


定义:将线性表中的元素相继存放在一个
连续的存储空间中。
2.2线性表的顺序表示和实现 -顺序存储结构
存储结构:数组。 特点:线性表的顺序存储方式。 存取方式:顺序存取 顺序存储结构示意图
0 1 2 3 4 5
45 89 90 67 40 78
顺序存储结构:
设: l :每个数据元素占用l个存储单元 LOC(a i) : a i的存储位置 LOC(a i+1) = LOC( a i )+l LOC(a i) = LOC(a1)+(i-1)*l
顺序表的删除操作
0 1 2

a0 a1 a2

0 1 2

a0 a1 a2

i-1 i i+1

ai-1 ai ai+1

i-1 i i+1

ai-1 ai+1 ai+2

num
anum 图2-6 在数组 中删除元素
num
anum
【算法 顺序表的删除】
Status ListDelete_Sq(SqList &L,int i,ElemType &e){ //在顺序表L中删除第i个元素,并用e返回其值, //i的合法值为1<=i<=ListLength_Sq(L) if (i<1||i>L.length) return ERROR //i值不合法 p=&(L.elem[i-1]); //p为被删除元素的位置 e=*p; //被删除元素的值赋给e q=L.elem+L.length-1; //表尾元素的位置 for(++p;p<=q;++p) *(p-1)=*p; //被删除元素之后的元素左移 --L.length; //表长减1 return OK; }//ListDelete_Sq

线性表答案

第2章线性表一选择题1.下述哪一条是顺序存储结构的优点?( A )A.存储密度大 B.插入运算方便 C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示2.下面关于线性表的叙述中,错误的是哪一个?( B )A.线性表采用顺序存储,必须占用一片连续的存储单元。

B.线性表采用顺序存储,便于进行插入和删除操作。

C.线性表采用链接存储,不必占用一片连续的存储单元。

D.线性表采用链接存储,便于插入和删除操作。

3.线性表是具有n个( C )的有限序列(n>0)。

A.表元素 B.字符 C.数据元素 D.数据项 E.信息项4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用( A )存储方式最节省时间。

A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( D )存储方式最节省运算时间。

A.单链表 B.仅有头指针的单循环链表 C.双链表D.仅有尾指针的单循环链表6.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( D )最节省时间。

A. 单链表B.单循环链表C. 带尾指针的单循环链表D.带头结点的双循环链表7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。

则采用( D )存储方式最节省运算时间。

A.单链表 B.双链表 C.单循环链表 D.带头结点的双循环链表8. 静态链表中指针表示的是( BC ).A.内存地址 B.数组下标 C.下一元素地址D.左、右孩子地址9. 链表不具有的特点是( C )A.插入、删除不需要移动元素 B.可随机访问任一元素表4s→供选择的答案:A.连续B.单向链接C.双向链接D.不连接E.循环链接F.树状G.网状H.随机I.顺序J.顺序循环12.(1) 静态链表既有顺序存储的优点,又有动态链表的优点。

所以,它存取表中第i个元素的时间与i无关。

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

H ZHAO QIAN SUN LI
ZHOU
WU
ZHENG
WANG /\
头结点不计入 链表长度!
10
区别:① 无头结点
② 有头结点
2.3.1 链表的表示
例2: 线性表具有两种存储方式,即顺序方式和链接方式。现有一个 具有五个元素的线性表L={23,17,47,05,31}, 若它以链接方式存储在下列100~119号地址空间中,每个结点由 数据(占2个字节)和指针(占2个字节)组成,如下图所示。 其中指针X,Y,Z的值分别为多少?该线性表的首结点起始 地址为多少?末结点的起始地址为多少? 05 U 17 X 23 V 31 Y 47 Z
a1
a2
……
an
head
2.3.1 链表的表示
6
4)头指针、头结点和首元结点的区别 示意图如下: head
info
a1
a2

an
^
头指针
头结点
首元结点
头指针是指向链表中第一个结点(或为头结点、或为首元 结点)的指针; 头结点是在链表的首元结点之前附设的一个结点;数据域 内只放空表标志和表长等信息,它不计入表长度。 首元结点是指链表中存储线性表第一个数据元素a1的结点。
for (i=0; i<n; i++){
s = (LinkList *) malloc (sizeof(LinkList)); //创建新结点 s->data = a[i]; s->next = L->next; //将*s插入在首结点之前、头结点之后 L->next = s; } }
本算法的时间复杂度为O(n)
该字母表在内存中链式存放的样式举例如下:
讨论1 :每个存储结点都包含两部分:数据域和 指针域(链域) 。 讨论2:在单链表中,除了首元结点外,任一结点的存储位置 由 其直接前驱结点的链域的值 指示。
2.3.1 链表的表示 5
(2) 与链式存储有关的术语: 1)结点:数据元素的存储映像。由数据域和指针域两部分组成; 2)链表: n个结点由指针链组成一个链表。它是线性表的链式存 储映像,称为线性表的链式存储结构。 3)单链表、双链表、多链表、循环链表: • 结点只有一个指针域的链表,称为单链表或线性链表; • 有两个指针域的链表,称为双链表(但未必是双向链表); • 有多个指针域的链表,称为多链表; • 首尾相接的链表称为循环链表。 循环链表示意图: head
的首地址;
free(p) ——释放指针p所指变量的存储空间,即彻底删除
一个变量。
2.3.1 链表的表示
13
p
data
*next
sizeof(x)——计算x的长度 malloc(m) —开m字节空间 free(p) ——删除一个变量
node,长度为m字节 问1:自定义结构类型node的长度m是多少? m=sizeof(node)
L
a1
a2
an ∧
如何具体编程来建立和访问链表? ——链表的实现和操作
16
1. 单链表的建立
采用头插法建立单链表:该方法从一个空表开始,读取线 性表中的元素,生成新结点*s,将读取的数据存放到新结 点的数据域中,然后将新结点插入到当前链表的表头,即 头结点之后,直到结束为止。
s
ai
每次将s所指结点插在最前端
2.3 线性表的链式表示和操作 2
2.3 线性表的链式表示和操作
2.3.1 链表的表示
2.3.2 链表的操作
2.3.3 链表的运算效率分析
2.3 线性表的链式表示和操作 Nhomakorabea3
2.3.1 链表的表示
(1)
链式存储结构特点:
其结点在存储器中的位臵是随意的,即逻辑上相邻的数据元 素在物理上不一定相邻。 如何实现? 通过指针来实现!
2.3.1 链表的表示
7
讨论1. 在链表中设臵头结点有什么好处? 答:头结点即在链表的首元结点之前附设的一个结点,该结
点的数据域可以为空,也可存放表长度等附加信息,其作用是 为了对链表进行操作时,可以对空表、非空表的情况以及对首 元结点进行统一处理,编程更方便。
讨论2. 如何表示空表? 答:无头结点时,当头指针的值为空时表示空表; 有头结点时,当头结点的指针域为空时表示空表。
第2章 线性表
2.1 线性表的逻辑结构
2.2 线性表的顺序表示和操作
2.3 线性表的链式表示 2.4 单链表 2.4 双链表 2.5 循环链表
2.3 线性表的链式表示和操作 1
回顾:2.2 线性表的顺序表示和操作 线性表顺序存储结构
特点:逻辑关系上相邻的两个元素在物理存储位臵上 也相邻;
优点:可以随机存取表中任一元素,方便快捷;O(1) 缺点:在插入或删除某一元素时,需移动大量元素O(n) 解决问题的思路:改用另一种线性存储方式: 链式存储结构
int m=sizeof(node); /*结构类型定义好之后,每个node类型的长 度就固定了,m求一次即可*/
2.3.2 链表的操作
22
void build( ) //字母链表的生成。要一个个慢慢链入 { int i; head=(node*)malloc(m); //m=sizeof(node) 前面已求出 p=head; for( i=1; i<26; i++) { //因尾结点要特殊处理,故i≠26 p->data=i+‘a’-1; // 第一个结点值为字符a p->next=(node*)malloc(m); //为后继结点“挖坑”! p=p->next;//让指针变量P指向后一个结点 } p->data=i+‘a’-1; //最后一个元素要单独处理 p->next=NULL; //单链表尾结点的指针域要臵空! 新手特别容易忘记!! }
//单位是字节
问2:结构变量node的首地址(指针p)是多少?
p=(node*)malloc(m)
P->data=‘a’; p->next=q
问3:怎样删除结构变量node?
free(p) //只能借助node的指针删除!
2.3.1 链表的表示 14
单链表的抽象数据类型描述如下(参见教材P28):
让每个存储结点都包含两部分:数据域和指针域
样式:
数据
指针

指针
数据
指针
数据域:存储 元素数值数据
指针域:存储直接后继或 者直接前驱的存储位臵
设计思想:牺牲空间效率换取时间效率
2.3.1 链表的表示 4
链表存放示意图如下: head a1 a2 …… an
/\
例:请画出26 个英文字母表的链式存储结构。 解:该字母表的逻辑结构为:( a, b, … ,y, z)
头指针
^
头指针
头结点 ^
头结点不计入链 表长度!
8
无头结点
有头结点
2.3.1 链表的表示
(3)举例 例1:一个线性表的逻辑结构为:
(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存储结构用 单链表表示如下,请问其头指针的值是多少?
存储地址 1 7 13 19 25 31 37 43
2.3.2 链表的操作 23
void display() //字母链表的输出 { sum=0; p=head; while (p) {//当指针不空时循环(仅限于无头结点的情况) printf("%c",p->data); p=p->next; //让指针不断“顺藤摸瓜” } sum++; } 讨论:要统计链表中数据元素的个数,该如何改写?
18
1. 单链表的建立
采用尾插法建立单链表:该方法将新结点插到当前链表的 表尾上,为此必须增加一个尾指针r,使其始终指向当前 链表的尾结点。
s
r L
a1 aj ∧
ai
每次将s所指结点链到末尾
19
采用尾插法建立单链表的算法:
void CreateListR(LinkList *&L, ElemType a[], int n) { LinkList *s; int i; L = (LinkList *)malloc(sizeof (LinkList) ); //创建头结点 r = L; // r始终指向终端节点,开始时指向头节点 for (i=0; i<n; i++){ s = (LinkList *) malloc (sizeof(LinkList)); //创建新结点 s->data = a[i]; s->next = NULL; r->next = s; //将*s插入在*r之后 r = s;
数据域 LI QIAN SUN WANG WU ZHAO ZHENG ZHOU
指针域 43 13 1 NULL 37 7 19 25
2.3.1 链表的表示
答:头指针是指向链表 中第一个结点的指针, 因此关键是要寻找第一 个结点的地址。
H 31 ZHAO 7
称:头指针H的值是31
9
上例链表的逻辑结构示意图有以下两种形式: ①
100
答:X=
104
108
Y= NULL/0
112
Z=
116
119
, 。
11
116
100
首址= 108
末址= 112
2.3.1 链表的表示
讨论: 链表的数据元素有两个域,不再是简单数据 类型,编程时该如何表示?
答: 因每个结点至少有两个分量,且数据类型通常不一致,所 以要采用结构数据类型。 以26个字母的链表为例,每个结点都有两个分量: p q ‘a’ ‘b’ 字符型 指针型
相关文档
最新文档