版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章线性表第2
页线性表的基本概念线性表的顺序表示和实现线性表的链式表示和实现线性表应用实例2.1线性表的基本概念第3
页线性表是类型相同的数据元素的有限序列。记作:(a1,...,ai-1,ai,ai+1,…,an)线性表特点:在数据元素的非空有限集中存在唯一的一个被称作“第一个”的数据元素。存在唯一的一个被称作“最后一个”的数据元素。除第一个外,集合中的每个数据元素均只有一个前驱。除最后一个外,集合中的每个数据元素均只有一个后继。2.1线性表的基本概念第4
页设
A=(a1,
a2,
...
,
ai-1, ai
, ai+1,
…, an)是线性表:1)线性表的数据元素可以是各种各样的,但同一线性表中的元素必须是同一类型的;在表中ai-1领先于ai,ai
领先于ai+1,称ai-1
是ai的直接前趋,ai+1
是ai
的直接后继;在线性表中,除第一个元素和最后一个元素之外,其他元素都有且仅有一个直接前趋,有且仅有一个直接后继。线性表是一种线性数据结构;元素的个数n
称为表的长度。n=0时称为空表;ai是表的第i个元素,称i为数据元素ai
的序号,每个元素在线性表中的位置,仅取决于它的序号。可在表的任意位置进行插入和删除操作。2.1线性表的基本概念第5
页对线性表的ADT描述ADT
List
{数据对象:D
=
{
ai
|
ai
˛ElemSet,
i=1,…,n,n≥0
}数据关系:R1
=
{
<ai-1,
ai>
|
ai-1,ai
˛
D,
i=2,
…,n
}基本操作:InitList
(&L)操作结果:构造一个空的线性表L。DetroyList
(&L)初始条件:线性表L已经存在。操作结果:销毁线性表L。......}
ADTList2.1线性表的基本概念第6
页对线性表的基本操作初始化操作InitList
(&L)功能:建立空的线性表L;销毁操作DetroyList
(&L)功能:回收为线性表L动态分配的存储空间;置空操作ClearList
(&L)功能:L中已存在,重新将其置成空表;判空操作ListEmpty
(L)功能:判断线性表L是否为空表,若为空表返回TRUE,否则返回FALSE;求表长操作ListLength
(L)功能:返回线性表L的表长;2.1线性表的基本概念第7
页取元素操作:GetElem(L,i,&e)功能:将线性表L中第i个元素赋值给e;查找操作LocateElem(L,e,compare())功能:在线性表L中查找与元素e满足compare()的第1个元素,返回该元素在表中的序号(或位置),若表中不存在这样的元素,则返回0;查找前驱PriorElem(L,cur_e,&pre_e)功能:若cur_e是L中的数据元素且不是第一个,则用pre_e返回它的前驱;否则失败,pre_e无定
义。2.1线性表的基本概念第8
页查找后继NextElem(L,cur_e,&next_e)功能:若cur_e是L中的数据元素且不是最后一个,则用next_e返回它的后继;否则失败,next_e无定义。插入操作ListInsert(&L,i,e)功能:在线性表L的第i个元素之前插入1个新元素e;删除操作ListDelete(&L,i,&e)功能:删除线性表L的第i个元素,并用e返回;遍历操作ListTraverse(&L,visit())功能:依次对线性表L的每个元素调用函数visit()。若visit()失败,则返回ERROR,否则返回OK;2.1线性表的基本概念第9
页说明1、基本操作是一种数据结构中最常见的操作,它具有明确的逻辑意义。2、可以将基本操作看成一个整体,使用基本操作来解决新的问题,设计新的算法。使我们可以在更高的层次上进行抽象,在更高的基础上进行设计。3、在算法的程序实现的过程中,基本操作需要通过编制公共函数进行具体实现。可以为基本操作建立公共函数库。2.1线性表的基本概念第10
页利用基本操作进行算法设计例1:若有两个集合A和B
分别用两个线性表LA
和LB
表示,即:线性表中的数据元素即为集合中的成员。现要求一个新的集合:A=A∪B。问题分析上述问题可以演绎为:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA
中去。2.1线性表的基本概念第11
页利用基本操作进行算法设计从线性表LB中依次察看每个数据元素;
GetElem(LB,
i)→e依值在线性表LA中进行查访;
LocateElem(LA,e,equal())若不存在,则插入之。
ListInsert(LA,
n+1,e)2.1线性表的基本概念第12
页利用基本操作进行算法设计void
union
(
List
&La, List
Lb
)
{La_len=ListLength
(La);
//求线性表的长度Lb_len
=
ListLength
(Lb);for
(
i
=
1; i
<=
Lb_len; i++
)
{GetElem(Lb,
i,
e);
//取Lb中第i个数据元素赋给eif(!LocateElem(La,
e,
equal()))ListInsert
(
La,
++La_len,
e
);//La中不存在和e
相同的数据元素,则插入}}
//
union2.1线性表的基本概念例2-1:假设有一个非纯集合B,要构造一个纯集合A。使A中只包含B
中所有值各不相同的数据元素。问题分析:采用线性表表示集合集合
B
集合A算法策略:从集合B
取出物件放入集合A。要求集合A
中同样的物件不能有两件以上。第13
页2.1线性表的基本概念第14
页利用基本操作进行算法设计void
union(List
&La, List
Lb) {InitList
(La);
//构造(空的)线性表LALa_len=ListLength
(La); Lb_len=ListLength
(Lb);for
(
i
=
1; i
<=
Lb_len; i++
)
{GetElem(Lb,
i,
e);
//取Lb中第i个数据元素赋给eif(!LocateElem(La,
e,
equal()))ListInsert
(
La,
++La_len,
e
);//La中不存在和e
相同的数据元素,则插入}}
//
union2.1线性表的基本概念例2-2:假设一个有序的非纯集合B,试构造一个纯集合A,使A中只包含B
中所有值各不相同的数据元素。问题分析:采用有序表表示集合有序表:若线性表中的数据元素相互之间可以比较,并且数据元素在线性表中依值非递减或非递增有序排列,即:第15
页ai≥ai-1或
ai≤ai-1
(i=2,3,…,n)则称该线性表为有序表(Ordered
List)。2.1线性表的基本概念第16
页例如:集合B(2,3,3,5,6,6,6,8,12)对集合B而言,值相同的数据元素必定相邻;对集合A
而言,数据元素依值从小至大的顺序插入。因此,数据的逻辑结构改变了,解决问题的策略也要相应进行调整。2.1线性表的基本概念!
LocateElem
(
La,
e,
equal(
)
)}
//La中不存在和e
相同的数据元素,则插入}}
//
purge利用基本操作进行算法设计void
purge
(
List
&La,
List
Lb
)
{InitList(La);
La_len=ListLength(La);
Lb_len=ListLength(Lb);
//求线性表的长度for
(
i
=
1; i
<=
Lb_len; i++
)
{GetElem(Lb,i,
e);//取Lb中第i个数据元素赋给eif
(
ListEmpty(La)
||
!
equal
(en,
e)
)
{ListInsert
(
La,
++La_len,
e
);第17
页en
=
e;2.2线性表的顺序表示与实现线性结构的顺序表示是指使用一组地址连续的存储单元依次存储线性表的数据元素。线性表的起始地址,称作线性表的基地址a1a2…ai-1ai…an线性表元素之间的逻辑关系,通过元素的存储顺序反映(表示)出来;第18
页假设:线性表中每个数据元素占用k个存储单元,那么,在顺序存储结构中,线性表的第i个元素的存储位置与第1个元素的存储位置的关系:Loc
(
ai
)
=
Loc
(
a1
)
+
(i
–
1)
·
k2.2线性表的顺序表示与实现线性表的顺序表示bb+kb+(i-1)kb+(n-1)kb+(maxlen-1)k12i存储地址内存状态元素位序n…………空闲第19
页a1a2…ai…an…顺序表的特点用连续的存储单元存放线性表的元素(采用一维数组存放)。元素存储顺序与元素的逻辑顺序一致。读写元素方便,通过下标即可指定位置。2.2线性表的顺序表示与实现第20
页顺序表的类型定义#define
LIST_INIT_SIZE
100// 线性表存储空间的初始分配量#define
LISTINCREMENT
10//线性表存储空间的分配增量typedef
struct
{ElemType *
elem;intintlength;listsize;//线性表存储空间基址//当前线性表长度//当前分配的表空间大小//(以sizeof(ElemType)为单位)}SqList;2.2线性表的顺序表示与实现假设:A
=(a1,a2,a3,...,an)是一个线性表,
L是SqList类型的结构变量,用于存放线性表A。存放线性表元素的一维数组顺序表通过
元素的存储顺序反映线性表元素间的逻辑关系a1a2ai-1aiai+1an01i-2i-1in-199L.elemL.lenghtL.listsizen100第21
页2.2线性表的顺序表示与实现顺序表基本操作的算法初始化操作InitList_Sq(SqList
&L)功能:建立空的顺序表L参数:L:顺序表01...i...99L.elemL.lenghtL.listsize0100第22
页2.2线性表的顺序表示与实现第23
页初始化操作InitList_Sq(SqList
&L)Status
InitList_Sq
(
SqList
&L
){//构造一个空的顺序表LL.elem=(ElemType
*)malloc(LIST_INIT_SIZE
*sizeof(ElemType));if
(
!L.elem
)exit
(
OVERFLOW
);L.length=0;
//空表长度为0L.listsize=LIST_INIT_SIZE;return
OK;}
//InitList_Sq2.2线性表的顺序表示与实现顺序表基本操作的算法销毁操作DetroyList_Sq(SqList
&L)功能:销毁顺序表L01...i...99L.elemL.lenghtL.listsize0100NULL第24
页002.2线性表的顺序表示与实现第25
页销毁操作DetroyList_Sq(SqList
&L)Status
DetroyList_Sq
(
SqList
&L){ free
(L.elem);L.elem
=
NULL;L.length
=
0;L.Listsize
=
0;return
OK;} //DetroyList_Sq2.2线性表的顺序表示与实现第26
页插入操作定义:线性表的插入是指在长度为n
的线性表的第i(1
£
i
£
n+1)个元素之前插入一个新的数据元素x:A=(a1,a2,...,ai-1, ai
, ai+1,…,
an)从而使线性表的长度变为n+1:A
=(a1,
a2,
...
,
ai-1,
x, ai
, ai+1,
…,
an+1)为了空出插入位,就需把第i
个至第n个【即n-i+1个】元素向后移动。2.2线性表的顺序表示与实现插入操作:ListInsert_Sq(SqList
&L,
int
i,ElemType
e)L.elemL.lenghtL.listsizen1000199n-1na1a2...ai-1aiai+1...ani-2i-1iL.elemL.lenghtL.listsizen01第27
页99n-1na1a2...ai-1eai......ani-2ii+12.2线性表的顺序表示与实现内存01数组下标i-1in-1n12元素序号ii+1nn+1…第28
页………a1a2…aiai+1…an1数组下标0i-1in-1n12内存
元素序号ii+1nn+1………a1a2…eaiai+1…an-1an…2.2线性表的顺序表示与实现第29
页插入操作:基本算法Status
ListInsert_Sq
(SqList
&L,
int
i,
ElemType
e){
//在顺序线性表L中第i
个位置之前插入新的元素e,if(i<1
||
i>L.length+1)return
ERROR;q
=
&
(
L.elem[i-1]
);//i
超出表长则不合法//q
指向插入位置for
(
p=&(L.elem[L.length-1]);
p>=q;
--p
)//初始化时p指向最后一个数据元素*(p+1)
=
*p;//插入e//表长增1*q
=
e;++L.length;return
OK;}
//
ListInsert_Sq2.2线性表的顺序表示与实现插入操作的时间复杂度分析插入操作的主要代价体现在表中元素的移动。在位置i
插入元素,需移动n-i+1
个元素,
元素总个数为k,假设各个位置插入的概率相等,为p=1/n,则平均移动元素次数为:等概率的情况,算法的时间复杂度为O(n)。n第30
页1
·
(n
-
i
+
1)»
n
n
2i
=12.2线性表的顺序表示与实现第31
页Status
ListInsert_Sq(SqList
&L,
int
i,
ElemType
e){//在顺序线性表L中第i
个位置之前插入新的元素e,if(i<1
||
i>L.length+1) return
ERROR;
//i不合法if
(L.length>=L.listsize)
//空间已满,重新分配空间{
newbase
=
(ElemType*)
realloc
(L.elem,(L.listsize+L.incresize)*
sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
//存储分配失败L.elem
=
newbase;L.listsize+=
L.incresize;//新基址//增加存储容量}q
=&(L.elem[i-1]);
//q为插入位置for(p=&(L.elem[L.length-1]);p>=q;--p
)
//p指向尾元素*
(p+1)
=
*p;//插入e
,表长增1*q=e;
++L.length;return
OK;}
//ListInsert_Sq2.2线性表的顺序表示与实现删除操作ListDelete_Sq
(SqList
&L,
int
i,
ElemType
&e)在顺序线性表L中删除第i个元素,并用e返回.L.elemL.lenghtL.listsizen1000199n-2n-1a1a2...ai-1aiai+1...an-1ani-2i-1iL.elemL.lenghtL.listsizen-110001第32
页99n-1na1a2...ai-1ai+1ai+2...ani-2i-1iaie2.2线性表的顺序表示与实现第33
页Status
ListDelete_Sq(SqList
&L,int
i,ElemType
&e){//在顺序线性表L中删除第i
个元素,并用e
返回其值。i
的合法值为1≤i≤L.length。return
ERROR;//p为被删除元素的位置//被删除元素的值赋给e//表尾元素的位置if
(
(i<1)
||
(i>L.Length)
)p
=
&
(
L.elem[i-1]
);e
=
*p;q
=
L.elem[L.length-1];for
(
++p;
p<=q;
++p
)*(p-1)
=*p;//被删除元素之后的元素前移--
L.length;return
OK;//表长减1}
//ListDelete_Sq2.2线性表的顺序表示与实现第34
页顺序表的算法分析插入和删除操作的主要代价体现在表中元素的移动。插入:移动n-i+1个删除:移动n-i个2.2线性表的顺序表示与实现第35
页顺序表的优缺点优点不需要附加空间表示元素间的逻辑关系快速、随机存取任意元素(根据下标)缺点很难估计表所需空间的大小开始就要分配足够大的一片连续的内存空间,易产生碎片现象更新操作代价大——“兴师动众”2.3线性表的链式存储与实现第36
页线性表的链式存储结构特点1、用一组任意的存储单元存储线性表的数据元素。2、利用指针实现了用不相邻的存储单元存放逻辑上相邻的一组元素。3、每个数据元素ai,除存储本身信息外,还需存储其直接后继的信息(指针)。2.3线性表的链式存储与实现数据域第37
页指针域结点(Node)数据域:数据元素本身的信息指针域:指示直接后继的存储位置结点根据链接方式和指针的数量多少,链表分为:单链表双链表循环链表2.3线性表的链式存储与实现头指针:存放线性链表中第一个结点的存储地址。空指针:不指向任何结点,线性链表最后一个结点的指针通常是空指针。头结点:线性链表的第一个数据元素结点前面的一个附加结点,称为头结点。头结点不保存数据。带头结点的线性链表:第一元素结点前面增加一个附加结点的线性链表称为带头结点的线性链表。L是头指针ai-1aia2a1ai+1nanL线性链表的每个结点中只有一个指针域故也称为单链表头结点空指针数据结点第38
页2.3线性表的链式存储与实现结点的形式定义Typedef
struct LNode
{ElemTypestruct
LNodedata;*next;//数据域//指针域}
LNode,*
LinkList;LinkList
L;//L
为单链表的头指针,是LinkList
类型的变量L是头指针nL头结点如果链表中没有数据结点,称为:空表NULLL第39
页2.3线性表的链式存储与实现ai-1aia2a1ai+1nan相关术语:带头结点的单向链表LnL空表怎样判断带头结点的单向链表是否为空表?如果:L->next==NULL成立,则L为空表。等价:如果:L->next!=NULL成立,则L不是空表。第40
页2.3线性表的链式存储与实现ai-1aia2a1ai+1nan相关术语:不带头结点的单向链表LL第41
页空表:L=NULLNULL怎样判断不带头结点的单向链表是否为空表?如果:L==NULL成立,则L为空表。等价:如果:L!=NULL成立,则L不是空表。2.3线性表的链式存储与实现结点之间的基本关系a2a4a2a5r第42
页p
q
sq则下列关系成立:s
==q->next->nextp->next
==r->next
====p->
next->next->next通过当前结点p要访问下一个结点,则指向下一个结点的指针为:p->next通过当前结点p要访问下一个结点的下一个:p->next->next2.3线性表的链式存储与实现第43
页链表操作基本运算检索在链表中查找满足某种条件的元素插入在链表的适当位置插入一个元素删除从链表中删除一个指定元素2.3线性表的链式存储与实现线性链表(单链表)的基本操作取数据元素操作GetElem(L,i,
&e
)功能:取带有头结点的线性链表L中第i个元素结点,其值存入e。主要步骤从第一个元素开始,查找到第i个元素结点取值存入eL211830754256∧pppj123第44
页2.3线性表的链式存储与实现单链表操作的特点单链表是一种顺序存取的结构,为找第i个数据元素,必须从第一个元素开始找到第i个数据元素。查找第i
个数据元素的基本操作为:从第一个元素开始,顺次移动指针,比较j和i。令指针p
始终指向线性表中第j
个数据元素。第45
页2.3线性表的链式存储与实现第46
页Status
GetElem_L
(LinkList
L,int
i,
ElemType
&e){//L是带头结点的链表的头指针,以e返回第i个元素p
=L->next; j=1;
//p
指向第1个结点,j为计数器while
(p!=NULL
&&
j<i
)//沿指针向后查找{
p
=
p->next;
++j;}//退出循环时,p指向第i个元素或p为空if
(
p
=
=
NULL
||
j>i
)//第i个元素不存在//取得第i个元素return
ERROR;e
=
p->data;return
OK;}
//
GetElem_L2.3线性表的链式存储与实现第47
页线性链表(单链表)的基本操作插入操作ListInsert_L(&L,i,e
)功能:在带有头结点的线性链表L的第i个元素结点之前插入一个新元素结点e。主要步骤查找第i-1个元素结点建立新结点e修改指针插入新结点2.3线性表的链式存储与实现主要步骤p指向第i-1个元素结点s指向新结点e修改指针插入新结点ai-1a1ai+1nanLs->next=p->next;p->next=s;pes×aiai-1aia1ai+1nanLpes第48
页2.3线性表的链式存储与实现第49
页Status
ListInsert_L(LinkList
&L,
int
i,
ElemType
e){
//在带头结点的链表第i结点之前插入e,1£i£表长+1p=L;
j=0;
//
p
指向头结点while(p!=NULL
&&
j<i-1
)//寻找第i-1
个数据结点{ p=p->next;
++j;}
//
退出循环时
p
为NULL
或
指向第
i-1个结点if
(
p==NULL
||
j>i-1
)return
ERROR;
//i<1
或i>表长+1s=(LinkList)
malloc(sizeof(LNode));
//建新结点
s->data=e;s->next
=
p->next;//插入新结点p->next
=
s;return
OK;}
//ListInsert_L问题:对于不带头结点的链表应该如何进行插入操作?2.3线性表的链式存储与实现第50
页线性链表的基本操作删除操作ListDelete_L(&L,i,e
)功能:删除线性链表L中的第i个元素结点,并由e
返回。主要步骤查找第i-1
个元素结点修改指针删除第i
个元素结点回收被删除结点2.3线性表的链式存储与实现主要步骤p
指向第i-1
个元素结点,q指向被删除结点修改指针删除第i
个元素结点回收被删除结点ai-1a1ai+1nanLq
=
p->next;p->next=q->next;pai-1a1ai+1nanLp×aiq第51
页2.3线性表的链式存储与实现第52
页Status
ListDelete_L(LinkList
&L,
int
i,
ElemType
&e){
//在带头结点的链表L中,删除第i个元素,由e返回其值。1£i£表长。p=L;
j=0;while(p->next!=NULL
&&
j<i-1)//寻找第i-1个结点{
p=p->next;
++j;}
//
退出循环时,p为NULL
或
指向第
i-1
个结点if
(
!p->next
||
j>i-1
) return
ERROR;p->next=q->next;
//删除结点//回收结点空间q=p->next;e=q->data;free(q);return
OK;}
//ListDelete_L问题:对于不带头结点的链表应该如何进行删除操作?2.3线性表的链式存储与实现应用:生成带头结点且含有n个元素的线性链表void
CreateList_L
(
LinkList
&L,
int
n
){ L=(LinkList)malloc(sizeof
(LNode));//建空表L->next
=
NULL;for
(i=n;
i>0;--i)//逆序输入n个元素{read(e);
//读入元素p
=
(
LinkList
)
malloc
(
sizeof(LNode)
);p->data
=
e;p->next
=
L->next;}}
//CreateList_LnLa2an-1nanL->next=p;
//插到表头Lep第53
页×2.3线性表的链式存储与实现单链表的其他形态headtailhead….tailheadtail第54
页2.3线性表的链式存储与实现第55
页线性链表的特点用一组任意的存储单元存储线性表中数据元素;通过指针保存直接后继元素的存储地址来表示数据元素之间的逻辑关系;通过头指针(或首结点)给出线性链表;链表中结点空间是动态分配的;插入、删除操作通过修改结点的指针实现;只能顺序存取元素,不能直接存取元素。2.3线性表的链式存储与实现第56
页单链表的操作分析:对一个结点操作,必先找到它,即用一个 指针指向它;找单链表中任一结点,都必须从第一个点 开始:p
=head;while(没有到达)p=p->next;O(n)单链表的时间复杂度定位:O(n)插入:O(n)+O(1)删除:O(n)+O(1)na42.3线性表的链式存储与实现静态链表用数组实现的链式结构,称为静态链表。0123456789106a40a31a18a236a3a2a1S[0].cur通过下标,记录结点之间的关系第57
页2.3线性表的链式存储与实现循环链表(带有头结点的单向环表)最后一个结点的指针域的指针又指回第一个结点(头结点)的链表。a1
a2
…...
an与单向链表的差别仅在于,判别链表中最后一个结点的条件不再是“后继是否为空”,而是“后继是否为头结点”。h空表第58
页判断是否为空表的条件:h->next
==
h2.3线性表的链式存储与实现循环链表的特点从一个结点可找到链表中的任意一个结点;判断是否为表尾结点的条件:p->next==L。有时用表尾指针表示循环链表:r。pai-1aia1ai+1nanLrai-1aia1ai+1nan第59
页2.3线性表的链式存储与实现双向链表typedef
struct DuLNode
{//数据域//指向前驱的指针域//指向后继的指针域ElemType
data;struct
DuLNode
*prior;struct
DuLNode
*next;}
DuLNode,
*DuLinkList;priorelementnext空双向循环链表:L非空双向循环链表:LAB第60
页2.3线性表的链式存储与实现空双向循环链表:L非空双向循环链表:LABp->prior->next
= p
=
p->next->proir;abpc第61
页2.4线性表的应用实例一元多项式的表示及相加P
(
x
)
=
P
+
P
x
+
P
x
2
+
+
P
x
nn
0
1
2
nP
=
(
P0
,
P1
,
P2
,
,
Pn
)可用线性表P表示+
2
x
20000S
(
x
)
=
1
+
3
x
1000但对S(x)多项式浪费空间+
+
P x
em第62
页e
1
e
2n
1
2
mP
(
x
)
=
P
x
+
P
x一般其中0
£
e1
£
e
2
£
em
(
Pi
为非零系数)用数据域含两个数据项的线性表表示(P1,
e1),(P2,
e2
),
(Pm,
em
)其存储结构可以用顺序存储结构,也可以用单链表2.4线性表的应用实例单链表的结点定义{
inttypedef struct
nodecoef,exp;struct
node
*next;}JD;coefexpnextA
(
x
)
=
7
+
3
x
+
9
x
2
+
5
x
17B
(
x
)
=
8
x
+
22
x
7
-
9
x
8C
(
x
)
=
A
(
x
)
+
B
(
x
)
=
7
+
11
x
+
22
x
7
+
5
x
17-1A517^-1B-98^-1C7
0
3
1
9
88
1
22
77
0
11
1
22
7517^第63
页2.4线性表的应用实例运算规则假设:p,q分别指向A,B中某一结点,p,q初值是第一结点,结果放入A链中。比较
p->exp与q->expp->exp
<
q->exp:p结点是和多项式中的一项
p后移,q不动p->exp=q->exp:
系数相加p->exp>q->exp: q结点是和多项式中的一项将q插在p之前,q后移,p不动=0:从A表中删去p,释放p,q,p,q后移„0:修改p系数域,释放q,p,q后移直到p或q为NULL若q==NULL,结束若p==NULL,将B中剩余部分连到A上第64
页线性表实现方法的比较第65
页顺序表的主要优点没有使用指针,不用花费额外开销线性表元素的读访问非常简洁便利链表的主要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 47240.1-2026半导体器件人体通信半导体接口第1部分:总则
- GB 6246-2026消防水带
- 上海民航职业技术学院《国际经济学》2025-2026学年期末试卷
- 上海工艺美术职业学院《国际结算》2025-2026学年期末试卷
- 上海电机学院《文化学概论》2025-2026学年期末试卷
- 上海邦德职业技术学院《大学写作训练》2025-2026学年期末试卷
- 苏州城市学院《德育与班级管理》2025-2026学年期末试卷
- 沈阳音乐学院《测绘学概论》2025-2026学年期末试卷
- 山西同文职业技术学院《电动力学》2025-2026学年期末试卷
- 上海外国语大学贤达经济人文学院《服务贸易》2025-2026学年期末试卷
- 2026华北理工大学轻工学院招聘55人考试参考试题及答案解析
- 2026宁波市跨境电子商务促进中心招聘1人考试备考题库及答案解析
- 2026山东出版集团有限公司招聘193人笔试备考试题及答案解析
- 2026中国电建集团海外投资有限公司财务管理岗位社会招聘1人笔试备考试题及答案解析
- 江苏省镇江市2024-2025学年高三下学期期初质量监测生物试卷(含答案)
- G1817乌斯太至银川公路乌斯太至巴音呼都格段改造工程报告表
- 2026年常州纺织服装职业技术学院单招综合素质考试题库带答案详解(b卷)
- 潍坊宠物行业分析报告
- 时间在哪里(单元测试)2025-2026学年二年级数学下册人教版(含答案)
- 山东省社会团体财务制度
- 2026年灌肠技术临床应用护理规范指南
评论
0/150
提交评论