首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据结构【顺序表】

头插数据 这个就是把全部数据往后移动1位,然后在0下标插入数据 打印结果 尾删除数据 尾删除,我们只需要把size往后移动1位就行了 我们可以看到4没了。...头删除数据 就是把1下标到3下标往前移动1位,就行了。 我们发现1删除了 在指定位置插入数据 这里多了个参数,int a这个是要插入数据的下标,要把数据插入那个下标。...我们可以发现在2下标位置,插入了99 在指定位置删除数据 int a是要删除的下标 把a下标位置后面的数据,向前移动1位 我们发现2删除了,2的下标是1 查询数据 我们可以通过循环的方式查询,找到了返回下标...= NULL一样 //循环打印 for (int i = 0; i r->size; i++) { printf("%d ", r->arr[i]); } } //头插数据 void toc...(r); //把size向后移动1位 r->size--; } //头删除 void tosc(SL* r) { assert(r); //把1下标 到 3下标往前移动1位 for (int

12410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    2024重生之回溯数据结构与算法系列学习(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】

    r->next = s; // 将尾节点的next指向新节点 r = s; // 更新r为新节点 r->next...,将新尾节点的next指向头节点L r->next = L; // 尾节点指向头节点 L->prior = r; // 头节点的prior指向尾节点...,链表头指针分别为h1 和 h2,编写一个函数将链表 h2 链接到链表h1 之后,要求链接后的链表仍保持循环链表形式....; // 将LA的尾节点指向LB的第一个数据节点 pb->next = LA; // 将LB的尾节点指向LA的头节点 } // 主函数 int main() { LinkList...q->next->pred = p; // 更新后继节点的前驱 } p->pred = q; // 更新当前节点的前驱 q->next = p; // 将当前节点插入到前驱节点的后继

    9210

    2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】

    头插法 (HeadInsert): 通过不断读取输入,将新节点插入到链表的头部。 使用 L->next 来维护链表的结构。...头插法 (HeadInsert): 通过不断读取输入,将新节点插入到链表的头部。 使用 L->next 来维护链表的结构。...while (p) // 当当前节点不为空时循环 { // 检查节点数据是否在指定范围内 if (p->data > left && p->data...输出链表中的最小值并删除 void PrintValue(LinkList &L) { LNode *p, *pre; LNode *minP, *minPre; // 当链表还有节点时循环...调用 TailInsert 函数添加数据到链表 LA。 调用 BreakList 函数将链表 LA 分割成两个链表 LA 和 LB。 打印两个链表的内容。

    5710

    数据结构基础(三).双链表(1)

    ,将首尾连接就成了循环链表,添加删除节点的操作方法不变 ---- 代码示例 #include #include typedef struct dlist...->prev=NULL; //由于是空表,将前置和后继节点置空 return head; //返回此头节点 } int instNode(DP const head,int pos,int score...定位到1位置 if(pos > head->score + 1) pos=head->score + 1; //对插入位置进行校正,位置超出最后一个元素时,定位到末尾位置 p=(DP)malloc...定位到1位置 if(pos > r->score) pos=r->score; //对删除位置进行校正,位置超出最后一个元素时,定位到最后一个元素的位置 for(i=0;ir->next; //定位到删除点前一个元素的位置 p=r->next; if(p->next)p->next->prev=r; //对于链尾情况的特殊照顾 r->next=p->

    64920

    链表的基本操作_简单链表

    我们在使用数组存放数据是非常方便,但是由于数组的长度是固定的,所以当存储不同的元素数量时,就很容易出现问题。如果向数组中添加的数量大于数组大小时候,信息无法完全被保存。...倒序输出 步骤: 1.对头指针进行初始化,对其开辟动态空间,并且将头结点的指针域置空(顺序不要弄反) 2.定义指针变量s,用来指向新创建的结点 3.循环,在循环中开辟s(新结点)的动态空间...,并赋予新结点数据域的信息 4.头插法关键的两行代码,新结点指向原来的首结点,链表的头结点指向新结点,结合上面的图解去了解(不可写反,写反之后,链表的头结点无法与新结点相连,无法创建链表,输出时只会循环输出该结点的信息...0个信息 3.注意的是,在循环结束时,新结点的指针域一定要指向空 ---- 三:单链表的遍历 代码实现: void print(struct Student *Head) //输出链表 {...} } 步骤注意点: 1.定义临时指针变量Temp指向首元结点 2.循环输出 3.关键:每输出一个结点的内容,就移动Temp指针到下一个结点的地址,如果是最后一个结点,指针指向NULL,循环结束

    61820

    CDN故障案例content-encoding深入分析

    考虑到AWS技术询问流程过于复杂,没有国内便捷。 便将这个配置在国内公有云的CDN/公有桶上配置一次。...该响应头也一并被cdn节点cache到文件, 等chrome浏览器发起压缩请求的时候, cdn节点发现cache文件中response的header中已经存在content-encoding:gzip...cdn节点开启gzip, 源站不开启gzip 5. cdn节点不开启压缩,源站也不开启压缩,前后两者都不开启gzip_vary 场景1中: 1.1 如果客户端是第一次发起非压缩请求,那么cdn会透传请求头到源站...1.2 如果客户端是第一次发起压缩请求,那么cdn会透传请求头到源站,以压缩请求发送到源站,源站返回压缩的内容给cdn节点, cdn节点缓存压缩内容,接着客户端第二次发起带压缩的请求,由于cdn没有开启...再接着用户端发起一个非压缩的请求,那就出现灾难了,因为带压缩的请求和非带压缩的请求都命中同一个cache文件,cdn直接将cache文件发送给客户端,结果就出现问题,客户端请求非压缩内容,结果得到了压缩的内容

    2.3K20

    算法与数据结构(二):链表

    它的过程就像示意图中展现的,首先使用新节点p的next指针指向当前的头节点把新节点加入到链表头,然后变更链表头指针,这样就在头部插入了一个节点,用代码来展示就是 p->next = head; head...,所以需要特别判断一下需要删除的是否为头节点,如果为头结点,则直接将头指针指向它的下一个节点,然后删除头结点即可,如果不是则采用之前的方法来删除。...>pNext;r->pNext = p; 可以看成 p->pNext = NULL; r->pNext = p; 也就是将p的next指针指向空,让其作为尾节点,将之前的尾节点的next指针指向新节点。...循环链表 循环链表是建立在单向链表的基础之上的,循环链表的尾节点并不指向空,而是指向其他的节点,可以是头结点,可以是自身,也可以是链表中的其他节点,为了方便操作,一般将循环链表的尾节点的next指针指向头节点...= pTmp); } 判断链表是否为循环链表 在上面说过,循环链表的尾指针不一定指向头节点,它可以指向任何节点,那么该怎么判断一个节点是否为循环链表呢?

    60220

    单向链表的一点儿感悟

    除了关于链表的一点感悟,还有最近了解到的工程中遇到的几个实际问题: ①libevent由于阻塞,将所在进程挂起 ②使用线程池时由于线程属性没有设置为分离属性,造成内存泄漏 ③Linux的共享内存与C++...链表根据特点又可以再具体分为单向链表、循环链表和双向链表等。 二、链表的操作 那按照不同的分法简直太多了,20来个。。。这次简单介绍几个,其中重点介绍如何逆转一个链表。...= r->link) r = r->link; p = (LinkList)malloc(sizeof(LNode)); p->data = item; p->link = NULL;..., 原来链表移动到下一个节点, 新链表节点的link链向新链表—— 第二次执行: 此时tmpList节点存储的是新的链表的指针,此时有一个节点, 获取原来链表的第二个节点, 原来链表移动到下一个节点(功能不变...), 新节点的link指向新的链表,此时新链表有两个节点了,且链表尾端是原来的链表的头结点。

    44510

    数据结构基础(二).单链表(1)

    0,头节点的这个值还有另外的意思,用来记录链表中的元素个数 head->next=NULL; //由于是空表,将下一节点位置置空 return head; //返回此头节点 } int instNode...定位到1位置 if(pos > head->score + 1) pos=head->score + 1; //对插入位置进行校正,位置超出最后一个元素时,定位到末尾位置 p=(STUP)malloc...= ifEmptyList(head) )return -1; //删除前进行一下检查,判断此表是否为空 if(1 > pos) pos=1; //对删除位置进行校正,位置小于1时,定位到1位置...if(pos > r->score) pos=r->score; //对删除位置进行校正,位置超出最后一个元素时,定位到最后一个元素的位置 for(i=0;ir->next...; //定位到删除点前一个元素的位置 p=r->next; r->next=p->next; free(p); //对指定位置节点进行删除 head->score--; //及时更新元素个数

    78830

    2-6 链表逆序

    #将上面 B后的 F 插入到A后面 最后将A放到B后面: F -> E -> D -> C -> B -> A -> null void Reverse(node **h) { if ((*h) ==...>next; //将r插入到第1个元素后面,这里因为第1个元素的位置P1也不变,所以也很简单 r->next = p1->next; p1->next = r; } //最后再来处理原始的第...null 先进入循环,不断的把A的后继元素往头结点后面插 Head -> B -> A -> C -> D -> E -> F -> null Head -> C -> B -> A -> D -> E...<< endl; return; } else { node *p2 = h->next;//将头结点视为第1个元素,那么数据首节点就视为第2个元素 node *r; /*将第二个元素后面的元素依次插入第一个元素后面...>next; //将r插入到头结点后面 r->next = h->next; h->next = r; } //最后与不带头结点的单链表的区别就是,不用修改头指针了 }

    83210

    【数据结构】第二章——线性表(5)

    ,将新元素插入为表头元素,这种插入方法我们就称为头插法 在创建链表时,将新元素插入为表尾元素,这种插入方法我们就称为尾插法 从上图中,我们还可以看到,对于头插法而言,元素插入的顺序是逆序插入的,也就是头插法相当于对元素进行了逆置...(&L);//创建单链表 Print_LinkList(L);//打印单链表 } return 0; } 2.2 采用尾插法创建单链表 与头插法不同的是,尾插法是从空表开始依次将元素插入到单链表的表尾...: 当单链表为空表时,插入的第一个元素既是表头元素也是表尾元素; 当单链表不为空表时,新的元素将会插入到表尾; 尾插法的实现与头插法相似,只不过此时的表尾指向的对象为NULL,我们每次要插入一个新的元素...s->next = r->next;//将表尾结点的指针域中存放的信息放入新结点的指针域中 r->next = s;//将新结点的地址存放入表尾结点的指针域中 r = s;//将表尾指针指向新结点...2.3 单链表创建的时间复杂度 可以看到我们在创建单链表时,不管是头插法还是尾插法,循环中代码执行的次数与节点的个数是一致的,因此单链表创建的时间复杂度为O(n)。

    41010

    FPGA 通过 UDP 以太网传输 JPEG 压缩图片

    量化 DCT 应用于 8x8 块时,量化因子会应用于系数。简而言之,此步骤使用与能量密度相关的步长对系数进行离散化。低频系数以较小的步长量化,因此比以较大步长量化的误差更小。...为了避免发送连续的零,前面的零的行程长度被编码到每个非零系数的转换中。每个非零系数都被编码为可变长度代码,以及指示前面的零游程的“标头”霍夫曼代码以及 VL 代码的长度。...将第一个值存储为有效负载中的字节数。 告诉硬件控制器将存储多少字节,包括以太网标头。 将以太网帧作为数据发送到DM9000A。 将负载发送到DM9000A。 通过中断等待传输完成。返回空闲状态。...将第一个值存储为有效负载中的字节数。 告诉硬件控制器将存储多少字节,包括 UDP/IP 标头。 将以太网帧作为数据发送到硬件控制器。 将IP 标头作为数据发送到硬件控制器。...IP 校验和是在发送标头之前计算的。 将UDP 标头作为数据发送到硬件控制器。 将所有数据发送到硬件控制器。

    49210

    ringbuffer是什么_drum buffer rope

    ,数据只要分两次才能写入循环缓存区; 第一次写入将后半部分剩余的缓存区大小使用完,第二次写入将剩余的未写入的数据大小从循环缓存区的首地址开始写入 (这也就是循环缓冲区的作用,使用较小的实际物理内存实现了线性缓存...然而,环形缓冲区的执行效率并不高,每读一个字节之前,需要判断缓冲区是否为空,并且移动尾指针时需要进行“折行处理”(即当指针指到缓冲区内存的末尾时,需要新将其定向到缓冲区的首地址);每写一个字节之前,需要判断缓区是否为...更重要的是,在向缓冲区中写数据时,只需要判断一次是否有空闲块并获取其块首指针就可以了,从而减少了重复性的条件判断,大大提高了程序的执行效率;同样在从缓冲队列中读取数据时,也是一次读取10字节的数据块,同样减少了重复性的条件判断...由于有可能要同接收多个数据帧,而根据CAN总线遥通信协议,高优先级的报文将抢占总线,则有可能在接收一个低优先级且被分为 好几段发送的数据帧时,被一个优先级高的数据帧打断。...,从real_in开始到缓冲区结尾的空间) -------------*/ i = min(len, r->size - r->rear % r->size); /* *

    1.1K20

    ringbuffer是什么_Buffer

    ,数据只要分两次才能写入循环缓存区; 第一次写入将后半部分剩余的缓存区大小使用完,第二次写入将剩余的未写入的数据大小从循环缓存区的首地址开始写入 (这也就是循环缓冲区的作用,使用较小的实际物理内存实现了线性缓存...然而,环形缓冲区的执行效率并不高,每读一个字节之前,需要判断缓冲区是否为空,并且移动尾指针时需要进行“折行处理”(即当指针指到缓冲区内存的末尾时,需要新将其定向到缓冲区的首地址);每写一个字节之前,需要判断缓区是否为...更重要的是,在向缓冲区中写数据时,只需要判断一次是否有空闲块并获取其块首指针就可以了,从而减少了重复性的条件判断,大大提高了程序的执行效率;同样在从缓冲队列中读取数据时,也是一次读取10字节的数据块,同样减少了重复性的条件判断...由于有可能要同接收多个数据帧,而根据CAN总线遥通信协议,高优先级的报文将抢占总线,则有可能在接收一个低优先级且被分为 好几段发送的数据帧时,被一个优先级高的数据帧打断。...开始到缓冲区结尾的空间) -------------*/ i = min(len, r->size - r->rear % r->size); /* * 当len > l时,拷贝buffer中剩余的内容

    1.8K40

    【数据结构】C语言实现双链表的基本操作

    (*L)->next)//当头结点的后继指针指向空指针时 { p->data = x;//将数据元素存储到新结点的数据域中 p->next = (*L)->next;//新结点的后继指针指向头结点后继指针指向的对象...p->prior = *L;//新结点的前驱指针指向头结点 (*L)->next = p;//头结点的后继指针指向新结点 } else { p->data = x;//将数据元素存储到新结点的指针域中...= x;//将数据元素存储到新结点的数据域中 s->next = r->next;//新结点的后继指针指向表尾结点的后继指针,即NULL s->prior = r;//新结点的前驱指针指向表尾结点...DNode* p = L->next;//指向表头结点的指针 int j = 1;//表头结点的位序 while (p && j 时结束循环;当查找结点的位序与目标位序相等时结束循环...= e)//当查找结点为空指针时结束循环 //当查找结点的数据域存储的元素与目标元素相等时结束循环 { p = p->next;//继续往后遍历 } return p;//查找结束后返回指针

    48510
    领券