`
韩悠悠
  • 浏览: 839938 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据结构2

    博客分类:
  • java
 
阅读更多

 

线性表

 

 

 

线性结构是一个数据元素的有序(次序)集

 

 

 

线性结构的基本特征:

 

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_eL的元素,但不是第一个,则返回它的前驱,否则操作失效,

 

 

 

NextElem(L,cur_e)

 

初始条件:线性表L存在。

 

操作结果:若cur_eL的一个元素,但不是最后一个元素,返回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个元素之前插入新的元素eL的长度增1.

 

 

 

1、假设:有俩个集合AB分别用俩个线性表LALB表示(即:线性表中的数据元素即为集合中的成员)

 

现要求一个新的集合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_线性表.pptx

    数据结构2-1线性表的类型定义 定义线性表节点的结构.ppt

    数据结构2-1线性表的类型定义 定义线性表节点的结构.ppt

    数据结构与算法大全

    主要有以下的课件和pdf ...2.数据结构-林大 3.数据结构与算法-合肥工大 4.数据结构-试题库 算法与数据结构_严蔚敏版_全部课件.ppt 数据结构与算法(JAVA语言版).pdf 数据结构与算法(JAVA语言版解密).pdf等

    数据结构2线性表

    这是数据结构的第二章线性表,想看的可以看看。

    c数据结构数据结构数据结构数据结构

    数据结构代码源码 清华大学版 数据结构代码源码 清华大学版 数据结构代码源码 清华大学版

    SSD5 Recommended Exercise 2 数据结构

    SSD5 Recommended Exercise 2 数据结构SSD5 Recommended Exercise 2 数据结构SSD5 Recommended Exercise 2 数据结构SSD5 Recommended Exercise 2 数据结构SSD5 Recommended Exercise 2 数据结构SSD5 Recommended ...

    数据结构的pdf课件

    2. **线性数据结构**:线性数据结构如数组和链表是最基础的数据结构。数组提供随机访问,但插入和删除操作较复杂;链表则在插入和删除上具有优势,但访问速度相对较慢。课件可能会通过实例解释它们的运作机制和优...

    数据结构 c 数据结构 c

    数据结构 c 数据结构 c 数据结构 c 数据结构 c 数据结构 c 数据结构 c

    数据结构1800试题.pdf

    2. **数据结构的分类**: - **逻辑结构**:数据结构可以从逻辑上分为线性结构(如数组、链表、栈和队列)和非线性结构(如树、图)。线性结构的数据元素呈一对一关系,而非线性结构则更为复杂,如树形结构中数据...

    王道数据结构.zip

    2. 掌握各种数据结构的特性及其在实际问题中的应用。 3. 学会分析和设计算法,尤其是动态规划和贪心策略。 4. 通过编程实现数据结构和算法,加深理解和记忆。 5. 及时总结和回顾,巩固所学知识。 总的来说,《王道...

    李春葆数据结构源代码

    在《数据结构教程(第2版)源代码》中,你可以找到每种数据结构的C语言或C++实现,这些源代码可以帮助你: 1. **理解基本操作**:通过阅读和运行代码,你可以了解每种数据结构的基本操作,如插入、删除、查找等是...

    西安理工大学863数据结构真题 -西安理工大学863数据结构真题需要的滴滴我,都是我去年备考时的真题资料,还有复试资料哦~

    2. 链表(Linked List):是一种动态分配存储空间的数据结构,每个节点包含数据和指向下一个节点的指针。 3. 栈(Stack):是一种后进先出的数据结构,元素的添加和删除操作都在栈顶进行。 4. 队列(Queue):是一种...

    严蔚敏数据结构c语言版

    第2章至第7章从抽象数据类型的角度,分别讨论线性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用;第8章综合介绍操作系统和编译程序中涉及的动态存储管理的基本技术;第9章至第11章...

    东北大学数据结构实验2

    在“东北大学数据结构实验2”中,学生将深入学习和实践这一关键概念。这个实验可能涵盖了多种数据结构,如数组、链表、栈、队列、树(二叉树、平衡树)以及图等,这些都是构建复杂算法和系统的基础。 首先,数组是...

    薛超英C++数据结构PPT

    2. 第二章可能涉及线性数据结构,如数组和链表。数组是最基本的数据结构,而链表则是一种动态数据结构,可以实现插入和删除操作,对于理解其他复杂数据结构至关重要。 3. 第三章可能深入讲解栈和队列,这两种数据...

    数据结构(C语言版 第2版)课后习题答案 严蔚敏 编著

    数据结构(C语言版 第2版)课后习题答案 严蔚敏 编著 数据结构是计算机科学中的一门基础课程,对于计算机科学和技术专业的学生来说是必修课程。本书是数据结构(C语言版 第2版)的课后习题答案,编著者是严蔚敏。...

    数据结构教程 by 李春葆

    数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行快速的存取和处理。李春葆教授的数据结构教程是一本广泛使用的教材,它深入浅出地介绍了这一领域的基本概念和算法。在这...

    浙江大学陈越数据结构课件

    2. **线性结构**:数组和链表是最基础的数据结构,它们用于存储顺序数据。数组提供了随机访问,但插入和删除操作可能效率较低;链表则允许高效插入和删除,但不支持快速索引。 3. **栈和队列**:栈是一种后进先出...

    王道考研——数据结构PPT.zip

    数据结构是计算机科学中的核心课程之一,主要研究如何在计算机中组织、存储和管理数据,以便高效地进行各种操作。王道考研的数据结构PPT涵盖了这门学科的关键概念和技术,对于准备考研的学生来说,是一份非常有价值...

    南开大学数据结构课件

    2. **高级数据结构**:树(二叉树、平衡树如AVL树和红黑树)、图、哈希表等复杂数据结构的构造与应用。这些数据结构在解决搜索、排序、连接等问题时具有重要作用。 3. **排序算法**:包括冒泡排序、插入排序、选择...

Global site tag (gtag.js) - Google Analytics