版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构复习线表讲义 第章第章 绪论绪论一、数据结构研究的内容一、数据结构研究的内容数据结构是指数据以及相互之间的联系。数据结构是指数据以及相互之间的联系。(1)数据的逻辑结构:线性表、树、图。)数据的逻辑结构:线性表、树、图。(2)数据的存储结构:顺序存储、链式结构。)数据的存储结构:顺序存储、链式结构。(3)运算(算法)运算(算法) 三、算法分析(设计)的要求:三、算法分析(设计)的要求: (1)正确性)正确性 (2)可读性)可读性 (3)健壮性)健壮性 (4)高效率与低存储量)高效率与低存储量 二、算法的概念二、算法的概念 算法是解决给定问题的一种方法(策略)。算法是解决给定问题的一种方
2、法(策略)。四、算法的时间复杂性分析四、算法的时间复杂性分析 指算法中各语句执行时间的总和指算法中各语句执行时间的总和 用大用大O O表示。表示。 如:如:T(n)=O(nT(n)=O(n2 2) ) 解释解释:随着随着问题规模问题规模 n 的增大,算法的执的增大,算法的执行时间行时间 T(n)与与n2成正比成正比。O(1) O(log2n) O(n)O(nlog2n)O(n2) O(n3) O(2n) 也即随着也即随着n的增大的增大, f(n)增长较慢的算法为增长较慢的算法为较优较优. 例1-1 分析下列的算法,求T(n). (用大O表示)(1) i=1;j=0; while(i+jj) j
3、+; else i+; T(n)=O(n)(2) x=1; for (i=1;i=n;i+) for (j=1;j=i;j+) for (k=1;k1) y= y*x; n=n1; return y;问题:问题:(1) 该算法的功能是计算该算法的功能是计算 xn 。(2) 该算法的时间复杂度是该算法的时间复杂度是 0(n) 。(3) 若执行一次条件判断和执行一次赋值所需时间相同,若执行一次条件判断和执行一次赋值所需时间相同,都是一个单位时间,则该算法的执行时间等于都是一个单位时间,则该算法的执行时间等于 3n1 个单位时间。个单位时间。(1)顺序存储结构(顺序表)顺序存储结构(顺序表) hea
4、dk1k2k3 k4a2a3aiana1(2)非顺序存储结构(链表)非顺序存储结构(链表)0 1 2 i n 第章第章 线性表线性表一、线性表的定义一、线性表的定义 n(n=0)个元素的有限集,(a1,a2,a3, an), 每个元素的位置是线性(一维)的。二、线性表的两种结构二、线性表的两种结构三、顺序表和链表的插入和删除操作三、顺序表和链表的插入和删除操作(1)顺序表的插入和删除顺序表的插入和删除在顺序表的第 i 处插入 1 个结点,有n-i+1个结点后移;删除第 i 个结点有n-i个结点前移。 0 1 2 i n(2)链表的插入和删除)链表的插入和删除a2a3aiana1# #defin
5、e MAXSIZE 10000define MAXSIZE 10000int aMAXSIZE+1;int aMAXSIZE+1; / /* * 线性表的容量线性表的容量 * */ /int n;int n; / /* * 线性表的表长线性表的表长 * */ /线性表的容量线性表的容量aMAXSIZE+1;线性表的长度线性表的长度int n;四、基于顺序表四、基于顺序表( (数组数组) )的算法设计的算法设计loc(ai) = loc(a1)+(i-1)*len()()插入算法设计插入算法设计 输入:长度为输入:长度为n的线性表的线性表a1.an, 插入位置插入位置 i 和插入元素和插入元素
6、x 输出:在第输出:在第i处插入新元素处插入新元素x后,得到长度为后,得到长度为n+1的线性表的线性表void list_insert( ) void list_insert( ) / /* * 在长度为在长度为n n的线性表的线性表a1.na1.n的第的第i i处插入新元素处插入新元素x x * */ / int j; int j; if (n=MAXSIZE) error if (n=MAXSIZE) error( (“表满表满”);); else if(in+1)errorelse if(in+1)error( (“ 插入位置错插入位置错”); ); else for (j=n; j=i
7、; j-) else for (j=n; j=i; j-) aj+1= aj; aj+1= aj; / /* * 元素后移元素后移 * */ / ai= x; ai= x; / /* * 在第在第i i处插入处插入x x * */ / n+ n+ ;/ /* * 表长加表长加1 1 * */ / 算法list_insert的时间复杂性 T(n)=O(n)()删除算法设计()删除算法设计 输入:长度为输入:长度为n的线性表的线性表a1.an, 删除位置删除位置 i ; 输出:删除第输出:删除第i个元素后,得到长度为个元素后,得到长度为n-1的线性表的线性表 void list_delete( )
8、 void list_delete( ) / /* * 删除线性表删除线性表a1.na1.n中的第中的第i i个元素个元素 * */ / int j;int j; if (in) errorif (in) error( (“删除位置错删除位置错”) ;) ; else if (n=0) errorelse if (n=0) error( (“表空表空”) ); elseelse for (j=i+1; j=n; j+) for (j=i+1; j=n; j+) aj-1=aj; aj-1=aj; / /* * 元素前移元素前移 * */ / n- n- ;/ /* * 表长减表长减1 1 *
9、*/ / 算法list_delete的时间复杂性 T(n)=O(n)head : 指针变量,存储第一个结点的地址五、基于链表的算法设计五、基于链表的算法设计()查找(定位)算法设计()查找(定位)算法设计 1. 1. 功能功能 在链表中查找(定位于)第在链表中查找(定位于)第i i个结点,若存在,个结点,若存在,则返回该结点的地址,否则,返回空(则返回该结点的地址,否则,返回空(NULLNULL)。)。 2. 2. 算法思想算法思想 从第一个结点开始,逐个查找(后移)并计数,从第一个结点开始,逐个查找(后移)并计数,直到第直到第i i个结点止。个结点止。3. 3. 算法设计算法设计node n
10、ode * *loc(node loc(node * *head, int i) head, int i) / /* *head:head:带头结点的单链表的头指针,该算法定位于表中的第带头结点的单链表的头指针,该算法定位于表中的第i i个结点个结点* */ / node node * *p=head;p=head; / /* *指针初始化指针初始化, p, p指向头结点指向头结点* */ / int j=0; int j=0; / /* * j j为计数器,初值为为计数器,初值为0 0* */ / while (p!=NULL)&(ji) while (p!=NULL)&(jnext; j+
11、; p=p-next; j+; / /* * p p后移,后移,j j计数计数,p ,p移至第移至第i i个结点止个结点止 * */ / return (p); return (p); / /* * p p指向第指向第i i个结点(返回第个结点(返回第i i个结点的地址)个结点的地址)* */ / 算法Loc的时间复杂性 T(n)=O(n)(2)(2)插入算法设计插入算法设计1. .功能:在线性表第功能:在线性表第i i处插入其数值为处插入其数值为x x新结点。新结点。 2. 2.算法思想:算法思想: 首先,找到第首先,找到第i-1i-1个结点(个结点(p p指向第指向第i-1i-1个结点);
12、个结点);然后,在然后,在p p结点之后插入值为结点之后插入值为x x新结点新结点q q。在结点在结点p p之后插入新结点之后插入新结点q: q: 头结点头结点的作用的作用q-next=p-next;P-next=q;3. 3.算法设计算法设计void ins(node void ins(node * *head, int i, elemtype x,node head, int i, elemtype x,node * *q q) ) / /* * head: head:带头结点的单链表的头指针,该算法在第带头结点的单链表的头指针,该算法在第i i个结个结 点后面插入其数值为点后面插入其数值
13、为x x新结点新结点q q* */ / node node * *p; p; p=loc(head,i-1); p=loc(head,i-1); / /* * 令令 p p 指向第指向第i-1i-1个结点个结点 if (p!=NULL)if (p!=NULL) q-next=p-next; p-next=qq-next=p-next; p-next=q; ; / /* *在在p p结点之后插入值为结点之后插入值为x x新结点新结点q q * */ / 算法ins的时间复杂性 T(n)=O(n)(3)(3)删除算法设计删除算法设计 1. .功能:删除第功能:删除第i i个结点。个结点。 2. 2
14、.算法思想:算法思想:首先,找到第首先,找到第i-1i-1个结点(个结点(p p指向第指向第i-1i-1个结点);个结点);然后,删除然后,删除p p的下一个结点。的下一个结点。3.3.算法设计算法设计void del (node* head, int i, elemtype *e) / /* * head: head:带头结点的单链表的头指针,删除表中的带头结点的单链表的头指针,删除表中的i i个结点,并将结点个结点,并将结点的值回带(的值回带(* *e e)* */ / node node * *p=head; p=head; / /* * 指针初始化指针初始化 * */ / int j=
15、0; int j=0; / /* * j j为计数器为计数器 * */ / while (p-next!=NULL & jnext!=NULL & jnext; j+; p=p-next; j+; / /* *寻找第寻找第i-1i-1个结点个结点(p)(p)* */ / if ( p-next!=NULL & j=i-1 ) if ( p-next!=NULL & j=i-1 ) q=p-next; q=p-next; / /* *q q指向指向p p的下一个结点的下一个结点( (即第即第i i个结点)个结点)* */ / p-next=q-next; p-next=q-next; / /*
16、*删除第删除第i i个结点个结点* */ / * *e=q-data ; e=q-data ; / /* *保留第保留第i i个结点的值个结点的值 * */ / free(q) ; free(q) ; 例2-1 线性表有8000个数据元素,若采用顺序存储(一维数组),第一个结点的地址为1000,每个结点的值需占用8个存储单元。问 (1) 该线性表需要多大的存储空间? (2)第113个结点的起始地址是多少? (3)在线性表的第 34 处插入一个新元素,有多少个元素向后移动?六、示例六、示例例例2.12.1设线性表存于整型数组设线性表存于整型数组 a1.MAXSIZEa1.MAXSIZE的前的前n
17、 n个分量中个分量中 且递增有序且递增有序, , 将将x x插入到线性表的适当位置。插入到线性表的适当位置。 void ins( ) void ins( ) int i; int i; if if (nMAXSIZEn=1 & x=1 & x0 & 1=i & i+k-10 & 1=i & i+k-1=n ) for (j=i+k; j=n; +j) for (j=i+k; j=n; +j) aj-k=aj; aj-k=aj; / /* * 前移前移k k个元素,将个元素,将k k个元素一次删除个元素一次删除 * */ / n - = k; n - = k; / /* * 表长表长k k *
18、*/ / 思考:算法的选择及效率思考:算法的选择及效率(1)每次删除)每次删除1个元素,做个元素,做k次次(2)一次将)一次将k个元素全部删除个元素全部删除例例2.3 2.3 已知线性表存于已知线性表存于a1.MAXSIZEa1.MAXSIZE中的前中的前n n个分量个分量 中,写一算法删除表中所有值为中,写一算法删除表中所有值为0 0的元素(将非的元素(将非 0 0元素移到前面来),各元素间的相对位置不变。元素移到前面来),各元素间的相对位置不变。void del_0( ) /* 删除所有值为删除所有值为0的元素的元素 */ i=1; while(i=n)&(ai!=0) i=i+1; /*
19、 找到第找到第1个值为个值为0的结点的结点 */ for(j=i+1;jnext!=NULL & p-next-data!=x)while (p-next!=NULL & p-next-data!=x) p=p-next; p=p-next; / /* *寻找表中值为寻找表中值为x x的结点的结点(p-next=x)(p-next=x)* */ / if ( p-next!=NULL) if ( p-next!=NULL) q=p-next; q=p-next; / /* *q q指向指向p p的下一个结点的下一个结点( (即值为即值为x x的结点)的结点)* */ / p-next=q-next; p-next=q-next; / /* *删除值为删除值为x x的结点的结点* */ /free(q) ;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论