数据结构基本操作总结
数据结构的重点知识点
数据结构的重点知识点数据结构是计算机科学中非常重要的基础知识,它主要研究数据的组织、存储和管理方式。
在学习数据结构的过程中,有一些重点知识点需要特别关注和理解。
本文将从以下几个方面介绍数据结构的重点知识点。
一、线性表线性表是数据结构中最基本、最简单的一种结构。
它包括顺序表和链表两种实现方式。
1. 顺序表顺序表是线性表的一种实现方式,它使用一个连续的存储空间来存储数据。
顺序表的主要操作包括插入、删除和查找等。
2. 链表链表是线性表的另一种实现方式,它使用节点来存储数据,并通过指针将这些节点连接起来。
链表的主要操作包括插入、删除和查找等。
二、栈和队列栈和队列是线性表的特殊形式,它们的主要特点是插入和删除操作只能在特定的一端进行。
1. 栈栈是一种先进后出(LIFO)的数据结构,它的插入和删除操作都在栈顶进行。
栈的主要操作包括入栈和出栈。
2. 队列队列是一种先进先出(FIFO)的数据结构,它的插入操作在队尾进行,删除操作在队头进行。
队列的主要操作包括入队和出队。
三、树和二叉树树是一种用来组织数据的非线性结构,它由节点和边组成。
树的重点知识点主要包括二叉树、二叉搜索树和平衡树等。
1. 二叉树二叉树是一种特殊的树结构,它的每个节点最多只能有两个子节点。
二叉树的主要操作包括遍历、插入和删除等。
2. 二叉搜索树二叉搜索树是一种特殊的二叉树,它的左子树中的所有节点的值都小于根节点的值,右子树中的所有节点的值都大于根节点的值。
二叉搜索树的主要操作包括查找、插入和删除等。
四、图图是由节点和边组成的一种复杂数据结构。
图的重点知识点主要包括有向图和无向图、图的遍历和最短路径算法等。
1. 有向图和无向图有向图和无向图是图的两种基本形式,它们的区别在于边是否有方向。
有向图的边是有方向的,而无向图的边没有方向。
2. 图的遍历图的遍历是指对图中的每个节点进行访问的过程。
常见的图遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
数据结构实验报告实验总结
数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。
通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。
下面对每一部分实验进行总结。
实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。
在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。
实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。
通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。
实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。
通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。
实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。
通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。
通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。
同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。
在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。
通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。
总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。
在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。
数据结构知识点全面总结—精华版
第1章绪论内容提要:◆数据结构研究的内容..针对非数值计算的程序设计问题;研究计算机的操作对象以及它们之间的关系和操作..数据结构涵盖的内容:◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型..数据——所有能被计算机识别、存储和处理的符号的集合..数据元素——是数据的基本单位;具有完整确定的实际意义..数据对象——具有相同性质的数据元素的集合;是数据的一个子集..数据结构——是相互之间存在一种或多种特定关系的数据元素的集合;表示为:Data_Structure=D; R数据类型——是一个值的集合和定义在该值上的一组操作的总称..抽象数据类型——由用户定义的一个数学模型与定义在该模型上的一组操作;它由基本的数据类型构成..◆算法的定义及五个特征..算法——是对特定问题求解步骤的一种描述;它是指令的有限序列;是一系列输入转换为输出的计算步骤..算法的基本特性:输入、输出、有穷性、确定性、可行性◆算法设计要求..①正确性、②可读性、③健壮性、④效率与低存储量需求◆算法分析..时间复杂度、空间复杂度、稳定性学习重点:◆数据结构的“三要素”:逻辑结构、物理存储结构及在这种结构上所定义的操作运算..◆用计算语句频度来估算算法的时间复杂度..第二章线性表内容提要:◆线性表的逻辑结构定义;对线性表定义的操作..线性表的定义:用数据元素的有限序列表示◆线性表的存储结构:顺序存储结构和链式存储结构..顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构..链式存储结构: 其结点在存储器中的位置是随意的;即逻辑上相邻的数据元素在物理上不一定相邻..通过指针来实现◆线性表的操作在两种存储结构中的实现..数据结构的基本运算:修改、插入、删除、查找、排序1)修改——通过数组的下标便可访问某个特定元素并修改之..核心语句:Vi=x;顺序表修改操作的时间效率是O12 插入——在线性表的第i个位置前插入一个元素实现步骤:①将第n至第i 位的元素向后移动一个位置;②将要插入的元素写到第i个位置;③表长加1..注意:事先应判断: 插入位置i 是否合法表是否已满应当符合条件:1≤i≤n+1 或i=1; n+1核心语句:for j=n; j>=i; j--aj+1=a j ;a i =x;n++;插入时的平均移动次数为:nn+1/2÷n+1=n/2≈On3 删除——删除线性表的第i个位置上的元素实现步骤:①将第i+1 至第n 位的元素向前移动一个位置;②表长减1..注意:事先需要判断;删除位置i 是否合法应当符合条件:1≤i≤n 或i=1; n核心语句:for j=i+1; j<=n; j++aj-1=aj;n--;顺序表删除一元素的时间效率为:Tn=n-1/2 ≈On顺序表插入、删除算法的平均空间复杂度为O1单链表:1用单链表结构来存放26个英文字母组成的线性表a;b;c;…;z;请写出C语言程序.. #include<stdio.h>#include<stdlib.h>typedef struct node{char data;struct node *next;}node;node *p;*q;*head; //一般需要3个指针变量int n ; // 数据元素的个数int m=sizeofnode; /*结构类型定义好之后;每个node类型的长度就固定了;m求一次即可*/void build //字母链表的生成..要一个个慢慢链入{int i;head=node*mallocm; //m=sizeofnode 前面已求出p=head;for i=1; i<26; i++ //因尾结点要特殊处理;故i≠26{p->data=i+‘a’-1; // 第一个结点值为字符ap->next=node*mallocm; //为后继结点“挖坑”p=p->next;} //让指针变量P指向后一个结点p->data=i+‘a’-1; //最后一个元素要单独处理p->next=NULL ; //单链表尾结点的指针域要置空}}void display //字母链表的输出{p=head;while p //当指针不空时循环仅限于无头结点的情况{printf"%c";p->data;p=p->next; //让指针不断“顺藤摸瓜”}}(2)单链表的修改或读取(3)思路:要修改第i个数据元素;必须从头指针起一直找到该结点的指针p;然后才能:p>data=new_value读取第i个数据元素的核心语句是:Linklist *findLinklist *head ;int i{int j=1;Linklist *p;P=head->next;Whilep=NULL&&j<i{p=p->next;j++;}return p;}3.单链表的插入链表插入的核心语句:Step 1:s->next=p->next;Step 2:p->next=s ;6.单链表的删除删除动作的核心语句要借助辅助指针变量q:q = p->next; //首先保存b的指针;靠它才能找到c;p->next=q->next; //将a、c两结点相连;淘汰b结点;freeq ;//彻底释放b结点空间7.双向链表的插入操作:设p已指向第i 元素;请在第i 元素前插入元素x:①ai-1的后继从ai 指针是p变为x指针是s :s->next = p ; p->prior->next = s ;②ai 的前驱从ai-1 指针是p->prior变为x 指针是s;s->prior = p ->prior ; p->prior = s ;8.双向链表的删除操作:设p指向第i 个元素;删除第i 个元素后继方向:ai-1的后继由ai 指针p变为ai+1指针p ->next ;p ->prior->next = p->next ;前驱方向:ai+1的前驱由ai 指针p变为ai-1 指针p -> prior ;p->next->prior = p ->prior ;◆数组的逻辑结构定义及存储数组:由一组名字相同、下标不同的变量构成N维数组的特点:n个下标;每个元素受到n个关系约束一个n维数组可以看成是由若干个n-1维数组组成的线性表..存储:事先约定按某种次序将数组元素排成一列序列;然后将这个线性序列存入存储器中..在二维数组中;我们既可以规定按行存储;也可以规定按列存储..设一般的二维数组是Ac1..d1; c2..d2;则行优先存储时的地址公式为:二维数组列优先存储的通式为:◆稀疏矩阵含特殊矩阵的存储及运算..稀疏矩阵:矩阵中非零元素的个数较少一般小于5%学习重点:◆线性表的逻辑结构;指线性表的数据元素间存在着线性关系..在顺序存储结构中;元素存储的先后位置反映出这种线性关系;而在链式存储结构中;是靠指针来反映这种关系的..◆顺序存储结构用一维数组表示;给定下标;可以存取相应元素;属于随机存取的存储结构..◆链表操作中应注意不要使链意外“断开”..因此;若在某结点前插入一个元素;或删除某元素;必须知道该元素的前驱结点的指针..◆掌握通过画出结点图来进行链表单链表、循环链表等的生成、插入、删除、遍历等操作..◆数组主要是二维在以行序/列序为主的存储中的地址计算方法..◆稀疏矩阵的三元组表存储结构..◆稀疏矩阵的十字链表存储方法..补充重点:1.每个存储结点都包含两部分:数据域和指针域链域2.在单链表中;除了首元结点外;任一结点的存储位置由其直接前驱结点的链域的值指示..3.在链表中设置头结点有什么好处头结点即在链表的首元结点之前附设的一个结点;该结点的数据域可以为空;也可存放表长度等附加信息;其作用是为了对链表进行操作时;可以对空表、非空表的情况以及对首元结点进行统一处理;编程更方便..4.如何表示空表1无头结点时;当头指针的值为空时表示空表;2有头结点时;当头结点的指针域为空时表示空表..5.链表的数据元素有两个域;不再是简单数据类型;编程时该如何表示因每个结点至少有两个分量;且数据类型通常不一致;所以要采用结构数据类型..6.sizeofx——计算变量x的长度字节数;mallocm —开辟m字节长度的地址空间;并返回这段空间的首地址;freep ——释放指针p所指变量的存储空间;即彻底删除一个变量..7.链表的运算效率分析:1查找因线性链表只能顺序存取;即在查找时要从头指针找起;查找的时间复杂度为On..2 插入和删除因线性链表不需要移动元素;只要修改指针;一般情况下时间复杂度为O1..但是;如果要在单链表中进行前插或删除操作;因为要从头查找前驱结点;所耗时间复杂度将是On..例:在n个结点的单链表中要删除已知结点*P;需找到它的前驱结点的地址;其时间复杂度为On8. 顺序存储和链式存储的区别和优缺点顺序存储时;逻辑上相邻的数据元素;其物理存放地址也相邻..顺序存储的优点是存储密度大;存储空间利用率高;缺点是插入或删除元素时不方便..链式存储时;相邻数据元素可随意存放;但所占存储空间分两部分;一部分存放结点值;另一部分存放表示结点间关系的指针..链式存储的优点是插入或删除元素时很方便;使用灵活..缺点是存储密度小;存储空间利用率低..◆顺序表适宜于做查找这样的静态操作;◆链表宜于做插入、删除这样的动态操作..◆若线性表的长度变化不大;且其主要操作是查找;则采用顺序表;◆若线性表的长度变化较大;且其主要操作是插入、删除操作;则采用链表..9. 判断:“数组的处理比其它复杂的结构要简单”;对吗答:对的..因为——①数组中各元素具有统一的类型;②数组元素的下标一般具有固定的上界和下界;即数组一旦被定义;它的维数和维界就不再改变..③数组的基本操作比较简单;除了结构的初始化和销毁之外;只有存取元素和修改元素值的操作..10.三元素组表中的每个结点对应于稀疏矩阵的一个非零元素;它包含有三个数据项;分别表示该元素的行下标、列下标和元素值..11.写出右图所示稀疏矩阵的压缩存储形式..解:介绍3种存储形式..法1:用线性表表示:1;2;12 ;1;3;9; 3;1;-3; 3;5;14;4;3;24; 5;2;18 ;6;1;15; 6;4;-7法2:用十字链表表示用途:方便稀疏矩阵的加减运算方法:每个非0元素占用5个域法3:用三元组矩阵表示:稀疏矩阵压缩存储的缺点:将失去随机存取功能代码:1.用数组V来存放26个英文字母组成的线性表a;b;c;…;z;写出在顺序结构上生成和显示该表的C语言程序..char V30;void build //字母线性表的生成;即建表操作{int i;V0='a';for i=1; i<=n-1; i++Vi=Vi-1+1;}void display //字母线性表的显示;即读表操作{int i;for i=0; i<=n-1; i++printf "%c"; vi ;printf "\n " ;}void mainvoid //主函数;字母线性表的生成和输出{n=26; // n是表长;是数据元素的个数;而不是V的实际下标build ;display ;}第三章栈和队列内容提要:◆从数据结构角度来讲;栈和队列也是线性表;其操作是线性表操作的子集;属操作受限的线性表..但从数据类型的角度看;它们是和线性表大不相同的重要抽象数据类型..◆栈的定义及操作..栈是只准在一端进行插入和删除操作的线性表;该端称为栈的顶端..插入元素到栈顶的操作;称为入栈..从栈顶删除最后一个元素的操作;称为出栈..对于向上生成的堆栈:入栈口诀:堆栈指针top “先压后加”: Stop++=an+1出栈口诀:堆栈指针top “先减后弹”: e=S--top◆栈的顺序和链式存储结构;及在这两种结构下实现栈的操作..顺序栈入栈函数PUSHstatus PushElemType e{ iftop>M{上溢}else stop++=e;}顺序栈出栈函数POPstatus Pop{ iftop=L { 下溢}else { e=s--top; returne;}}◆队列的定义及操作;队列的删除在一端队尾;而插入则在队列的另一端队头..因此在两种存储结构中;都需要队头和队尾两个指针..队列:只能在表的一端进行插入运算;在表的另一端进行删除运算的线性表..链队列结点类型定义:typedef Struct QNode{QElemType data; //元素Struct QNode *next; //指向下一结点的指针}Qnode ; * QueuePtr ;链队列类型定义:typedef struct {QueuePtr front ; //队首指针QueuePtr rear ; //队尾指针} LinkQueue;链队示意图:①空链队的特征:front=rear②链队会满吗一般不会;因为删除时有free动作..除非内存不足③入队尾部插入:rear->next=S; rear=S;出队头部删除:front->next=p->next;2.顺序队顺序队类型定义:#define QUEUE-MAXSIZE 100 //最大队列长度typedef struct {QElemType *base; //队列的基址int front; //队首指针int rear; //队尾指针}Sueue建队核心语句:q . base=QElemType *mallocsizeof QElemType* QUEUE_MAXSIZE; //分配空间顺序队示意图:循环队列:队空条件: front = rear 初始化时:front = rear队满条件:front = rear+1 % N N=maxsize队列长度即数据元素个数:L=N+rear-front% N1)初始化一个空队列Status InitQueue Sueue &q //初始化空循环队列q{q . base=QElemType *mallocsizeofQElemType* QUEUE_MAXSIZE; //分配空间if q.base exitOVERFLOW;//内存分配失败;退出程序q.front =q.rear=0; //置空队列return OK;} //InitQueue;2)入队操作Status EnQueueSueue &q; QElemType e{//向循环队列q 的队尾加入一个元素eif q.rear+1 % QUEUE_MAXSIZE = = q.frontreturn ERROR ; //队满则上溢;无法再入队q.rear = q . rear + 1 % QUEUE_MAXSIZE;q.base q.rear = e; //新元素e入队return OK;}// EnQueue;3)出队操作Status DeQueue Sueue &q; QElemType &e{//若队列不空;删除循环队列q的队头元素;//由e 返回其值;并返回OKif q.front = = q.rear return ERROR;//队列空q.front=q.front+1 % QUEUE_MAXSIZE ;e = q.base q.front ;return OK;}// DeQueue◆链队列空的条件是首尾指针相等;而循环队列满的条件的判定;则有队尾加1等于队头和设标记两种方法..补充重点:1.为什么要设计堆栈它有什么独特用途①调用函数或子程序非它莫属;②递归运算的有力工具;③用于保护现场和恢复现场;④简化了程序设计的问题..2.为什么要设计队列它有什么独特用途①离散事件的模拟模拟事件发生的先后顺序;例如CPU芯片中的指令译码队列;②操作系统中的作业调度一个CPU执行多个作业;③简化程序设计..3.什么叫“假溢出”如何解决答:在顺序队中;当尾指针已经到了数组的上界;不能再有入队操作;但其实数组中还有空位置;这就叫“假溢出”..解决假溢出的途径———采用循环队列..4.在一个循环队列中;若约定队首指针指向队首元素的前一个位置..那么;从循环队列中删除一个元素时;其操作是先移动队首位置;后取出元素..5.线性表、栈、队的异同点:相同点:逻辑结构相同;都是线性的;都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表;即受限的线性表只是对插入、删除运算加以限制..不同点:①运算规则不同:线性表为随机存取;而栈是只允许在一端进行插入和删除运算;因而是后进先出表LIFO;队列是只允许在一端进行插入、另一端进行删除运算;因而是先进先出表FIFO..②用途不同;线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事件模拟、OS作业调度和简化设计等..第四章串内容提要:◆串是数据元素为字符的线性表;串的定义及操作..串即字符串;是由零个或多个字符组成的有限序列;是数据元素为单个字符的特殊线性表..串比较:int strcmpchar *s1;char *s2;求串长:int strlenchar *s;串连接:char strcatchar *to;char *from子串T定位:char strchrchar *s;char *c;◆串的存储结构;因串是数据元素为字符的线性表;所以存在“结点大小”的问题..模式匹配算法..串有三种机内表示方法:模式匹配算法:算法目的:确定主串中所含子串第一次出现的位置定位定位问题称为串的模式匹配;典型函数为IndexS;T;posBF算法的实现—即编写IndexS; T; pos函数BF算法设计思想:将主串S的第pos个字符和模式T的第1个字符比较;若相等;继续逐个比较后续字符;若不等;从主串S的下一字符pos+1起;重新与T第一个字符比较..直到主串S的一个连续子串字符序列与模式T相等..返回值为S中与T匹配的子序列第一个字符的序号;即匹配成功..否则;匹配失败;返回值0..Int Index_BPSString S; SString T; int pos{ //返回子串T在主串S中第pos个字符之后的位置..若不存在;则函数值为0.// 其中;T非空;1≤pos≤StrLengthSi=pos; j=1;while i<=S0 && j<=T0 //如果i;j二指针在正常长度范围;{if Si = = Tj {++i; ++j; } //则继续比较后续字符else {i=i-j+2; j=1;} //若不相等;指针后退重新开始匹配}ifj>T0 return i-T0; //T子串指针j正常到尾;说明匹配成功; else return 0; //否则属于i>S0情况;i先到尾就不正常} //Index_BP补充重点:1.空串和空白串有无区别答:有区别..空串Null String是指长度为零的串;而空白串Blank String;是指包含一个或多个空白字符‘’空格键的字符串.2.“空串是任意串的子串;任意串S都是S本身的子串;除S本身外;S的其他子串称为S的真子串..”第六章树和二叉树内容提要:◆树是复杂的非线性数据结构;树;二叉树的递归定义;基本概念;术语..树:由一个或多个n≥0结点组成的有限集合T;有且仅有一个结点称为根root;当n>1时;其余的结点分为mm≥0个互不相交的有限集合T1;T2;…;Tm..每个集合本身又是棵树;被称作这个根的子树..二叉树:是nn≥0个结点的有限集合;由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成..术语:P88◆二叉树的性质;存储结构..性质1: 在二叉树的第i层上至多有2i-1个结点i>0..性质2: 深度为k的二叉树至多有2k-1个结点k>0..性质3: 对于任何一棵二叉树;若2度的结点数有n2个;则叶子数n0必定为n2+1性质4: 具有n个结点的完全二叉树的深度必为性质5: 对完全二叉树;若从上至下、从左至右编号;则编号为i 的结点;其左孩子编号必为2i;其右孩子编号为2i+1;其双亲的编号必为i/2i=1 时为根;除外..二叉树的存储结构:一、顺序存储结构按二叉树的结点“自上而下、从左至右”编号;用一组连续的存储单元存储..若是完全/满二叉树则可以做到唯一复原..不是完全二叉树:一律转为完全二叉树方法很简单;将各层空缺处统统补上“虚结点”;其内容为空..缺点:①浪费空间;②插入、删除不便二、链式存储结构用二叉链表即可方便表示..一般从根结点开始存储..优点:①不浪费空间;②插入、删除方便◆二叉树的遍历..指按照某种次序访问二叉树的所有结点;并且每个结点仅访问一次;得到一个线性序列..遍历规则———二叉树由根、左子树、右子树构成;定义为D、L、R若限定先左后右;则有三种实现方案:DLR LDR LRD先序遍历中序遍历后序遍历◆树的存储结构;树、森林的遍历及和二叉树的相互转换..回顾2:二叉树怎样还原为树要点:逆操作;把所有右孩子变为兄弟讨论1:森林如何转为二叉树法一:①各森林先各自转为二叉树;②依次连到前一个二叉树的右子树上..法二:森林直接变兄弟;再转为二叉树讨论2:二叉树如何还原为森林要点:把最右边的子树变为森林;其余右子树变为兄弟树和森林的存储方式:树有三种常用存储方式:①双亲表示法②孩子表示法③孩子—兄弟表示法问:树→二叉树的“连线—抹线—旋转”如何由计算机自动实现答:用“左孩子右兄弟”表示法来存储即可..存储的过程就是树转换为二叉树的过程树、森林的遍历:①先根遍历:访问根结点;依次先根遍历根结点的每棵子树..②后根遍历:依次后根遍历根结点的每棵子树;访问根结点..讨论:树若采用“先转换;后遍历”方式;结果是否一样1. 树的先根遍历与二叉树的先序遍历相同;2. 树的后根遍历相当于二叉树的中序遍历;3. 树没有中序遍历;因为子树无左右之分..①先序遍历若森林为空;返回;访问森林中第一棵树的根结点;先根遍历第一棵树的根结点的子树森林;先根遍历除去第一棵树之后剩余的树构成的森林..②中序遍历若森林为空;返回;中根遍历森林中第一棵树的根结点的子树森林;访问第一棵树的根结点;中根遍历除去第一棵树之后剩余的树构成的森林..◆二叉树的应用:哈夫曼树和哈夫曼编码..Huffman树:最优二叉树带权路径长度最短的树Huffman编码:不等长编码..树的带权路径长度:树中所有叶子结点的带权路径长度之和构造Huffman树的基本思想:权值大的结点用短路径;权值小的结点用长路径..构造Huffman树的步骤即Huffman算法:1 由给定的n 个权值{ w1; w2; …; wn }构成n棵二叉树的集合F = { T1; T2; …; Tn } 即森林;其中每棵二叉树Ti 中只有一个带权为wi 的根结点;其左右子树均空..2 在F 中选取两棵根结点权值最小的树做为左右子树构造一棵新的二叉树;且让新二叉树根结点的权值等于其左右子树的根结点权值之和..3 在F 中删去这两棵树;同时将新得到的二叉树加入F中..4 重复2 和3 ; 直到F 只含一棵树为止..这棵树便是Huffman树..具体操作步骤:学习重点:本章内容是本课程的重点◆二叉树性质及证明方法;并能把这种方法推广到K叉树..◆二叉树遍历;遍历是基础;由此导出许多实用的算法;如求二叉树的高度、各结点的层次数、度为0、1、2的结点数..◆由二叉树遍历的前序和中序序列或后序和中序序列可以唯一构造一棵二叉树..由前序和后序序列不能唯一确定一棵二叉树..◆完全二叉树的性质..◆树、森林和二叉树间的相互转换..◆哈夫曼树的定义、构造及求哈夫曼编码..补充:1.满二叉树和完全二叉树有什么区别答:满二叉树是叶子一个也不少的树;而完全二叉树虽然前k-1层是满的;但最底层却允许在右边缺少连续若干个结点..满二叉树是完全二叉树的一个特例..2.Huffman树有什么用最小冗余编码、信息高效传输第七章图内容提要:◆图的定义;概念、术语及基本操作..图:记为G=V; E其中:V 是G 的顶点集合;是有穷非空集;E 是G 的边集合;是有穷集..术语:见课件◆图的存储结构..1.邻接矩阵数组表示法①建立一个顶点表和一个邻接矩阵②设图A = V; E 有n 个顶点;则图的邻接矩阵是一个二维数组A.Edgenn..注:在有向图的邻接矩阵中;第i行含义:以结点vi为尾的弧即出度边;第i列含义:以结点vi为头的弧即入度边..邻接矩阵法优点:容易实现图的操作;如:求某顶点的度、判断顶点之间是否有边弧、找顶点的邻接点等等..邻接矩阵法缺点:n个顶点需要n*n个单元存储边弧;空间效率为On2..2.邻接表链式表示法①对每个顶点vi 建立一个单链表;把与vi有关联的边的信息即度或出度边链接起来;表中每个结点都设为3个域:②每个单链表还应当附设一个头结点设为2个域;存vi信息;③每个单链表的头结点另外用顺序存储结构存储..邻接表的优点:空间效率高;容易寻找顶点的邻接点;邻接表的缺点:判断两顶点间是否有边或弧;需搜索两结点对应的单链表;没有邻接矩阵方便..◆图的遍历..遍历定义:从已给的连通图中某一顶点出发;沿着一些边;访遍图中所有的顶点;且使每个顶点仅被访问一次;就叫做图的遍历;它是图的基本运算..图常用的遍历:一、深度优先搜索;二、广度优先搜索深度优先搜索遍历步骤:①访问起始点v;②若v的第1个邻接点没访问过;深度遍历此邻接点;③若当前邻接点已访问过;再找v的第2个邻接点重新遍历..基本思想:——仿树的先序遍历过程..广度优先搜索遍历步骤:①在访问了起始点v之后;依次访问v的邻接点;②然后再依次顺序访问这些点下一层中未被访问过的邻接点;③直到所有顶点都被访问过为止..◆图的应用最小生成树;最短路经最小生成树MST的性质如下:若U集是V的一个非空子集;若u0; v0是一条最小权值的边;其中u0 U;v0 V-U;则:u0; v0必在最小生成树上..求MST最常用的是以下两种:Kruskal克鲁斯卡尔算法、Prim普里姆算法Kruskal算法特点:将边归并;适于求稀疏网的最小生成树..Prime算法特点: 将顶点归并;与边数无关;适于稠密网..在带权有向图中A点源点到达B点终点的多条路径中;寻找一条各边权值之和最小的路径;即最短路径..两种常见的最短路径问题:一、单源最短路径—用Dijkstra迪杰斯特拉算法二、所有顶点间的最短路径—用Floyd弗洛伊德算法一、单源最短路径Dijkstra算法一顶点到其余各顶点v0→j目的:设一有向图G=V; E;已知各边的权值;以某指定点v0为源点;求从v0到图的其余各点的最短路径..限定各边上的权值大于或等于0..二、所有顶点之间的最短路径可以通过调用n次Dijkstra算法来完成;还有更简单的一个算法:Floyd算法自学..学习重点:图是应用最广泛的一种数据结构;本章也是这门课程的重点..◆基本概念中;连通分量;生成树;邻接点是重点..①连通图:在无向图中; 若从顶点v1到顶点v2有路径; 则称顶点v1与v2是连通的..如果图中任意一对顶点都是连通的; 则称此图是连通图..非连通图的极大连通子图叫做连通分量..②生成树:是一个极小连通子图;它含有图中全部n个顶点;但只有n-1条边..③邻接点:若u; v 是EG 中的一条边;则称u 与v 互为邻接顶点..◆图是复杂的数据结构;也有顺序和链式两种存储结构:数组表示法重点是邻接距阵和邻接表..这两种存储结构对有向图和无向图均适用◆图的遍历是图的各种算法的基础;应熟练掌握图的深度、广度优先遍历..◆连通图的最小生成树不是唯一的;但最小生成树边上的权值之和是唯一的.. 应熟练掌握prim和kruscal算法;特别是手工分步模拟生成树的生成过程..◆从单源点到其他顶点;以及各个顶点间的最短路径问题;掌握熟练手工模拟..补充:1.问:当有向图中仅1个顶点的入度为0;其余顶点的入度均为1;此时是何形状答:是树而且是一棵有向树2.讨论:邻接表与邻接矩阵有什么异同之处1. 联系:邻接表中每个链表对应于邻接矩阵中的一行;链表中结点个数等于一行中非零元素的个数..2. 区别:对于任一确定的无向图;邻接矩阵是唯一的行列号与顶点编号一致;但邻接表不唯一链接次序与顶点编号无关..3. 用途:邻接矩阵多用于稠密图的存储而邻接表多用于稀疏图的存储3.若对连通图进行遍历;得到的是生成树若对非连通图进行遍历;得到的是生成森林..第八章查找内容提要:◆查找表是称为集合的数据结构..是元素间约束力最差的数据结构:元素间的关系是元素仅共在同一个集合中..同一类型的数据元素构成的集合◆查找表的操作:查找;插入;删除..◆静态查找表:顺序表;有序表等..针对静态查找表的查找算法主要有:顺序查找、折半查找、分块查找一、顺序查找线性查找技巧:把待查关键字key存入表头或表尾俗称“哨兵”;这样可以加快执行速度..int Search_Seq SSTable ST ; KeyType key {ST.elem0.key =key;for i=ST.length; ST.elem i .key=key; - - i ;return i;} // Search_Seq。
(完整版)数据结构知识点总结
数据结构知识点概括第一章概论数据就是指能够被计算机识别、存储和加工处理的信息的载体。
数据元素是数据的基本单位,可以由若干个数据项组成。
数据项是具有独立含义的最小标识单位。
数据结构的定义:·逻辑结构:从逻辑结构上描述数据,独立于计算机。
·线性结构:一对一关系。
·线性结构:多对多关系。
·存储结构:是逻辑结构用计算机语言的实现。
·顺序存储结构:如数组。
·链式存储结构:如链表。
·索引存储结构:·稠密索引:每个结点都有索引项。
·稀疏索引:每组结点都有索引项。
·散列存储结构:如散列表。
·数据运算。
·对数据的操作。
定义在逻辑结构上,每种逻辑结构都有一个运算集合。
·常用的有:检索、插入、删除、更新、排序。
数据类型:是一个值的集合以及在这些值上定义的一组操作的总称。
·结构类型:由用户借助于描述机制定义,是导出类型。
抽象数据类型ADT:·是抽象数据的组织和与之的操作。
相当于在概念层上描述问题。
·优点是将数据和操作封装在一起实现了信息隐藏。
程序设计的实质是对实际问题选择一种好的数据结构,设计一个好的算法。
算法取决于数据结构。
算法是一个良定义的计算过程,以一个或多个值输入,并以一个或多个值输出。
评价算法的好坏的因素:·算法是正确的;·执行算法的时间;·执行算法的存储空间(主要是辅助存储空间);·算法易于理解、编码、调试。
时间复杂度:是某个算法的时间耗费,它是该算法所求解问题规模n的函数。
渐近时间复杂度:是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。
评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度。
算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。
时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、……k次方阶O(n^k)、指数阶O(2^n)。
数据结构试验报告-图的基本操作
中原工学院《数据结构》实验报告学院:计算机学院专业:计算机科学与技术班级:计科112姓名:康岩岩学号:201100814220 指导老师:高艳霞2012-11-22实验五图的基本操作一、实验目的1、使学生可以巩固所学的有关图的基本知识。
2、熟练掌握图的存储结构。
3、熟练掌握图的两种遍历算法。
二、实验内容[问题描述]对给定图,实现图的深度优先遍历和广度优先遍历。
[基本要求]以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
【测试数据】由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作1、掌握图的相关概念。
2、掌握图的逻辑结构和存储结构。
3、掌握图的两种遍历算法的实现。
四、实验报告要求1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
【设计思路】【代码整理】#include "stdafx.h"#include <iostream>#include <malloc.h>using namespace std;typedef int Status;#define OK 1#define ERROR 0#define OVERFLOW -1#define MAX_SIZE 20typedef enum{DG,DN,UDG,UDN}Kind;typedef struct ArcNode{int adjvex; //顶点位置struct ArcNode *nextarc; //下一条弧int *info; //弧信息};typedef struct{char info[10]; //顶点信息ArcNode *fistarc; //指向第一条弧}VNode,AdjList[MAX_SIZE];typedef struct{AdjList vertices;int vexnum,arcnum; //顶点数,弧数int kind; //图的种类,此为无向图}ALGraph;//这是队列的节点,仅用于广度优先搜索typedef struct Node{int num;struct Node* next;};//队列的头和尾typedef struct{Node * front;Node *rear;}PreBit;int LocateV ex(ALGraph G,char info[]);//定位顶点的位置Status addArcNode(ALGraph &G,int adjvex); //图中加入弧Status CreatGraph(ALGraph&G);//创建图的邻接表Status DFSTraverse(ALGraph G);//深度优先搜索Status BFSTraverse(ALGraph G);//广度优先搜索Status DFS(ALGraph G,int v);//深度优先搜索中的数据读取函数,用于递归bool visited[MAX_SIZE]; // 访问标志数组//初始化队列Status init_q(PreBit&P_B){P_B.front=P_B.rear=(Node*)malloc(sizeof(Node));if(!P_B.front){exit(OVERFLOW);}P_B.front->next=NULL;}//将数据入队Status en_q(PreBit & P_B,int num){Node *p=(Node*)malloc(sizeof(Node));if(!p){exit(OVERFLOW);}p->num=num;p->next=NULL;P_B.rear->next=p;P_B.rear=p;return OK;}//出队Status de_q(PreBit & P_B){if(P_B.front==P_B.rear){return ERROR;}Node* p=P_B.front->next;P_B.front->next=p->next;if(P_B.rear==p){P_B.rear=P_B.front;}free(p);return OK;}Status CreatGraph(ALGraph&G){cout<<"请输入顶点数目和弧数目"<<endl;cin>>G.vexnum>>G.arcnum;//依次输入顶点信息for(int i=0;i<G.vexnum;i++){cout<<"请输入顶点名称"<<endl;cin>>G.vertices[i].info;G.vertices[i].fistarc=NULL;}//依次输入弧信息for(int k=1;k<=G.arcnum;k++){char v1[10],v2[10]; //用于表示顶点名称的字符数组int i,j; //表示两个顶点的位置BACK: //返回点cout<<"请输入第"<<k<<"条弧的两个顶点"<<endl;cin>>v1>>v2;i=LocateV ex(G,v1); //得到顶点v1的位置j=LocateV ex(G,v2); //得到顶点v2的位置if(i==-1||j==-1){ //头信息不存在则返回重输cout<<"不存在该节点!"<<endl;goto BACK; //跳到BACK 返回点}addArcNode(G,i); //将弧的顶点信息插入表中addArcNode(G,j);}return OK;}//倒序插入弧的顶点信息Status addArcNode(ALGraph &G,int adjvex){ArcNode *p; //弧节点指针p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=adjvex;p->nextarc=G.vertices[adjvex].fistarc;//指向头结点的第一条弧G.vertices[adjvex].fistarc=p; //头结点的第一条弧指向p,即将p作为头结点的第一条弧return OK;}//定位顶点的位置int LocateV ex(ALGraph G,char info[]){for(int i=0;i<G.vexnum;i++){if(strcmp(G.vertices[i].info,info)==0){ //头结点名称与传入的信息相等,证明该头节点存在return i; //此时返回位置}}return -1;}//深度优先搜索Status DFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int i;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;i=LocateV ex(G,v1);if(i==-1){cout<<"不存在该节点!"<<endl;goto BACK;}DFS(G,i);return OK;}//深度优先搜索递归访问图Status DFS(ALGraph G,int v){visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息ArcNode *p;p=G.vertices[v].fistarc; //向头节点第一条while(p) //当弧存在{if(!visited[p->adjvex]){DFS(G,p->adjvex); //递归读取}p=p->nextarc;}return OK;}//广度优先搜索Status BFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int v;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;v=LocateV ex(G,v1);if(v==-1){cout<<"不存在该节点!"<<endl;goto BACK;}PreBit P_B;init_q(P_B);ArcNode *p;visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息en_q(P_B,v); //将头位置v入队while(P_B.front!=P_B.rear){//当队列不为空时,对其进行访问int w=P_B.front->next->num;//读出顶点位置de_q(P_B);//顶点已经访问过,将其出队列p=G.vertices[w].fistarc;//得到与顶点相关的第一条弧while(p){if(!visited[p->adjvex]){en_q(P_B,p->adjvex);//将弧入队,但不读取,只是将其放在队尾}p=p->nextarc;}}return OK;}int _tmain(int argc, _TCHAR* argv[]){ALGraph G;CreatGraph(G);cout<<"深度优先搜索图:"<<endl;DFSTraverse(G);cout<<endl;cout<<"广度优先搜索图:"<<endl;BFSTraverse(G);cout<<endl;system("pause");return 0;}。
数据结构串的基本操作
串的生成(StrAssign)、串的比较(StrCompare)、串的联接(StrCombine)、求串的长度(StrLength)和求串的子串(StrSub)这5个操作构成的集合为OperationSet中的最小操作子集。
#include <stdio.h>#include <stdlib.h>#define MaxSize 100typedef struct{char data[MaxSize];int len;}SqString;void StrAssign(SqString &str,char cstr[]){int i;for (i=0;cstr[i]!='\0';i++)str.data[i]=cstr[i];str.len=i;}SqString StrCombine(SqString s,SqString t){SqString str;int i;str.len=s.len+t.len;for (i=0;i<s.len;i++)str.data[i]=s.data[i];for (i=0;i<t.len;i++)str.data[s.len+i]=t.data[i];return str;}SqString SubStr(SqString s,int i,int j){SqString str;int k;str.len=0;if(i<=0 || i>s.len || j<0 || i+j-1>s.len){printf("参数不正确\n");return str;}for(k=i-1;k<i+j-1;k++)str.data[k-i+1]=s.data[k];str.len=j;return str;}int StrCompare(SqString s,SqString t){int same=1,i;if (s.len!=t.len)same=0;elsefor (i=0;i<s.len;i++)if (s.data[i]!=t.data[i]){same=0;break;}return same;}SqString RepStr(SqString s,int i,int j,SqString t) {int k;SqString str;str.len=0;if (i<=0 || i>s.len || i+j-1>s.len){printf("参数不正确\n");return str;}for (k=0;k<i-1;k++)str.data[k]=s.data[k];for (k=0;k<t.len;k++)str.data[i+k-1]=t.data[k];for (k=i+j-1;k<s.len;k++)str.data[t.len+k-j]=s.data[k];str.len=s.len-j+t.len;return str;}int StrLength(SqString s){return s.len;}void ShowS(SqString s){int i;if (s.len>0){for (i=0;i<s.len;i++)printf("%c",s.data[i]);printf("\n");}}int main(){SqString s,s1,s2,s3,s4,s5;printf("--------------开始字符串的操作-------------\n");printf("建立串S和S1\n");StrAssign(s,"makesuccess");StrAssign(s1,"you");printf("输出串S\n");ShowS(s);printf("输出串S1\n");ShowS(s1);printf("输出串S的长度\n");printf("%d\n",StrLength(s));printf("输出串S1的长度\n");printf("%d\n",StrLength(s1));printf("提取串S的第2个字符开始的3个字符而生成串S2\n");s2 = SubStr(s,2,3);printf("输出串S2\n");ShowS(s2);printf("将串S1和S2连接起来而生成串S3\n");s3 = StrCombine(s1,s2);printf("输出串S3\n");ShowS(s3);printf("将串S的第4个字符开始的3个字符替换成串S1而生成串S4\n");s4 = RepStr(s,4,3,s1);printf("输出串S4\n");ShowS(s4);printf("串S4的长度\n");printf("%d\n",StrLength(s4));printf("提取串S4的第5个字符开始的4个字符而生成串S5\n");s5 = SubStr(s4,5,4);printf("输出串S5\n");ShowS(s5);printf("---------------字符串的操作完成-------------\n");return 0;}。
数据结构必考知识点总结
数据结构必考知识点总结在准备考试时,了解数据结构的基本概念和相关算法是非常重要的。
以下是一些数据结构的必考知识点总结:1. 基本概念数据结构的基本概念是非常重要的,包括数据、数据元素、数据项、数据对象、数据类型、抽象数据类型等的概念。
了解这些概念有助于更好地理解数据结构的本质和作用。
2. 线性表线性表是数据结构中最基本的一种,它包括顺序表和链表两种实现方式。
顺序表是将数据元素存放在一块连续的存储空间内,而链表是将数据元素存放在若干个节点中,每个节点包含数据和指向下一个节点的指针。
了解线性表的概念和基本操作是非常重要的。
3. 栈和队列栈和队列是两种特殊的线性表,它们分别具有后进先出和先进先出的特性。
栈和队列的实现方式有多种,包括数组和链表。
掌握栈和队列的基本操作和应用是数据结构的基本内容之一。
4. 树结构树是一种非线性的数据结构,它包括二叉树、多路树、二叉搜索树等多种形式。
了解树的基本定义和遍历算法是必考的知识点。
5. 图结构图是一种非线性的数据结构,它包括有向图和无向图两种形式。
了解图的基本概念和相关算法是非常重要的,包括图的存储方式、遍历算法、最短路径算法等。
6. 排序算法排序是一个非常重要的算法问题,掌握各种排序算法的原理和实现方式是必不可少的。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。
7. 查找算法查找是另一个重要的算法问题,包括顺序查找、二分查找、哈希查找、树查找等。
了解各种查找算法的原理和实现方式是必考的知识点之一。
8. 算法复杂度分析算法的时间复杂度和空间复杂度是评价算法性能的重要指标,掌握复杂度分析的方法和技巧是非常重要的。
9. 抽象数据类型ADT是数据结构的一种概念模型,它包括数据的定义和基本操作的描述。
了解ADT的概念和实现方式是非常重要的。
10. 动态存储管理动态存储管理是数据结构中一个重要的问题,包括内存分配、内存释放、内存回收等。
了解动态存储管理的基本原理和实现方式是必考的知识点之一。
数据结构知识点全面总结—精华版
数据结构知识点全⾯总结—精华版第1章绪论内容提要:◆数据结构研究的内容。
针对⾮数值计算的程序设计问题,研究计算机的操作对象以及它们之间的关系和操作。
数据结构涵盖的内容:◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型。
数据——所有能被计算机识别、存储和处理的符号的集合。
数据元素——是数据的基本单位,具有完整确定的实际意义。
数据对象——具有相同性质的数据元素的集合,是数据的⼀个⼦集。
数据结构——是相互之间存在⼀种或多种特定关系的数据元素的集合,表⽰为:Data_Structure=(D, R)数据类型——是⼀个值的集合和定义在该值上的⼀组操作的总称。
抽象数据类型——由⽤户定义的⼀个数学模型与定义在该模型上的⼀组操作,它由基本的数据类型构成。
◆算法的定义及五个特征。
算法——是对特定问题求解步骤的⼀种描述,它是指令的有限序列,是⼀系列输⼊转换为输出的计算步骤。
算法的基本特性:输⼊、输出、有穷性、确定性、可⾏性◆算法设计要求。
①正确性、②可读性、③健壮性、④效率与低存储量需求◆算法分析。
时间复杂度、空间复杂度、稳定性学习重点:◆数据结构的“三要素”:逻辑结构、物理(存储)结构及在这种结构上所定义的操作(运算)。
◆⽤计算语句频度来估算算法的时间复杂度。
内容提要:◆线性表的逻辑结构定义,对线性表定义的操作。
线性表的定义:⽤数据元素的有限序列表⽰◆线性表的存储结构:顺序存储结构和链式存储结构。
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
链式存储结构: 其结点在存储器中的位置是随意的,即逻辑上相邻的数据元素在物理上不⼀定相邻。
通过指针来实现!◆线性表的操作在两种存储结构中的实现。
数据结构的基本运算:修改、插⼊、删除、查找、排序1)修改——通过数组的下标便可访问某个特定元素并修改之。
核⼼语句: V[i]=x;顺序表修改操作的时间效率是 O(1)2) 插⼊——在线性表的第i个位置前插⼊⼀个元素实现步骤:①将第n⾄第i 位的元素向后移动⼀个位置;②将要插⼊的元素写到第i个位置;③表长加1。
数据结构 知识点总结
数据结构知识点总结一、数据结构基础概念数据结构是指数据元素之间的关系,以及对数据元素进行操作的方法的总称。
数据结构是计算机科学中非常基础的概念,它为计算机程序的设计和实现提供了基础架构。
数据结构的研究内容包括数据的逻辑结构、数据的存储结构以及对数据进行操作的算法。
1.1 数据结构的分类数据结构可以根据数据的逻辑关系和数据的物理存储方式进行分类,常见的数据结构分类包括线性结构、树形结构、图结构等。
1.2 数据结构的基本概念(1)数据元素:数据结构中的基本单位,可以是原子类型或者复合类型。
(2)数据项:数据元素中的一个组成部分,通常是基本类型。
(3)数据结构的逻辑结构:指数据元素之间的逻辑关系,包括线性结构、树形结构、图结构等。
(4)数据结构的存储结构:指数据元素在计算机内存中的存储方式,包括顺序存储结构和链式存储结构等。
1.3 数据结构的特点数据结构具有以下几个特点:(1)抽象性:数据结构是对现实世界中的数据进行抽象和模型化的结果。
(2)实用性:数据结构是在解决实际问题中得出的经验总结,是具有广泛应用价值的。
(3)形式化:数据结构具有精确的数学定义和描述,可以进行分析和证明。
(4)计算性:数据结构是为了使计算机程序更加高效而存在的。
二、线性结构线性结构是数据元素之间存在一对一的关系,是一种最简单的数据结构。
常见的线性结构包括数组、链表、栈和队列等。
2.1 线性表线性表是数据元素之间存在一对一的关系的数据结构,可以采用顺序存储结构或者链式存储结构实现。
(1)顺序存储结构:线性表采用数组的方式进行存储,数据元素在内存中连续存储。
(2)链式存储结构:线性表采用链表的方式进行存储,数据元素在内存中非连续存储,通过指针将它们进行连接。
2.2 栈栈是一种特殊的线性表,只允许在一端进行插入和删除操作,这一端称为栈顶。
栈的操作遵循后进先出(LIFO)的原则。
2.3 队列队列也是一种特殊的线性表,允许在一端进行插入操作,另一端进行删除操作,这两端分别称为队尾和队首。
数据结构--实验报告 线性表的基本操作
数据结构--实验报告线性表的基本操作线性表的基本操作实验报告1.引言线性表是最基本的数据结构之一,它可以用来存储一系列具有相同数据类型的元素。
本实验旨在通过实践掌握线性表的基本操作,包括插入、删除、查找和修改元素等。
本文档将详细介绍实验所需的步骤和操作方法。
2.实验目的1.掌握线性表的插入和删除操作。
2.理解线性表的查找和修改元素的方法。
3.熟悉线性表的基本操作在算法中的应用。
3.实验环境本实验使用编程语言/软件名称作为开发环境,具体要求如下:________●操作系统:________操作系统名称和版本●编程语言:________编程语言名称和版本4.实验步骤4.1 初始化线性表在程序中创建一个空的线性表,用于存储元素。
实现方法:________具体的初始化方法和代码示例 4.2 插入元素在线性表中指定位置插入一个新元素。
实现方法:________具体的插入元素方法和代码示例 4.3 删除元素删除线性表中指定位置的元素。
实现方法:________具体的删除元素方法和代码示例 4.4 查找元素在线性表中查找指定元素的位置。
实现方法:________具体的查找元素方法和代码示例 4.5 修改元素修改线性表中指定位置的元素值。
实现方法:________具体的修改元素方法和代码示例5.实验结果在完成上述步骤后,我们得到了一个可以进行插入、删除、查找和修改元素的线性表。
具体操作结果如下:________●插入元素操作结果:________插入元素的具体操作结果●删除元素操作结果:________删除元素的具体操作结果●查找元素操作结果:________查找元素的具体操作结果●修改元素操作结果:________修改元素的具体操作结果6.实验总结通过本次实验,我们深入理解了线性表的基本操作,并且掌握了这些操作的实现方法。
线性表在实际应用中十分常见,熟练掌握线性表的操作对于开发高效的算法和数据结构具有重要意义。
数据结构课件总结
1. 掌握栈和队列这两种抽象数据类型的特点,并能相应的 应用问题中正确选用它们。
2. 熟练掌握栈类型的两种实现方法,即两种存储结构表示时 的基本操作实现算法,特别应注意栈满和栈空的条件以及 它们的描述方法。
3. 熟练掌握循环队列和链队列的基本操作实现算法,特别注 意队满和队空的描述方法。
4. 理解递归算法执行过程中栈的状态变化过程。
第四章 数组和广义表的学习要点:
1. 了解数组的两种存储表示方法,并掌握数组在以行为主的存 储结构中的地址计算方法。
2. 掌握对特殊矩阵进行压缩存储时的下标变换公式。 3. 了解稀疏矩阵的压缩存储方法的特点,领会以三元组表示稀
疏矩阵时进行矩阵运算采用的处理方法。 4. 掌握广义表的结构特点及其存储表示方法,可将一个非空广
3. 理解教科书中讨论的各种图的算法。
第八章 查找表的学习要点:
1. 熟练掌握顺序表和有序表的查找方法,理解分块查找的方法 和索引存储结构。
2. 熟练掌握二叉排序树的构造和查找方法。 3. 理解在二叉排序树上删除结点的过程。 3. 掌握二叉平衡树的维护平衡方法。 4. 掌握B-树的概念,理解建树、查找和删除结点的过程。 5. 掌握B+树和键树的概念及其特点,以及在其上查找关键字的
义表分解为表头和表尾两部分。
第五章 串的学习要点:
1. 熟悉串的七种基本操作的定义,并能利用这些基本 操作来实现串的其它各种操作。
2. 熟练掌握在串的定长顺序存储结构上实现串的各种 操作的方法。
3. 了解串操作的应用方法和特点。
第六章 树的学习要点:
1. 熟练掌握树、二叉树中的基本概念和性质。 2. 遍历二叉树是二叉树各种操作的基础。不仅要熟练掌握各
大学计算机基础超详细知识点总结3篇
大学计算机基础超详细知识点总结第一篇:数据结构与算法基础知识总结1.数据结构1.1线性结构线性结构是指数据元素之间存在一对一的关系,即除了第一个元素和最后一个元素,其它元素都是首尾相接的。
如:数组、链表、队列、栈等。
1.2非线性结构非线性结构是指数据元素之间存在一对多或多对多的关系,常见的有树、图等。
1.3基本操作数据结构的基本操作包括:查找、插入、删除、修改、排序、统计等。
2.算法算法是指解决问题的步骤和方法。
算法的分类有很多种,这里介绍几种常见的算法分类。
2.1按照递归与非递归递归算法是指在算法过程中调用自身的算法,非递归算法是指不调用自身的算法。
2.2按照时间复杂度算法的时间复杂度是指算法执行所需的时间,通常用大O 表示法表示。
按照时间复杂度,算法可以分为多项式时间算法和指数时间算法。
2.3按照空间复杂度算法的空间复杂度是指算法执行所需的内存空间,通常用大O表示法表示。
2.4按照性质算法可以按照性质分为贪心算法、动态规划算法、回溯算法、分治算法等。
每种算法都有自己的特点和适用范围。
3.常用算法优化技巧3.1空间换时间有些算法时间复杂度高,但是可以通过空间换时间的方式来进行优化。
比如,哈希表就是一种将空间换时间的方式。
3.2并行算法并行算法是指将一个大的问题分成许多小的子问题,然后将这些子问题并行处理,最后合并得到问题的解。
并行算法可以充分利用多核CPU,提高算法的效率。
3.3分治算法分治算法是指将一个大问题分成许多小问题进行解决,最后将小问题的解合并得到大问题的解。
分治算法适用于处理大量数据的情况。
4.数据结构与算法的应用数据结构和算法在计算机科学中得到了广泛应用,比如:4.1排序算法排序算法是数据结构和算法中最基本的一类问题,常用于对数据进行排序,比如冒泡排序、快速排序、归并排序等。
4.2图像处理在图像处理中,数据结构和算法常用于图像的压缩、平滑处理和特征提取等。
4.3机器学习机器学习是一种应用广泛的领域,数据结构和算法在机器学习中扮演着重要的角色,比如分类、聚类、回归等。
数据结构知识点笔记
数据结构知识点笔记一、数据结构的概念数据结构是计算机科学中一门重要的学科,它研究如何组织和存储数据,以便高效地访问和操作。
数据结构可以分为物理结构和逻辑结构两个层次。
物理结构指数据在计算机内存中的存储方式,而逻辑结构则指数据之间的逻辑关系。
二、常用的数据结构1. 数组(Array)数组是最基本的数据结构之一,它以连续的存储空间来保存相同类型的数据。
数组的特点是可以通过下标快速访问元素,但插入和删除操作较慢。
2. 链表(Linked List)链表是一种动态数据结构,它通过指针将一组节点串联起来。
链表的特点是插入和删除操作效率高,但访问元素需要遍历整个链表。
3. 栈(Stack)栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。
栈主要用于函数调用和表达式求值等场景。
4. 队列(Queue)队列是一种先进先出(FIFO)的数据结构,只能在队列的一端进行插入操作,在另一端进行删除操作。
队列主要用于任务调度和缓冲区管理等场景。
5. 树(Tree)树是一种非线性的数据结构,由父节点和子节点组成。
树常用于组织和管理具有层级关系的数据,如文件系统和数据库索引等。
6. 图(Graph)图是一种由节点和边组成的数据结构,节点表示数据,边表示节点之间的关系。
图广泛应用于网络分析和路径搜索等领域。
三、常见的数据结构操作1. 插入(Insert)插入操作将新的数据元素加入到数据结构中的特定位置。
不同的数据结构插入操作的复杂度各不相同,需要根据具体情况选择合适的数据结构。
2. 删除(Delete)删除操作将指定的数据元素从数据结构中移除。
和插入操作一样,删除操作的复杂度也依赖于具体的数据结构。
3. 查找(Search)查找操作用于在数据结构中寻找指定值的元素。
不同的数据结构采用不同的查找算法,如线性查找、二分查找和哈希查找等。
4. 排序(Sort)排序操作将数据结构中的元素按特定规则重新排列。
排序算法可以分为比较排序和非比较排序两种类型,如冒泡排序、快速排序和归并排序等。
数据结构实验报告-实验一顺序表、单链表基本操作的实现
数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。
(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。
(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。
l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。
数据结构实验报告顺序表
数据结构实验报告顺序表数据结构实验报告:顺序表摘要:顺序表是一种基本的数据结构,它通过一组连续的存储单元来存储线性表中的数据元素。
在本次实验中,我们将通过实验来探索顺序表的基本操作和特性,包括插入、删除、查找等操作,以及顺序表的优缺点和应用场景。
一、实验目的1. 理解顺序表的概念和特点;2. 掌握顺序表的基本操作;3. 了解顺序表的优缺点及应用场景。
二、实验内容1. 实现顺序表的初始化操作;2. 实现顺序表的插入操作;3. 实现顺序表的删除操作;4. 实现顺序表的查找操作;5. 对比顺序表和链表的优缺点;6. 分析顺序表的应用场景。
三、实验步骤与结果1. 顺序表的初始化操作在实验中,我们首先定义了顺序表的结构体,并实现了初始化操作,即分配一定大小的存储空间,并将表的长度设为0,表示表中暂时没有元素。
2. 顺序表的插入操作接下来,我们实现了顺序表的插入操作。
通过将插入位置后的元素依次向后移动一位,然后将新元素插入到指定位置,来实现插入操作。
我们测试了在表中插入新元素的情况,并验证了插入操作的正确性。
3. 顺序表的删除操作然后,我们实现了顺序表的删除操作。
通过将删除位置后的元素依次向前移动一位,来实现删除操作。
我们测试了在表中删除元素的情况,并验证了删除操作的正确性。
4. 顺序表的查找操作最后,我们实现了顺序表的查找操作。
通过遍历表中的元素,来查找指定元素的位置。
我们测试了在表中查找元素的情况,并验证了查找操作的正确性。
四、实验总结通过本次实验,我们对顺序表的基本操作有了更深入的了解。
顺序表的插入、删除、查找等操作都是基于数组的操作,因此在插入和删除元素时,需要移动大量的元素,效率较低。
但是顺序表的优点是可以随机访问,查找效率较高。
在实际应用中,顺序表适合于元素数量不变或变化不大的情况,且需要频繁查找元素的场景。
综上所述,顺序表是一种基本的数据结构,我们通过本次实验对其有了更深入的了解,掌握了顺序表的基本操作,并了解了其优缺点及应用场景。
数据结构实验报告 顺序表基本操作
四、实验步骤
一 1. 编 写 头 文 件 。 定 义 数 据 类 型 。 分 别 写 各 个 函 数 如 ListInsern_Sq , ListDelete_Sq,LocateElem 等函数。 2.编写主函数。 在主函数里构造空的线性表, 然后利用 ListInsert 函数使用户 初始化线性表。然后调用函数操作,操作结果用 PrintList_Sq 打印出线性表的内 容 3.运行程序,完整代码见下:
-4-
else { printf("输入位置有错! \n"); printf("-------------------------------------\n"); }/**/ printf("请输入你要删除的元素的位置:\n");//删除元素 scanf("%d",&i); if(ListDelete_Sq(La,i,e)) { printf("你删除的元素为: %d,删除元素后线性表为:\n",e); PrintList_Sq(La); printf("-------------------------------------\n"); } else { printf("输入位置有错! \n"); printf("-------------------------------------\n"); } printf("请输入你要查找的元素:\n");//查找元素 scanf("%d",&e); if(i=LocateElem_Sq(La,e,cmp)) { printf("你要查找的元素在第 %d 个位置。\n",i); printf("-------------------------------------\n"); } else { printf("找不到这个元素: \n"); printf("-------------------------------------\n"); } if(ClearList_Sq(La))//清空线性表 { printf("线性表已清空。 \n"); printf("--------------------------------------\n"); } else { printf("线性表清空出错。 \n"); printf("--------------------------------------\n"); } if(Destroy_Sq(La))//撤销线性表
【数据结构】线性表的基本操作
【数据结构】线性表的基本操作【数据结构】线性表的基本操作【一、概述】线性表是一种常见的数据结构,它是由一组具有相同特性的数据元素组成的有序序列。
线性表的基本操作包括插入、删除、查找和修改等操作,本文将对这些操作进行详细介绍。
【二、插入操作】插入操作是向线性表中某个位置插入一个新元素的操作。
插入操作包括头部插入、尾部插入和中间插入三种情况。
首先需要确定插入的位置,然后将插入位置后的元素依次向后移动一位,最后在插入位置处放入新元素。
1.头部插入:将新元素插入线性表的头部位置。
2.尾部插入:将新元素插入线性表的尾部位置。
3.中间插入:将新元素插入线性表的任意中间位置。
【三、删除操作】删除操作是从线性表中删除某个元素的操作。
删除操作包括删除头部元素、删除尾部元素和删除中间元素三种情况。
首先需要确定删除的位置,然后将删除位置后的元素依次向前移动一位,最后删除最后一个元素位置上的元素。
1.删除头部元素:删除线性表的头部元素。
2.删除尾部元素:删除线性表的尾部元素。
3.删除中间元素:删除线性表的任意中间位置的元素。
【四、查找操作】查找操作是在线性表中搜索某个元素的操作。
查找操作包括按值查找和按位置查找两种情况。
1.按值查找:根据给定的元素值,在线性表中搜索并返回该元素的位置。
2.按位置查找:根据给定的位置,返回该位置上的元素值。
【五、修改操作】修改操作是修改线性表中某个元素的值的操作。
需要先找到要修改的元素位置,然后将其值修改为新的值。
【附件】本文档涉及附件略。
【法律名词及注释】本文档所涉及的法律名词及注释略。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
预定义常量和类型#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等*/#include<limits.h> /* INT_MAX等*/#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */三元组的表示及其基本操作表示方法:typedef ElemType *Triplet; /* 由InitTriplet分配3个元素存储空间*//* Triplet类型是ElemType类型的指针,存放ElemType类型的地址*/基本操作(8个):Status InitTriplet(Triplet *T,ElemType v1,ElemType v2,ElemType v3){ /* 操作结果:构造三元组T,依次置T的3个元素的初值为v1,v2和v3 */ *T=(ElemType *)malloc(3*sizeof(ElemType));if(!*T)exit(OVERFLOW);(*T)[0]=v1,(*T)[1]=v2,(*T)[2]=v3;return OK;Status DestroyTriplet(Triplet *T){ /* 操作结果:三元组T被销毁*/free(*T);*T=NULL;return OK;}Status Get(Triplet T,int i,ElemType *e){ /* 初始条件:三元组T已存在,1≤i≤3。
操作结果:用e返回T的第i元的值*/if(i<1||i>3)return ERROR;*e=T[i-1];return OK;}Status Put(Triplet T,int i,ElemType e){ /* 初始条件:三元组T已存在,1≤i≤3。
操作结果:改变T的第i元的值为e */if(i<1||i>3)return ERROR;T[i-1]=e;return OK;}Status IsAscending(Triplet T){ /* 初始条件:三元组T已存在。
操作结果:如果T的3个元素按升序排列,返回1,否则返回0 */return(T[0]<=T[1]&&T[1]<=T[2]);}Status IsDescending(Triplet T){ /* 初始条件:三元组T已存在。
操作结果:如果T的3个元素按降序排列,返回1,否则返回0 */return(T[0]>=T[1]&&T[1]>=T[2]);}Status Max(Triplet T,ElemType *e){ /* 初始条件:三元组T已存在。
操作结果:用e返回指向T的最大元素的值*/*e=T[0]>=T[1]?T[0]>=T[2]?T[0]:T[2]:T[1]>=T[2]?T[1]:T[2];return OK;Status Min(Triplet T,ElemType *e){ /* 初始条件:三元组T已存在。
操作结果:用e返回指向T的最小元素的值*/*e=T[0]<=T[1]?T[0]<=T[2]?T[0]:T[2]:T[1]<=T[2]?T[1]:T[2];return OK;}线性表的顺序表示及其基本操作表示方法:#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量*/#define LIST_INCREMENT 2 /* 线性表存储空间的分配增量*/typedef struct{ElemType *elem; /* 存储空间基址*/int length; /* 当前长度*/int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */}SqList;基本操作(9个):void InitList(SqList *L) /* 算法2.3 */{ /* 操作结果:构造一个空的顺序线性表L */(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!(*L).elem)exit(OVERFLOW); /* 存储分配失败*/(*L).length=0; /* 空表长度为0 */(*L).listsize=LIST_INIT_SIZE; /* 初始存储容量*/}Status ListEmpty(SqList L){ /* 初始条件:顺序线性表L已存在。
操作结果:若L为空表,则返回TRUE,否则返回FALSE */if(L.length==0)return TRUE;elsereturn FALSE;}int ListLength(SqList L){ /* 初始条件:顺序线性表L已存在。
操作结果:返回L中数据元素个数*/ return L.length;}Status GetElem(SqList L,int i,ElemType *e){ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)。
操作结果:用e返回L中第i个数据元素的值*/if(i<1||i>L.length)return ERROR;*e=*(L.elem+i-1);return OK;}int LocateElem(SqList L,ElemType e){ /* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) *//* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
*/ /* 若这样的数据元素不存在,则返回值为0。
算法2.6 */ElemType *p;int i=1; /* i的初值为第1个元素的位序*/p=L.elem; /* p的初值为第1个元素的存储位置*/while(i<=L.length&& *p++!=e)++i;if(i<=L.length)return i;elsereturn 0;}Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 *//* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ ElemType *newbase,*q,*p;if(i<1||i>(*L).length+1) /* i值不合法*/return ERROR;if((*L).length>=(*L).listsize) /* 当前存储空间已满,增加分配*/{newbase=(ElemType*)realloc((*L).elem,((*L).listsize+LIST_INCREMENT)*sizeof(ElemType));if(!newbase)exit(OVERFLOW); /* 存储分配失败*/(*L).elem=newbase; /* 新基址*/(*L).listsize+=LIST_INCREMENT; /* 增加存储容量*/}q=(*L).elem+i-1; /* q为插入位置*/for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之后的元素右移*/*(p+1)=*p;*q=e; /* 插入e */++(*L).length; /* 表长增1 */return OK;}Status ListDelete(SqList *L,int i,ElemType *e) /* 算法2.5 */{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) *//* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */ ElemType *p,*q;if(i<1||i>(*L).length) /* i值不合法*/return ERROR;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;}void Union(SqList *La,SqList Lb) /* 算法2.1 */{ /* 将所有在线性表Lb中但不在La中的数据元素插入到La中*/ElemType e;int La_len,Lb_len;int i;La_len=ListLength(*La);/* 求线性表的长度*/Lb_len=ListLength(Lb);for(i=1;i<=Lb_len;i++){GetElem(Lb,i,&e); /* 取Lb中第i个数据元素赋给e */if(!LocateElem(*La,e)) /* La中不存在和e相同的元素,则插入之*/ListInsert(La,++La_len,e);}}void MergeList(SqList La,SqList Lb,SqList *Lc) /* 算法2.2 */{ /* 已知线性表La和Lb中的数据元素按值非递减排列。
*//* 归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列*/ int i=1,j=1,k=0;int La_len,Lb_len;ElemType ai,bj;InitList(Lc); /* 创建空表Lc */La_len=ListLength(La);Lb_len=ListLength(Lb);while(i<=La_len&&j<=Lb_len) /* 表La和表Lb均非空*/{GetElem(La,i,&ai);GetElem(Lb,j,&bj);if(ai<=bj){ListInsert(Lc,++k,ai);++i;}else{ListInsert(Lc,++k,bj);++j;}} /* 以下两个while循环只会有一个被执行*/while(i<=La_len) /* 表La非空且表Lb空*/{GetElem(La,i++,&ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len) /* 表Lb非空且表La空*/{GetElem(Lb,j++,&bj);ListInsert(Lc,++k,bj);}}线性表的链式表示及其基本操作带头结点链表的表示方法(不带头结点的单链表不再总结,在书上28页):typedef struct LNode /* 结点类型*/{ElemType data;struct LNode *next;}LNode,*Link,*Position;typedef struct LinkList /* 链表类型*/{Link head,tail; /* 分别指向线性链表中的头结点和最后一个结点*/ int len; /* 指示线性链表中数据元素的个数*/}LinkList;基本操作(24个):void MakeNode(Link *p,ElemType e){ /* 分配由p指向的值为e的结点。