0401数据结构压缩版01V1
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 顺序表的删除:删除表中第i个位置的元素。 实现步骤: 判断i是否超过当前表的长度; 取出欲删除元素 将该位置后的元素依次向前移动一个位置; 修改当前表的长度 * * 2.4 顺序表的操作(续3) /*在顺序表中删除第i个元素*/ int ListDelete_sq(Sqlist *L,int i){ int k; if(i1||iL-length) return ERROR; /*删除位置不合法*/ for(k=i-1;kL-length-1;k++) /*元素前移*/ L-slist[k]=L-slist[k+1]; L-length--; /*顺序表长度减1*/ return OK; } 顺序表的插入、删除算法分析:在顺序表中插入和删除元素,其时间耗费主要在元素的移动上。 * * 2.4 顺序表的操作(续4) ? 在第i个元素前插入一个新元素,移动元素次数为: n-i+1 平均移动次数 ? 删除第i个元素,移动元素次数为: n-i 平均移动次数 时间复杂度:O(n) 顺序表的查找:在顺序表中查找某个值等于给定值的元素位置。 实现步骤: 从顺序表的起始位置开始依次比较; 若找到对应的元素,则返回该元素在表中的位置; 若找到表的末尾位置,还未找到,则返回失败标识。 顺序表的特点: 简单直观,容易理解; 能够实现随机存取; 插入和删除需要移动大量的数据元素; 长度相对固定,易导致存储空间的浪费; * * 2.4 顺序表的操作(续5) 链表:采用一组任意的存储单元来存放线性表中的数据元素,这些存储单元可以是连续的,也可以是不连续的。数据元素间的逻辑关系通过附加信息-指针来描述。 数据元素除了具有代表其本身信息的数据域外,还有一个用来指示逻辑关系的指针域。这样的存储方式称为结点。 链表的实现主要使用结构体: * * 2.5 线性表的链式表示 数据域 data 指针域 next 结点node typedef struct LNode{ ElemType data; /*结点的数据域*/ struct LNode *next;/*结点的指针域*/ }LNode,*Llist; 若LNode *p,则p的含义是什么? 若 p 的值非空,则表明 p 指向某个结点,p-data 表示 p 所指结点中的数据域,p-next表示 p 所指结点中的指针域,若非空,则指向其后继结点。 线性链表是一种动态存储结构,当线性链表要增加一个结点时,向系统申请一个存储空间,删除结点时要将空间释放。 单链表:结点中只有一个指针域 * * 2.5 线性表的链式表示(续1) p=(LNode *)malloc(sizeof(LNode)); free(p); 不带头结点的单链表,头指针指向第一个数据元素 带头结点的单链表,头指针指向头结点,头结点的数据域为空,指针域为第一个数据元素的地址 不带头结点的单链表为空,则头指针为空,而带头结点的,则头结点的指针域为空 单向循环链表的特点:表中最后一个结点的指针域指向头结点,整个链表成为一个由链指针相链接的环,并且将头指针设成指向最后一个结点。空的循环链表由只含一个自成循环的头结点表示。 问题: 判断有头结点的循环链表是否到达表尾的条件是什么? 判断循环链表为空的条件是什么? * * 2.5 线性表的链式表示(续1) 头结点 空表 ... H H 非空循环链表 双向循环链表的特点是其结点结构中含有两个指针域,一个指向其直接后继,一个指向其直接前趋。 循环链表可以看做?环形 * * 2.5 线性表的链式表示(续2) 单链表:建立一个空的线性链表。对于带头结点的单链表,设定一个头指针指向头结点。并且设置头结点的指针域为空。 * * 2.6 链表的创建(续2) Llist InitList_l(Llist H) { H=(Lnode *)malloc(sizeof(LNode)); /*申请一个头结点*/ if (!H) return ERROR; /*申请失败*/ H-next=NULL; /*头结点的指针域置空*/ return H; } LNode *create_list(int n){ LNode *head,*p,*q; int i;
原创力文档

文档评论(0)