数据结构读书笔记(二)(C语言)

《数据结构:C语言版》(严蔚敏)——读书笔记(一) 工作一年之后,想考研,先看看数据结构。 阅读详情

                                                                               (一)循环链表

存储类型

typedef struct LNode
 {
   ElemType data;
   struct LNode *next;
 };
 typedef struct LNode *LinkList; /* 另一种定义

和单链表的不同是:最后一个节点的next域指向头节点:

void InitList(LinkList &L)
 { // 操作结果:构造一个空的线性表L
   L=(LinkList)malloc(sizeof(LNode)); // 产生头结点,并使L指向此头结点
   if(!L) // 存储分配失败
     exit(OVERFLOW);
   L->next=L; // 指针域指向头结点
 }

 void DestroyList(LinkList &L)
 { // 操作结果:销毁线性表L
   LinkList q,p=L->next; // p指向头结点
   while(p!=L) // 没到表尾
   {
     q=p->next;
     free(p);
     p=q;
   }
   free(L);
   L=NULL;
 }

 void ClearList(LinkList &L) // 改变L
 { // 初始条件:线性表L已存在。操作结果:将L重置为空表
   LinkList p,q;
   L=L->next; // L指向头结点
   p=L->next; // p指向第一个结点
   while(p!=L) // 没到表尾
   {
     q=p->next;
     free(p);
     p=q;
   }
   L->next=L; // 头结点指针域指向自身
 }

 Status ListEmpty(LinkList L)
 { // 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
   if(L->next==L) // 空
     return TRUE;
   else
     return FALSE;
 }

 int ListLength(LinkList L)
 { // 初始条件:L已存在。操作结果:返回L中数据元素个数
   int i=0;
   LinkList p=L->next; // p指向头结点
   while(p!=L) // 没到表尾
   {
     i++;
     p=p->next;
   }
   return i;
 }

 Status GetElem(LinkList L,int i,ElemType &e)
 { // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
   int j=1; // 初始化,j为计数器
   LinkList p=L->next->next; // p指向第一个结点
   if(i<=0||i>ListLength(L)) // 第i个元素不存在
     return ERROR;
   while(j<i)
   { // 顺指针向后查找,直到p指向第i个元素
     p=p->next;
     j++;
   }
   e=p->data; // 取第i个元素
   return OK;
 }

 int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
 { // 初始条件:线性表L已存在,compare()是数据元素判定函数
   // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
   //           若这样的数据元素不存在,则返回值为0
   int i=0;
   LinkList p=L->next->next; // p指向第一个结点
   while(p!=L->next)
   {
     i++;
     if(compare(p->data,e)) // 满足关系
       return i;
     p=p->next;
   }
   return 0;
 }
 Status ListInsert(LinkList &L,int i,ElemType e) // 改变L
 { // 在L的第i个位置之前插入元素e
   LinkList p=L->next,s; // p指向头结点
   int j=0;
   if(i<=0||i>ListLength(L)+1) // 无法在第i个元素之前插入
     return ERROR;
   while(j<i-1) // 寻找第i-1个结点
   {
     p=p->next;
     j++;
   }
   s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
   s->data=e; // 插入L中
   s->next=p->next;
   p->next=s;
   if(p==L) // 改变尾结点
     L=s;
   return OK;
 }

 Status ListDelete(LinkList &L,int i,ElemType &e) // 改变L
 { // 删除L的第i个元素,并由e返回其值
   LinkList p=L->next,q; // p指向头结点
   int j=0;
   if(i<=0||i>ListLength(L)) // 第i个元素不存在
     return ERROR;
   while(j<i-1) // 寻找第i-1个结点
   {
     p=p->next;
     j++;
   }
   q=p->next; // q指向待删除结点
   p->next=q->next;
   e=q->data;
   if(L==q) // 删除的是表尾元素
     L=p;
   free(q); // 释放待删除结点
   return OK;
 }

 void ListTraverse(LinkList L,void(*vi)(ElemType))
 { // 初始条件:L已存在。操作结果:依次对L的每个数据元素调用函数vi()
   LinkList p=L->next->next; // p指向首元结点
   while(p!=L->next) // p不指向头结点
   {
     vi(p->data);
     p=p->next;
   }
   printf("\n");
 }

                                                                                                                                   双向链表

存储结构

 typedef struct DuLNode
 {
   ElemType data;
   DuLNode *prior,*next;
 }DuLNode,*DuLinkList;




基本操作

void InitList(DuLinkList &L)
 { // 产生空的双向循环链表L
   L=(DuLinkList)malloc(sizeof(DuLNode));
   if(L)
     L->next=L->prior=L;
   else
     exit(OVERFLOW);
 }

 void DestroyList(DuLinkList &L)
 { // 操作结果:销毁双向循环链表L
   DuLinkList q,p=L->next; // p指向第一个结点
   while(p!=L) // p没到表头
   {
     q=p->next;
     free(p);
     p=q;
   }
   free(L);
   L=NULL;
 }

 void ClearList(DuLinkList L) // 不改变L
 { // 初始条件:L已存在。操作结果:将L重置为空表
   DuLinkList q,p=L->next; // p指向第一个结点
   while(p!=L) // p没到表头
   {
     q=p->next;
     free(p);
     p=q;
   }
   L->next=L->prior=L; // 头结点的两个指针域均指向自身
 }

 Status ListEmpty(DuLinkList L)
 { // 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
   if(L->next==L&&L->prior==L)
     return TRUE;
   else
     return FALSE;
 }

 int ListLength(DuLinkList L)
 { // 初始条件:L已存在。操作结果:返回L中数据元素个数
   int i=0;
   DuLinkList p=L->next; // p指向第一个结点
   while(p!=L) // p没到表头
   {
     i++;
     p=p->next;
   }
   return i;
 }

 Status GetElem(DuLinkList L,int i,ElemType &e)
 { // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
   int j=1; // j为计数器
   DuLinkList p=L->next; // p指向第一个结点
   while(p!=L&&j<i) // 顺指针向后查找,直到p指向第i个元素或p指向头结点
   {
     p=p->next;
     j++;
   }
   if(p==L||j>i) // 第i个元素不存在
     return ERROR;
   e=p->data; // 取第i个元素
   return OK;
 }

 int LocateElem(DuLinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
 { // 初始条件:L已存在,compare()是数据元素判定函数
   // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
   //           若这样的数据元素不存在,则返回值为0
   int i=0;
   DuLinkList p=L->next; // p指向第1个元素
   while(p!=L)
   {
     i++;
     if(compare(p->data,e)) // 找到这样的数据元素
       return i;
     p=p->next;
   }
   return 0;
 }

 DuLinkList GetElemP(DuLinkList L,int i) // 另加
 { // 在双向链表L中返回第i个元素的地址。i为0,返回头结点的地址。若第i个元素不存在,
   // 返回NULL(算法2.18、2.19要调用的函数)
   int j;
   DuLinkList p=L; // p指向头结点
   if(i<0||i>ListLength(L)) // i值不合法
     return NULL;
   for(j=1;j<=i;j++)
     p=p->next;
   return p;
 }

 Status ListInsert(DuLinkList L,int i,ElemType e)
 { // 在带头结点的双链循环线性表L中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1
   // 改进算法2.18,否则无法在第表长+1个结点之前插入元素
   DuLinkList p,s;
   if(i<1||i>ListLength(L)+1) // i值不合法
     return ERROR;
   p=GetElemP(L,i-1); // 在L中确定第i个元素前驱的位置指针p
   if(!p) // p=NULL,即第i个元素的前驱不存在(设头结点为第1个元素的前驱)
     return ERROR;
   s=(DuLinkList)malloc(sizeof(DuLNode));
   if(!s)
     return OVERFLOW;
   s->data=e;
   s->prior=p; // 在第i-1个元素之后插入
   s->next=p->next;
   p->next->prior=s;
   p->next=s;
   return OK;
 }

 Status ListDelete(DuLinkList L,int i,ElemType &e) // 算法2.19
 { // 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长
   DuLinkList p;
   if(i<1) // i值不合法
     return ERROR;
   p=GetElemP(L,i);  // 在L中确定第i个元素的位置指针p
   if(!p) // p=NULL,即第i个元素不存在
     return ERROR;
   e=p->data;
   p->prior->next=p->next;
   p->next->prior=p->prior;
   free(p);
   return OK;
 }

 void ListTraverse(DuLinkList L,void(*visit)(ElemType))
 { // 由双链循环线性表L的头结点出发,正序对每个数据元素调用函数visit()
   DuLinkList p=L->next; // p指向头结点
   while(p!=L)
   {
     visit(p->data);
     p=p->next;
   }
   printf("\n");
 }

 void ListTraverseBack(DuLinkList L,void(*visit)(ElemType))
 { // 由双链循环线性表L的头结点出发,逆序对每个数据元素调用函数visit()。另加
   DuLinkList p=L->prior; // p指向尾结点
   while(p!=L)
   {
     visit(p->data);
     p=p->prior;
   }
   printf("\n");
 }

                                                      带头节点的线性链表

存储结构

                         

 typedef struct LNode // 结点类型
 {
   ElemType data;
   LNode *next;
 }*Link,*Position;

 struct LinkList // 链表类型
 {
   Link head,tail; // 分别指向线性链表中的头结点和最后一个结点
   int len; // 指示线性链表中数据元素的个数
 };

基本操作

void MakeNode(Link &p,ElemType e)
 { // 分配由p指向的值为e的结点。若分配失败,则退出
   p=(Link)malloc(sizeof(LNode));
   if(!p)
     exit(ERROR);
   p->data=e;
 }

 void FreeNode(Link &p)
 { // 释放p所指结点
   free(p);
   p=NULL;
 }

 void InitList(LinkList &L)
 { // 构造一个空的线性链表L
   Link p;
   p=(Link)malloc(sizeof(LNode)); // 生成头结点
   if(p)
   {
     p->next=NULL;
     L.head=L.tail=p;
     L.len=0;
   }
   else
     exit(ERROR);
 }

 void ClearList(LinkList &L)
 { // 将线性链表L重置为空表,并释放原链表的结点空间
   Link p,q;
   if(L.head!=L.tail) // 不是空表
   {
     p=q=L.head->next;
     L.head->next=NULL;
     while(p!=L.tail)
     {
       p=q->next;
       free(q);
       q=p;
     }
     free(q);
     L.tail=L.head;
     L.len=0;
   }
 }

 void DestroyList(LinkList &L)
 { // 销毁线性链表L,L不再存在
   ClearList(L); // 清空链表
   FreeNode(L.head);
   L.tail=NULL;
   L.len=0;
 }

 void InsFirst(LinkList &L,Link h,Link s) // 形参增加L,因为需修改L
 { // h指向L的一个结点,把h当做头结点,将s所指结点插入在第一个结点之前
   s->next=h->next;
   h->next=s;
   if(h==L.tail) // h指向尾结点
     L.tail=h->next; // 修改尾指针
   L.len++;
 }

 Status DelFirst(LinkList &L,Link h,Link &q) // 形参增加L,因为需修改L
 { // h指向L的一个结点,把h当做头结点,删除链表中的第一个结点并以q返回。
   // 若链表为空(h指向尾结点),q=NULL,返回FALSE
   q=h->next;
   if(q) // 链表非空
   {
     h->next=q->next;
     if(!h->next) // 删除尾结点
       L.tail=h; // 修改尾指针
     L.len--;
     return OK;
   }
   else
     return FALSE; // 链表空
 }

 void Append(LinkList &L,Link s)
 { // 将指针s(s->data为第一个数据元素)所指(彼此以指针相链,以NULL结尾)的
   // 一串结点链接在线性链表L的最后一个结点之后,并改变链表L的尾指针指向新的尾结点
   int i=1;
   L.tail->next=s;
   while(s->next)
   {
     s=s->next;
     i++;
   }
   L.tail=s;
   L.len+=i;
 }

 Position PriorPos(LinkList L,Link p)
 { // 已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置。若无前驱,则返回NULL
   Link q;
   q=L.head->next;
   if(q==p) // 无前驱
     return NULL;
   else
   {
     while(q->next!=p) // q不是p的直接前驱
       q=q->next;
     return q;
   }
 }

 Status Remove(LinkList &L,Link &q)
 { // 删除线性链表L中的尾结点并以q返回,改变链表L的尾指针指向新的尾结点
   Link p=L.head;
   if(L.len==0) // 空表
   {
     q=NULL;
     return FALSE;
   }
   while(p->next!=L.tail)
     p=p->next;
   q=L.tail;
   p->next=NULL;
   L.tail=p;
   L.len--;
   return OK;
 }

 void InsBefore(LinkList &L,Link &p,Link s)
 { // 已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前,
   // 并修改指针p指向新插入的结点
   Link q;
   q=PriorPos(L,p); // q是p的前驱
   if(!q) // p无前驱
     q=L.head;
   s->next=p;
   q->next=s;
   p=s;
   L.len++;
 }

 void InsAfter(LinkList &L,Link &p,Link s)
 { // 已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之后,
   // 并修改指针p指向新插入的结点
   if(p==L.tail) // 修改尾指针
     L.tail=s;
   s->next=p->next;
   p->next=s;
   p=s;
   L.len++;
 }

 void SetCurElem(Link p,ElemType e)
 { // 已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值
   p->data=e;
 }

 ElemType GetCurElem(Link p)
 { // 已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值
   return p->data;
 }

 Status ListEmpty(LinkList L)
 { // 若线性链表L为空表,则返回TRUE,否则返回FALSE
   if(L.len)
     return FALSE;
   else
     return TRUE;
 }

 int ListLength(LinkList L)
 { // 返回线性链表L中元素个数
   return L.len;
 }

 Position GetHead(LinkList L)
 { // 返回线性链表L中头结点的位置
   return L.head;
 }

 Position GetLast(LinkList L)
 { // 返回线性链表L中最后一个结点的位置
   return L.tail;
 }

 Position NextPos(Link p)
 { // 已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的位置。若无后继,则返回NULL
   return p->next;
 }

 Status LocatePos(LinkList L,int i,Link &p)
 { // 返回p指示线性链表L中第i个结点的位置,并返回OK,i值不合法时返回ERROR。i=0为头结点
   int j;
   if(i<0||i>L.len)
     return ERROR;
   else
   {
     p=L.head;
     for(j=1;j<=i;j++)
       p=p->next;
     return OK;
   }
 }

 Position LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType))
 { // 返回线性链表L中第1个与e满足函数compare()判定关系的元素的位置,
   // 若不存在这样的元素,则返回NULL
   Link p=L.head;
   do
     p=p->next;
   while(p&&!(compare(p->data,e))); // 没到表尾且没找到满足关系的元素
   return p;
 }

 void ListTraverse(LinkList L,void(*visit)(ElemType))
 { // 依次对L的每个数据元素调用函数visit()
   Link p=L.head->next;
   int j;
   for(j=1;j<=L.len;j++)
   {
     visit(p->data);
     p=p->next;
   }
   printf("\n");
 }

 void OrderInsert(LinkList &L,ElemType e,int (*comp)(ElemType,ElemType))
 { // 已知L为有序线性链表,将元素e按非降序插入在L中。(用于一元多项式)
   Link o,p,q;
   q=L.head;
   p=q->next;
   while(p!=NULL&&comp(p->data,e)<0) // p不是表尾且元素值小于e
   {
     q=p;
     p=p->next;
   }
   o=(Link)malloc(sizeof(LNode)); // 生成结点
   o->data=e; // 赋值
   q->next=o; // 插入
   o->next=p;
   L.len++; // 表长加1
   if(!p) // 插在表尾
     L.tail=o; // 修改尾结点
 }

 Status LocateElem(LinkList L,ElemType e,Position &q,int(*compare)(ElemType,ElemType))
 { // 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中
   // 第一个值为e的结点的位置,并返回TRUE;否则q指示第一个与e满足判定函数
   // compare()取值>0的元素的前驱的位置。并返回FALSE。(用于一元多项式)
   Link p=L.head,pp;
   do
   {
     pp=p;
     p=p->next;
   }while(p&&(compare(p->data,e)<0)); // 没到表尾且p->data.expn<e.expn
   if(!p||compare(p->data,e)>0) // 到表尾或compare(p->data,e)>0
   {
     q=pp;
     return FALSE;
   }
   else // 找到
   {
     q=p;
     return TRUE;
   }
 }


《数据结构:c语言版》(严蔚敏)知识点整合 数据结构是相互之间存在一种或多种特定关系的数据元素的集合, 《数据结构》让读者认识到了各种数据结构在处理数据上的优缺点, 理解掌握相关数据结构的具体操作,在结构的基础上添加好的算法,就能够更好的处理和利用数据。 算法的时间空间复杂度: 线性表: 线性表的顺序存储结构 用一组连续的存储单元依次存储线性表的数据元素。 特点:线性表的顺序存储是一种随机存取的存储结构。 随机存取:即读写存储的消息的时间与存储的位置无关 相关操作: 2.插入: 3.查找 4.删除 1.初始化 2.单链表的插入 3.查找 4. 阅读详情

相关推荐

读书笔记-数据结构C语言版

数据元素之间的逻辑结构:集合,线性结构,树形结构,图形结构或网状结构 物理结构:顺序存储结构和链式存储结构   任何算法的设计取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。   线性表是n个数据元素的有限序列。称i为数据元素ai在线性表中的位序。线性表示一个相当灵活的数据结构,它的长度可根据需要增长或缩短,可访问/插入/删除。 线性表的顺序表示指的是一组地址连续的存储

vivien_shaw的博客 1万+

学习数据结构心得

看书初步学习了解,看视频老师梳理重点加深理解,然后讨论环节可以让我们通过一个点去深挖里面的知识同时又增加了师生的互动,你还可以看到不同的同学的思考的角度。如算法这一节的Print N讨论,看完全部发布+讨论后,我觉得梓盈真的做的很好,原本我觉得除了二分法应该可以用代码让程序自己找出最大值,但是不知道怎么实现,看完老师的实现恍然大悟,而且对递归内部如何进行的步骤印象更深。3. 本章的知识点基本都是概念性的,对这些基本概念的理解会对为接下来进一步学习数据结构有比较大的帮助。——逻辑结构:从数据的。

weixin_63235527的博客 1177

从C++到C——我的C语言学习笔记

刚上大学就学习了C++,有人跟我说C++包括了C语言,学过C++就没有必要在弄C语言了。也有人说,C语言是程序员的通用语言,我们都应该花时间好好研究一下。之前也有看过一些书,这些书的作者也都建议读者学好C,而且强调不是C++。一直都有学习C语言的打算,直到我尝试写C程序发现编译都

...... 3137

数据结构-c语言读书报告,读书笔记--《数据结构 C语言版》第一章

读书笔记 《数据结构》严蔚敏,第一章的三元组实现,C++描述。Triplet.h#includetypedef int *Triplet;typedef int Status;enum value{WRONG=-2,OK,TRUE=10,FALSE=11};Status InitTriplet(Triplet &T,int e1,int e2,int e3){if((T=new int[3...

weixin_39539764的博客 324

严蔚敏数据结构C语言版视频教程之总结笔记

清华大学严蔚敏数据结构视频,对应的笔记,PDF版本。

《数据结构》读书笔记

清华大学严蔚敏,吴伟民经典教材《数据结构》读书笔记

数据结构C语言严蔚敏版(第二版)超详细笔记附带课后习题

根据此书所做随笔笔记。 一、绪论 1.1、数据机构的研究内容 用计算机解决实际问题时,步骤:首先分析实际问题,从中抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编程,调试,测试。 寻求数据模型的实质是分析问题,从中提取出计算机处理的对象,并找出这些对象之间的关系,然后用数学的语言加以描述。 关键:分析问题中所用到的数据是如何组织的,研究数据之间存在什么样的关系。 由于数据必须在计算机中处理,因此不能局限于数据本身的数学问题的研究,还必须考虑数据的物理结构,即数据在计算机中的存储结构。 1.

chongyang_的博客 32万+

严蔚敏,数据结构(C语言)笔记

这个资源来源于考研论坛,感谢考研论坛的资源,我考研也参考了很多这个网站的资源

《数据结构与算法分析:C语言描述》读书笔记及课后习题解答

找了很久才找到的,写的很好,希望能帮助到正在看这本书的大家~ 读书笔记https://www.cnblogs.com/zhuli19901106/p/data-structure-and-algorithm-analysis-in-C.html 课后习题解答https://github.com/xxks-kkk/algo ...

qq_43365825的博客 4596

Springer期刊LaTeX模板中参考文献格式选择与编译错误的快速修复指南

本文针对Springer期刊LaTeX模板中参考文献编译后显示问号的常见问题,提供了快速修复指南。核心在于正确选择并配置与期刊匹配的参考文献格式文件(.bst),并执行标准的四步编译流程。文章详细解释了问题根源,并给出了从查找正确.bst文件到修改代码、执行编译的完整解决方案,帮助作者高效解决投稿中的技术障碍。

weixin_29266007的博客 402

ArcGIS将以大西洋居中的世界地图以中国居中显示

ArcGIS将以大西洋居中的世界地图以中国居中显示 并进行经纬度格网的调整输出

jiekeheiguanglan的博客 5705

《数据结构与算法分析:C语言描述》读书笔记

作为一名大一新生,正在学习C语言编程。大一上学期接触的是python,但也只是了解python的语法以及一些常用函数。在日常刷题时总是感觉很难受,因为用来用去都是几个最简式的数据结构,而算法大部分都是穷举的方法。于是正好趁着现在在学习C语言,然后师兄又推荐这本书,正好可以系统地了解一下算法与数据结构。 但是我对事物总是只有三分热度,为了更好的坚持下去,决定将该书的读书笔记作为我的第一篇博客。希望每天都可以学习几页,写一篇读书笔记,因为知识有限,可能会有很多不正确的观点,假如有同学看到,随时指正。OK...

m0_57927118的博客 1746

ColorOS13系统账户锁与密码锁破解全指南:从恢复模式到激活绕过

本文针对ColorOS13系统用户,详细解析了忘记锁屏密码(数字/图案锁)和遭遇OPPO账户锁(激活锁)的合法解决方案。核心是通过官方恢复模式进行格式化操作清除锁屏密码,并强调账户锁需通过密码找回或官方售后等正规途径解除。文章旨在帮助设备合法所有者恢复使用权,并提供了安全操作指南与数据备份建议。

weixin_28304023的博客 967

《C语言程序设计》读书笔记

写在前面:   《C程序设计》可以说是一本再基础不过的编程书了,但每读一遍的感觉却都是不同的,可以说,每读一遍,都会有很多新的收获。真所谓老书再读,回味无穷啊!此笔记是《C程序设计》谭浩强编著,清华大学出版社出版。除了将书中的重点知识点记下来外,也加入了我对知识点的理解,我想这一点是读书笔记的重要性所在。 第一章 概述 第二章 数据类型、运算符与表达式 第三章 最简单的c程序设计 第四章 逻辑运算

听风的专栏 1万+

02-Cesium-实现天地图标记

首先天地图申请token,然后Cesium-实现天地图标记详细说明

m0_62785037的博客 1171

射频指纹识别技术:原理、应用与深度学习实现

射频指纹识别(RFFI)是一种基于硬件特征的设备身份认证技术,通过分析无线设备发射信号中的独特硬件特征实现设备识别。其核心原理源于发射器硬件电路的非线性特性,如功率放大器的相位噪声和混频器的非线性失真,这些特征具有难以伪造的特点。在物联网和边缘计算场景中,RFFI技术展现出独特优势,尤其在智能家居和工业物联网中,能有效防止非法接入和设备伪造。深度学习方法的引入进一步提升了RFFI的性能,通过自动特征提取和端到端优化,显著提高了识别准确率。本文详细探讨了RFFI的技术原理、应用场景及实现方法,为相关领域的研究

weixin_30457465的博客 891

《数据结构和算法分析—C语言描述》读书笔记

第一章主要讲的是数学知识的复习,指数,级数什么的,最后,浅层次的谈了一下递归。   当一个函数用它自己来定义时就称为是递归(recursive)的,C语言是允许递归的。但重要的是要记住,C提供的仅仅是遵循递归思想的一种企图。不是所有的数学递归函数都能有效地或者正确地由C的递归模拟来实现。   举个递归的小例子:   int x   F(int X)   {       if(0 ==

wujiafei_njgcxy的博客 4322

故障排查:OpenClaw 更新后 feishu 插件路径失效的解决方法

OpenClaw 更新后 feishu 插件路径失效的解决方法发现问题→ Gateway 启动失败,报插件路径错误定位原因→ OpenClaw 目录结构变化,→解决问题→ 更新为正确的路径验证修复→ 使用确认一切正常。

刘一说的IT专栏 1306

20200716_数据结构C++语言版_读书笔记02

20200716_数据结构C++语言版_读书笔记02 每日小知识 xboxone手柄连接完电脑后再连接XBOX,会经常出现无法匹配的问题,解决方法为先开主机,再开手柄。——所以一个手柄不要来回切换信号,会有配对BUG。 一、相关术语 欧几里得 欧几里得几何是现代公理系统的鼻祖。从计算的角度看,针对不同的任何问题,欧氏任何都给出了一套几何作图流程。 二、相关内容 第1章,绪论。 1.1 计算机与算法 1.1.3 起泡排序 排序的概念:将给定的一组元素顺序排列,比如将n个整数按通常的大小次序排成一个非降序列

丰哥的专栏 495

【应用】打造你的安全本地AI购物助手:OpenClaw + 淘宝MCP部署全攻略

本文介绍了在Ubuntu虚拟机中配置OpenClaw连接Windows宿主机的淘宝MCP服务的两种方案。核心原理是通过修改MCP服务监听地址或SSH隧道转发,实现跨网络访问。方案1推荐修改MCP服务绑定0.0.0.0并配置防火墙放行端口,适合长期使用;方案2通过SSH隧道转发,适合临时测试。文章详细说明了环境准备、配置文件修改及两种互通方案的具体实施步骤,重点解决了虚拟机与宿主机网络互通的关键问题。

海兰 1324

RK3576 PCIE接口调试:基于RTL8111HS的网卡驱动移植

检查项方法电源电压复位时序检查设备树 reset-gpios链路速率设备识别lspci -vvv驱动加载。

小灰灰的博客 739

数据结构(C语言描述)读书笔记之二叉树

树是树型结构的简称。若树中各节点的子树是按照一定的次序从左到右安排的,则称之为有序树,否则称为无序树。     森林是m(m>=0)棵互不相交的树的集合。     树的性质:     1,树中的结点数等于所有结点的度数加1.     2,度为k的树中第i层上至多有k^(i-1)个结点(i>=1).     3,深度为h的k叉树至多有(k^h-1)/(k-1)个结点。     4,具有n

一片孤城万仞山 932

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数据结构读书笔记(三)(C语言)

栈 顺序实现: 存储结构: #define STACK_INIT_SIZE 10 // 存储空间初始分配量 #define STACK_INCREMENT 2 // 存储空间分配增量 struct SqStack { SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针 int

linuxlinuxlinuxlinux的专栏 1258

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

20200714_数据结构C++语言版\_读书笔记01

20200714_数据结构C++语言版_读书笔记01 每日小知识 搜狗拼音有两个进程是广告,一个是SGNews.exe,还有一个是【homenewsofsg.exe】。 一、相关术语 ENIAC 全称为【electronic numerical integrator and computer】,电子数字积分计算机。 二、相关内容 第1章,绪论。 1.1 计算机与算法 1.1.1 古埃及人的绳索 算法描述: perpendicular(1,A) 输入:直线1及其上一点A 输出:经过A且垂直于1的直线 1、

丰哥的专栏 497

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: Win7系统中Telnet服务的安装和启动
下一篇: 数据结构读书笔记(三)(C语言)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值