导图社区 线性表
下图是关于线性表的思维导图,从线性存储、链式存储、Def这三个方面作了详细的介绍,非常全面,有需要的小伙伴快收藏起来。
编辑于2022-05-01 12:30:48集成电路(integrated circuit)是一种微型电子器件或部件。采用一定的工艺,把一个电路中所需的晶体管、电阻、电容和电感等元件及布线互连一起,制作在一小块或几小块半导体晶片或介质基片上,然后封装在一个管壳内,成为具有所需电路功能的微型结构;
CMOS逻辑电路代表互补的金属氧化物半导体(Complementary Metal-Oxide-Semiconductor),它指的是一种特殊类型的电子集成电路(IC)。
这是一篇关于自控力的思维导图,当我们将意志力挑战看成是衡量道德水平的标准时,善行就会允许我们做坏事。为了更好地自控,我们需要忘掉美德,关注目标与价值。
社区模板帮助中心,点此进入>>
集成电路(integrated circuit)是一种微型电子器件或部件。采用一定的工艺,把一个电路中所需的晶体管、电阻、电容和电感等元件及布线互连一起,制作在一小块或几小块半导体晶片或介质基片上,然后封装在一个管壳内,成为具有所需电路功能的微型结构;
CMOS逻辑电路代表互补的金属氧化物半导体(Complementary Metal-Oxide-Semiconductor),它指的是一种特殊类型的电子集成电路(IC)。
这是一篇关于自控力的思维导图,当我们将意志力挑战看成是衡量道德水平的标准时,善行就会允许我们做坏事。为了更好地自控,我们需要忘掉美德,关注目标与价值。
线性表
线性存储
内存中用地址连续的一块存储空间顺序存放线性表的各元素。一维数组在内存中占用的存储空间就是一组连续的存储区域。 因此,最好是用一维数组以表示。
Last 记录当前线性表中最后一个元素的位置(n-1),起指针作用,始终指向最后一个元素; 表长: Last +1 下标:Last
结构定义: typedef struct LNode *PtrToLNode; struct LNode{ ElementType Data[MAXSIZE]; Position Last; }; typedef PtrToLNode List; List L;
结构体中包含一个一维数组与指向下一个结点的指针
初始化: List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode)); L->Last = -1; return L; }
构建一个空表,然后把表中的Last指针置为-1表示表中暂无元素
操作
查找: #define ERROR -1 Position Find( List L, ElementType X ) { Position i = 0; while( i <= L->Last && L->Data[i]!= X ) i++; if ( i > L->Last ) return ERROR; /* 如果没找到,返回错误信息 */ else return i; /* 找到后返回的是存储位置 */ }
从第一个元素开始,逐个与X进行比较,直到找到与X相等的数据元素,返回它的存储下标,要是遍历整个表都没有找到,则返回ERROR. (pay attention to 循环条件,既是在最后一个元素之前,以及对应的值不相等于X)
插入: bool Insert( List L, ElementType X, int i ) { Position j; if ( L->Last == MAXSIZE-1) { /* 表空间已满,不能插入 */ printf("表满"); return false; } if ( i<1 || i>L->Last+2 ) { /* 检查插入位序的合法性:是否在1~n+1。n为当前元素个数,即Last+1 */ printf("位序不合法"); return false; } for( j=L->Last; j>=i-1; j-- ) /*Last指向序列最后元素 */ L->Data[j+1] = L->Data[j]; /* 将位序i及以后的元素顺序向后移动 */ L->Data[i-1] = X; /* 新元素插入第i位序,其数组下标为i-1 */ L->Last++; /* Last仍指向最后元素 */ return true; }
1.首先检查表空间是否已经满了,Last是不是指向MAXSIZE-1的位置;(注意是否表满) 2.检查插入位序是不是合法的,i从1(插在表头)到Last+2(插在表尾);i指的是元素序号,不是下标。(注意插入位序是否合法) 3.数据的移动次序和方向。位序i取值范围1到n+1,原表长是1.(注意移动次序与方向,以及下标与位序之区别) 4.插入算法:循环从最后一个元素向前遍历,直到需插入的位置i(下标为i-1)(对应for( j=L->Last; j>=i-1; j-- )),然后,循环把元素向后移位,直到到第i个( L->Data[j+1] = L->Data[j];),将X赋值到其中( L->Data[i-1] = X; ),最后改改Last下标,向后挪一位( L->Last++; )
删除: bool Delete( List L, int i ) { Position j; if( i<1 || i>L->Last+1 ) { /* 检查空表及删除位序的合法性 */ printf("位序%d不存在元素", i ); return false; } for( j=i; j<=L->Last; j++ ) L->Data[j-1] = L->Data[j]; /*将位序i+1及以后的元素顺序向前移动*/ L->Last--; /* Last仍指向最后元素 */ return true; }
1.检查位序的合法性; 2.数据的移动次序和方向。位序i取值范围1到n. 3.算法:先检查删除位序合不合法,合法者,循环使需删除位置(i-1)开始,逐个被后一个元素覆盖。
链式存储
通过“链”建立起数据元素之间的逻辑关系。因此对线性表的插入、删除不需要移动数据元素,只需要修改“链”。
结构定义: typedef struct LNode *PtrToLNode; struct LNode{ ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List; List L;
结构体中包含数据以及指向下一个结点的指针
操作
求表长: int Length( List L ) { Position p; int cnt = 0; /* 初始化计数器 */ p = L; /* p指向表的第一个结点 */ while ( p ) { p = p->Next; cnt++; /* 当前p指向的是第cnt个结点*/ } return cnt; }
定义一个位置指针p,以及一个用来计数的变量cnt; 当p存在时,循环使p指向下一个结点,每一次循环cnt自加,循环结束返回的cnt值即为表长。
查找
按序号查找: FindKth; #define ERROR -1 ElementType FindKth( List L, int K ) { Position p; int cnt = 1; /* 位序从1开始 */ p = L; /* p指向L的第1个结点 */ while ( p && cnt<K ) { p = p->Next; cnt++; } if ( (cnt==K) && p ) return p->Data; /* 找到第K个 */ else return ERROR; /* 否则返回错误信息 */ }
要是p依然存在,且在指定位序之前,则循环使p向后指,当找到且位序在表内,则返回对应那个值,否则返回错误。
按值查找: Find #define ERROR NULL Position Find( List L, ElementType X ) { Position p = L; /* p指向L的第1个结点 */ while ( p && p->Data!=X ) p = p->Next; /* 下列语句可以用 return p; 替换 */ if ( p ) return p; else return ERROR; }
要是p依然存在,且指定的数值与要找的数值不一样,则循环使p向后指,当循环条件不满足,既是找到了,若此时,p依然在合法位置,则返回p,否则返回错误。
插入
插入: #define ERROR NULL /* 用空地址表示错误 */ List Insert( List L, ElementType X, int i ) { Position tmp, pre; tmp = (Position)malloc(sizeof(struct LNode)); /* 申请、填装结点 */ tmp->Data = X; if ( i == 1 ) { /* 新结点插入在表头 */ tmp->Next = L; return tmp; /* 返回新表头指针 */ } else { /* 查找位序为i-1的结点 * int cnt = 1; /* 位序从1开始 */ pre = L; /* pre指向L的第1个结点 */ while ( pre && cnt<i-1 ) { pre = pre->Next; cnt++; } if ( pre==NULL || cnt!=i-1) { /* 所找结点不在L中 */ printf("插入位置参数错误\n"); free(tmp); return ERROR; } else { /* 找到了待插结点的前一个结点pre */ tmp->Next = pre->Next; pre->Next = tmp; return L; } } }
开辟一个大小为结构体大空间,名字为tmp,并向其赋值X, (Position tmp, pre; tmp = (Position)malloc(sizeof(struct LNode)); /* 申请、填装结点 */ tmp->Data = X; ) 若是插入的位置为表头,则使tmp的后继为表头L,返回tmp即可。 ( if ( i == 1 ) { /* 新结点插入在表头 */ tmp->Next = L; return tmp; /* 返回新表头指针 */) 若是任意位置,在pre在表内,且位序在需寻的位置之前,则循环使指针向后移动, (int cnt = 1; /* 位序从1开始 */ pre = L; /* pre指向L的第1个结点 */ while ( pre && cnt<i-1 ) { pre = pre->Next; cnt++; }) 若是找的位序不合法,输出错误参数,然后删除tmp, ( if ( pre==NULL || cnt!=i-1) { /* 所找结点不在L中 */ printf("插入位置参数错误\n"); free(tmp); return ERROR; }) 若找到,则插入 (else { tmp->Next = pre->Next; pre->Next = tmp; return L;}/参看链表的插入,既是改变后继/)
带头结点: bool Insert( List L, ElementType X, int i ) { /* 这里默认L有头结点 */ Position tmp, pre; int cnt = 0; /* 查找位序为i-1的结点 * pre = L; /* pre指向表头 */ while ( pre && cnt<i-1 ) { pre = pre->Next; cnt++; } if ( pre==NULL || cnt!=i-1) { /* 所找结点不在L中 */ printf("插入位置参数错误\n"); return false; } else { /* 找到了待插结点的前一个结点pre;若i为1,pre就指向表头 */ /* 插入新结点 */ tmp=(Position)malloc(sizeof(struct LNode)); /*申请、填装结点*/ tmp->Data = X; tmp->Next = pre->Next; pre->Next = tmp; return true; } }
(1)先构造一个新结点,用tmp指向; (2)再找到链表的第 i-1个结点,用pre指向; (3)然后修改指针,插入结点 ( pre之后插入新结点是 tmp)
删除: bool Delete( List L, int i ) { /* 这里默认L有头结点 */ Position tmp, pre; int cnt = 0; /* 查找位序为i-1的结点 * pre = L; /* pre指向表头 */ while ( pre && cnt<i-1 ) { pre = pre->Next; cnt++; } if ( pre==NULL || cnt!=i-1 ||pre->Next==NULL) { /* 所找结点或位序为i的结点不在L中 */ printf(“删除位置参数错误\n"); return false; } else { /* 找到了待删结点的前一个结点pre */ /* 将结点删除 */ tmp=pre->Next; pre->Next=tmp->Next; free(tmp); return true; } }
在表中,且在删除的位置前一个之前,指针向后指 ( while ( pre && cnt<i-1 ) { pre = pre->Next; cnt++; }) 指针不在表内,位序不合法,返回错误信息 ( if ( pre==NULL || cnt!=i-1 ||pre->Next==NULL) { /* 所找结点或位序为i的结点不在L中 */ printf(“删除位置参数错误\n"); return false;) 找到就应用链表删除的方法将其删除 (else { /* 找到了待删结点的前一个结点pre */ /* 将结点删除 */ tmp=pre->Next; pre->Next=tmp->Next; free(tmp); return true; })
1)先找到链表的第 i-1个结点,用pre指向; 2)再用指针tmp指向要被删除的结点(pre的下一个结点); 3)然后修改指针,删除tmp所指结点; 4)最后释放tmp所指结点的空间。
Def:是 n (≥0)个元素构成的有序序列( a1, a2, ,an ) ; ai+1称为 ai的直接后继, ai-1为 ai的直接前驱;直接前驱和直接后继反映了元素之间一对一的邻接逻辑关系。