线性表
线性结构是一个数据元素的有序(次序)集
线性结构的基本特征:
1、集合汇总必存在唯一的一个“第一元素”
2、集合中必存在唯一的“最后元素”
3、除最后元素外,均有唯一的后继
4、除第一元素外,均有唯一的前驱
<!--[if !supportLists]-->1、 <!--[endif]-->线性表的类型定义
抽象数据类型线性表的定义如下:
ADT List{
数据对象
D={a1|a1<ElemSet,i=1,2,,,,,,n,n>=0}
称n为线性表的表长
称n=0时的线性表为空表
}
数据关系
R1={<ai-1,ai>|ai-1,ai属于D,i=2,,,,,n}
基本操作:
结构初始化
InitList(&L)
操作结果:构造一个空的线性表L
销毁结构
DestoryList(&L)
初始条件:线性表L已存在。
操作结果:销毁线性表L。
引用型操作
ListEmpty(L)
初始条件:线性表L已存在
操作结果:若L为空表,则返回true,否则返回false
ListLength(L)
初始条件:线性表L已经存在。
操作结果:返回L中元素的个数。
PriorElem(L,cure_e)
初始条件:线性表L存在。
操作结果:若cur_e是L的元素,但不是第一个,则返回它的前驱,否则操作失效,
NextElem(L,cur_e)
初始条件:线性表L存在。
操作结果:若cur_e是L的一个元素,但不是最后一个元素,返回cur_e的下一个元素。
GetElem(L,i)
初始条件:线性表L存在,且1<=i<=LengthList(L)
操作结果:返回L中第i个元素的值
LocateElem(L,e,compare())
初始条件:线性表L存在,compare()是元素判定函数
操作结果:返回L中第1个与e满足关系compare()的元素的位序,若这样的元素不存在,则返回值为0
ListTraverse(L,visit())
初始条件:线性表L存在。
操作结果:依次对L的每个元素调用函数visit()。一旦visit()失败,则操作失败。
加工型操作
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.
例1、假设:有俩个集合A和B分别用俩个线性表LA和LB表示(即:线性表中的数据元素即为集合中的成员)
现要求一个新的集合A= A ∪ B
上述问题可演绎为,要求对线性表作如下操作:
扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去。
1、从线性表LB中依次取得每个数据元素:
GetElem(LB,i)
2、依值在线性表LA中进行查访
LocateElem(LA,e,equal())
3、若不存在,则插入之。
ListInsert(LA,n+1,e)
代码实现:
void union(List La,List Lb){
La_len = ListLenth(La);
Lb_len =ListLenth(Lb);
for(int i=0;i<=Lb_len;i++){
GetElem(Lb,i,e);
if(!LocateElem(La,e,equal())
ListInsert(La,++La_len;e);
}
}
例2,已知一个非纯集合B,试狗杂一个纯结合A,使得A中只包含B中所有值各不相同的数据元素。
void union(List La,List Lb){
InitList(La);//与上一个例子的区别,就是多了一个空表初始化
La_len = ListLenth(La);
Lb_len =ListLenth(Lb);
for(int i=0;i<=Lb_len;i++){
GetElem(Lb,i,e);
if(!LocateElem(La,e,equal())
ListInsert(La,++La_len;e);
}
}
二、线性表类型的实现------顺序映像
用一组地址连续的存储单元,依次存放线性表中的数据元素
a1,a2,....a(i-1),ai.......an
线性表的起始地址,称作线性表的基地址
顺序映像的C语音描述
#define LIST_INIT_SIZE 80 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedof struct{
ElemType *elem; //存储空间基地
int length;//当前长度
int listsize; //当前分配的存储容量
}
线性表的初始化操作
Status InitList_sq(SqList &L){
//构造一个空的线性表
L.elem=(ElemType*)maclloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}//initList Sq
线性表操作LocateElem(L,e,companre())的实现; //查找和e满足compare()关系的值
int LocateElem_sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){
i=1;
p=L.length;
while(i<=L.length&&!(&compare)(*p++,e))
++i;
if(i<=L.length;
return i;
else
return 0;
}
线性表操作ListInsert(&L,i,e)的实现
问:插入元素时,线性表的逻辑关系发生什么变化
(a1,.....a(i-1),ai,,,,,an)改变为
(a1,,,,,,a(i-1),e,ai,,,,,an)
地址变化如下:
A1 |
A2 |
….. |
Ai-1 |
Ai |
….. |
An |
|
A1 |
A2 |
…… |
Ai-1 |
E |
Ai |
….. |
an |
<!--[if !supportLists]-->2、 <!--[endif]-->线性表类型的实现---链式映像
1、单链表
用一组地址任意的存储但与存放线性表中的数据元素
以元素+指针=节点
以“结点的序列”表示线性表-------称作链表
头->a1->a2->.....->an
以线性表中第一个数据元素a1的存储地址作为线性表的地址,称作线性表的头指针。
结点和单链表的C语言描述
Typedof struct LNode{
ElemType data;//数据域
struct Lnode *next;//指针域
}LNode,*LinkList;
线性表的操作GetElem(L,i,&e)在链表中的实现
基本操作位:使指针P始终指向线性表中第j个数据元素
Status GetElem L(LinkList L,int pos,ElemType &e){
p=L->next; j=1; //初始化,p指向第一个结点,j为计数器
while(p&&j<post){
p=p->netx;++j;
}
if(!p||j>pos)
return ERROR;//第pos个元素不存在。
e=p->data; //取第pos个元素
return OK;
}
线性表的操作ListInsert(&L,i,e)在链表中的实现
基本操作:找到线性表中第在i-1个结点,修改其指向后继的指针
有序对<a(i-1),ai>改变为<a(i-1),e>和<e,ai>
Status ListInsert L(LinkList L,int pos,ElemType c){
p=L;j=0;
//寻找第pos-1个结点
while(p&&j<pos-1){
p=p->next;
++j;
}
if(!p||j>pos-1)
return ERROR;//pos小于1或者大于表长
s=(LinkList)malloc(sizeof(LNode));//生成新结点
s->data=e;
s->next=p->next;//插入L中
p->next=s;
return OK;
}
线性表的操作ListDelete(&L,i,&e)在链表中的实现:
基本操作为:找到线性表中第i-1个结点,修改其指向后继的指针
有序对<a(i-1),ai>和<ai,a(i+1)>改变为<a(i-1),a(i+1)>
Status ListDelete_L(LinkList L,int pos,ElemType &e){
p=L,j=0;
while(p->next&&j<pos-1){
p=p->next;
j++;
}
if(!(p->next)||j>pos-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
链表的创建
void createList_L(LinkList&L,int n){
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//先建立一个带头结点的单链表
for(i=n;i>0;--i){
p =(Linklist)malloc(sizeof(LNode));
scanf(&p->data);//输入元素值
p->next=L->netx;
L->next=p;
}
}
用上述定义的单链表实现线性表的操作时,存在的问题:
1、单链表的表长是一个隐含的值。
2、在单链表的最后一个元素最后插入时候,需要遍历整个链表
3、在链表中,元素的“位序”概念淡化、结点的“位置”概念强化。
改变链表的设置:
1、增加“表长”,“表尾指针”,和“当前位置的指针”三个数据域;
2.将基本操作“位序”改成“指针”
五,其他形式的链表
1、双向链表
typedef struct DulNode{
ElemType data; //数据域
struct DulNode *prior;//指向前驱的指针域
struct DulNode *next;//指向后继的指针域
}
2、循环链表
最后一个节点的指针域的指针又指向第一个节点的链表
<!--[if !supportLists]-->3、 <!--[endif]-->一元多项式的表示
p(x)=p0+p1x+p2x+...+pnx
在计算机中,可以用一个线性表来表示
一般情况下,使用的时候存储结构不经常发生变化,使用线性表,如果使用的时候,存储结构经常发生变化,使用链表。
相关推荐
数据结构2_线性表.pptx
数据结构2-1线性表的类型定义 定义线性表节点的结构.ppt
主要有以下的课件和pdf ...2.数据结构-林大 3.数据结构与算法-合肥工大 4.数据结构-试题库 算法与数据结构_严蔚敏版_全部课件.ppt 数据结构与算法(JAVA语言版).pdf 数据结构与算法(JAVA语言版解密).pdf等
这是数据结构的第二章线性表,想看的可以看看。
数据结构代码源码 清华大学版 数据结构代码源码 清华大学版 数据结构代码源码 清华大学版
SSD5 Recommended Exercise 2 数据结构SSD5 Recommended Exercise 2 数据结构SSD5 Recommended Exercise 2 数据结构SSD5 Recommended Exercise 2 数据结构SSD5 Recommended Exercise 2 数据结构SSD5 Recommended ...
2. **线性数据结构**:线性数据结构如数组和链表是最基础的数据结构。数组提供随机访问,但插入和删除操作较复杂;链表则在插入和删除上具有优势,但访问速度相对较慢。课件可能会通过实例解释它们的运作机制和优...
数据结构 c 数据结构 c 数据结构 c 数据结构 c 数据结构 c 数据结构 c
2. **数据结构的分类**: - **逻辑结构**:数据结构可以从逻辑上分为线性结构(如数组、链表、栈和队列)和非线性结构(如树、图)。线性结构的数据元素呈一对一关系,而非线性结构则更为复杂,如树形结构中数据...
2. 掌握各种数据结构的特性及其在实际问题中的应用。 3. 学会分析和设计算法,尤其是动态规划和贪心策略。 4. 通过编程实现数据结构和算法,加深理解和记忆。 5. 及时总结和回顾,巩固所学知识。 总的来说,《王道...
在《数据结构教程(第2版)源代码》中,你可以找到每种数据结构的C语言或C++实现,这些源代码可以帮助你: 1. **理解基本操作**:通过阅读和运行代码,你可以了解每种数据结构的基本操作,如插入、删除、查找等是...
2. 链表(Linked List):是一种动态分配存储空间的数据结构,每个节点包含数据和指向下一个节点的指针。 3. 栈(Stack):是一种后进先出的数据结构,元素的添加和删除操作都在栈顶进行。 4. 队列(Queue):是一种...
第2章至第7章从抽象数据类型的角度,分别讨论线性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用;第8章综合介绍操作系统和编译程序中涉及的动态存储管理的基本技术;第9章至第11章...
在“东北大学数据结构实验2”中,学生将深入学习和实践这一关键概念。这个实验可能涵盖了多种数据结构,如数组、链表、栈、队列、树(二叉树、平衡树)以及图等,这些都是构建复杂算法和系统的基础。 首先,数组是...
2. 第二章可能涉及线性数据结构,如数组和链表。数组是最基本的数据结构,而链表则是一种动态数据结构,可以实现插入和删除操作,对于理解其他复杂数据结构至关重要。 3. 第三章可能深入讲解栈和队列,这两种数据...
数据结构(C语言版 第2版)课后习题答案 严蔚敏 编著 数据结构是计算机科学中的一门基础课程,对于计算机科学和技术专业的学生来说是必修课程。本书是数据结构(C语言版 第2版)的课后习题答案,编著者是严蔚敏。...
数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行快速的存取和处理。李春葆教授的数据结构教程是一本广泛使用的教材,它深入浅出地介绍了这一领域的基本概念和算法。在这...
2. **线性结构**:数组和链表是最基础的数据结构,它们用于存储顺序数据。数组提供了随机访问,但插入和删除操作可能效率较低;链表则允许高效插入和删除,但不支持快速索引。 3. **栈和队列**:栈是一种后进先出...
数据结构是计算机科学中的核心课程之一,主要研究如何在计算机中组织、存储和管理数据,以便高效地进行各种操作。王道考研的数据结构PPT涵盖了这门学科的关键概念和技术,对于准备考研的学生来说,是一份非常有价值...
2. **高级数据结构**:树(二叉树、平衡树如AVL树和红黑树)、图、哈希表等复杂数据结构的构造与应用。这些数据结构在解决搜索、排序、连接等问题时具有重要作用。 3. **排序算法**:包括冒泡排序、插入排序、选择...