当前位置:文档之家› 数据结构 清华大学出版社 严蔚敏吴伟民编著

数据结构 清华大学出版社 严蔚敏吴伟民编著

第一章绪论1、数据结构是计算机中存储、组织数据的方式。

精心选择的数据结构可以带来最优效率的算法。

2、程序设计= 算法+数据结构3、解决问题方法的效率:●跟数据的组织方式有关●跟空间的利用效率有关●跟算法的巧妙程度有关4、数据:所有能输入到计算机中,且被计算机处理的符号的集合,是计算机操作对象的总称;是计算机处理的信息的某种特定的符号表示形式。

5、数据元素:数据中的一个“个体”,数据结构中讨论的基本单位。

相当于“记录”,在计算机程序中通常作为一个整体考虑和处理。

6、数据项: 相当于记录的“域”, 是数据的不可分割的最小单位,如学号。

数据元素是数据项的集合。

7、数据对象:性质相同的数据元素的集合.例如: 所有运动员的记录集合8、数据结构:是相互间存在某种关系的数据元素集合。

9、数据结构是带结构的数据元素的集合。

10、不同的关系构成不同的结构。

11、次序关系:{<ai,ai+1>|i=1,2,3,4,5,6}12、对每种数据结构,主要讨论如下两方面的问题:1)数据的逻辑结构,数据结构的基本操作;2)数据的存储结构,数据结构基本操作的实现;13、数据的逻辑结构:数据之间的结构关系,是具体关系的抽象。

数据结构的基本操作:指对数据结构的加工处理。

14、数据的存储结构(物理结构):数据结构在计算机内存中的表示。

数据结构基本操作的实现:基本操作在计算机上的实现(方法)。

15、数据结构的有关概念16、数据元素的4类的基本结构:○1集合;○2线性结构:结构中数据元素之间存在一对一的关系;○3树形结构:结构中数据元素之间存在一对多的关系;○4图状结构或网状结构:结构中数据元素之间存在多对多的关系。

17、C语言的优点:C语言可以直接操作内存。

18、每个节点都由两部分组成:数据域和指针域。

19、链接存储结构特点:●比顺序存储结构的存储密度小(每个节点都由数据域和指针域组成)。

●逻辑上相邻的节点物理上不必相邻。

●插入、删除灵活(不必移动节点,只要改变节点中的指针)。

20、数据类型是一个值的集合和定义在此集合上的一组操作的总称。

21、ADT 有两个重要特征:数据抽象和数据封装。

22、抽象数据类型(Abstract Data Type 简称ADT):是指一个数学模型以及定义在此数学模型上的一组操作。

23、抽象数据类型有:数据对象〈数据对象的定义〉、数据关系〈数据关系的定义〉、基本操作〈基本操作的定义〉。

24、数据类型的定义和含义。

定义:数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

含义:将数据按一定次序与形式存放的结构。

24、算法空间复杂度S(n)算法的存储量包括:①输入数据所占的空间;②程序本身所占的空间;③辅助变量所占的空间。

25、算法具有有穷性、确定性、可行性、输入和输出五大特性。

26、抽象数据类型具有数据抽象、数据封装的特点。

27、数据的储存结构分为:顺序存储结构和链式存储结构。

第二章线性表1、线性结构的特点:在数据元素中的非空有限集中。

(1)存在唯一的一个被称作“第一”的数据元素;(2)存在唯一的一个被称作“最后一个”的数据元素;(3)除第一个外,集合中的每一个数据元素均只有一个前驱;(4)除最后一个外,集合中的每一个数据元素均只有一个后继。

2、线性表(Linear List) :一个线性表是n个数据元素的有限序列。

3、线性表的顺序存储实现:typedef struct {ElementType Data[MAXSIZE];int Last;} List;List L, *PtrL;4、初始化(建立空的顺序表)List *MakeEmpty( ){ List *PtrL;PtrL = (List *)malloc( sizeof(List) );PtrL->Last = -1;return PtrL;}5、查找int Find( ElementType X, List *PtrL ){ int i = 0;while( i <= PtrL->Last && PtrL->Data[i]!= X )i++;if (i > PtrL->Last) return -1; /* 如果没找到,返回-1 */else return i; /* 找到后返回的是存储位置*/}6、插入算法void Insert( ElementType X, int i, List *PtrL ){ int j;if ( PtrL->Last == MAXSIZE-1 ){ /* 表空间已满,不能插入*/printf("表满");return;}if ( i < 1 || i > PtrL->Last+2) { /*检查插入位置的合法性*/printf("位置不合法");return;}for ( j = PtrL->Last; j >= i-1; j-- )PtrL->Data[j+1] = PtrL->Data[j]; /*将ai~an倒序向后移动*/PtrL->Data[i-1] = X; /*新元素插入*/PtrL->Last++; /*Last仍指向最后元素*/return;}7、删除算法void Delete( int i, List *PtrL ){ int j;if( i < 1 || i > PtrL->Last+1 ) { /*检查空表及删除位置的合法性*/printf (“不存在第%d个元素”, i );return ;}for ( j = i; j <= PtrL->Last; j++ )PtrL->Data[j-1] = PtrL->Data[j]; /*将ai+1~an顺序向前移动*/PtrL->Last--; /*Last仍指向最后元素*/return;}8、求表长int Length ( List *PtrL ){ List *p = PtrL; /* p指向表的第一个结点*/int j = 0;while ( p ) {p = p->Next;j++; /* 当前p指向的是第j 个结点*/}return j;}9、查找(1)按序号查找: FindKth;List *FindKth( int K, List *PtrL ){ List *p = PtrL;int i = 1;while (p !=NULL && i < K ) {p = p->Next;i++;}if ( i == K ) return p;/* 找到第K个,返回指针*/else return NULL;/* 否则返回空*/}(2)按值查找: FindList *Find( ElementType X, List *PtrL ){List *p = PtrL;while ( p!=NULL && p->Data != X )p = p->Next;return p;}10、插入(在链表的第i-1(1≤i≤n+1)个结点后插入一个值为X的新结点)List *Insert( ElementType X, int i, List *PtrL ){ List *p, *s;if ( i == 1 ) { /* 新结点插入在表头*/s = (List *)malloc(sizeof(List)); /*申请、填装结点*/s->Data = X;s->Next = PtrL;return s; /*返回新表头指针*/}p = FindKth( i-1, PtrL ); /* 查找第i-1个结点*/if ( p == NULL ) { /* 第i-1个不存在,不能插入*/printf("参数i错");return NULL;}else {s = (List *)malloc(sizeof(List)); /*申请、填装结点*/s->Data = X;s->Next = p->Next; /*新结点插入在第i-1个结点的后面*/p->Next = s;return PtrL;}}11、删除(删除链表的第i (1≤i≤n)个位置上的结点)List *Delete( int i, List *PtrL ){ List *p, *s;if ( i == 1 ) { /* 若要删除的是表的第一个结点*/s = PtrL; /*s指向第1个结点*/PtrL = PtrL->Next; /*从链表中删除*/free(s); /*释放被删除结点*/return PtrL;}p = FindKth( i-1, PtrL ); /*查找第i-1个结点*/if ( p == NULL ) {printf(“第%d个结点不存在”, i-1); return NULL;} else if ( p->Next == NULL ){printf(“第%d个结点不存在”, i); return NULL;} else {s = p->Next; /*s指向第i个结点*/p->Next = s->Next; /*从链表中删除*/free(s); /*释放被删除结点*/return PtrL;}}12、链表不具备的特点是 1 。

①可随机访问任一节点②插入删除不须要移动元素③不必事先估计存储空间④所需空间与其长度成正比13、带头结点的单链表head为空的判定条件是 2 。

①head==NULL ②head->next==NULL③head->next==head ④head!=NULL14、如果最常用的操作是取第i个结点及其前驱,则采用 4 存储方式最节省时间。

①单链表②双链表③单循环链表④顺序表第三章Chapter 3 栈(stacks)和队列(queues)1、栈是限定仅能在表尾一端进行插入、删除操作的线性表。

2、栈的特点是“后进栈的元素先出栈”(last in, first out),故栈又称为后进先出表(LIFO)。

3、一个栈是一些元素的线形列表,其中元素的插入和删除均在表的同一端进行。

插入和删除发生的一端称为栈顶(the top of the stack)。

4、第一个进栈的元素在栈底,5、最后一个进栈的元素在栈顶,第一个出栈的元素为栈顶元素,最后一个出栈的元素为栈底元素。

6、连续栈(Contiguous Stack)的类型定义#define MaxStack 50Typedef struct{datatype stack[MaxStack];int top;}Seqstack;Seqstack *s;7、判断栈是否已满viod Push(Seqstack *s, datatype x ){if (s->top>=MaxStack-1) printf(“overflow”);else {s-> top++;s->stack[s->top]=x;}}8、判断栈是否为空datatype pop(Seqstack *s ){ if (s->top<0){printf(“underflow”); return(NULL);}return(s->stack[s->top]);s->top--;}9、返回栈顶元素的值,栈不发生变化。

相关主题