嵌入式学习DAY21 --- 数据结构(双向链表、栈、队列)_队列、栈

Struct DoubleLinkNode *pHead;
Int count;
}


头插:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210322190312944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NwcmluZ1dKTg==,size_16,color_FFFFFF,t_70)



pNode->pNext = pHead;
pHead->pPri = pNode;
pHead = pNode;


尾插:


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210322190328502.png)



pTmp = pHead;
While(pTmp->pNext != NULL)
{
pTmp = pTmp->pNext;
}
pTmp->pNext = pNode;
pNode->pPri = pTmp;


中间插入:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210322190349627.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NwcmluZ1dKTg==,size_16,color_FFFFFF,t_70)



For(i = 0; i < iOffset-1; i++)
{
pTmp = pTmp->pNext;
}
pNode->pNext = pTmp->pNext;
pTmp->pNext->pPri = pNode;
pNode->pPri = pTmp;
pTmp->pNext = pNode;


头删:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210322190549615.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NwcmluZ1dKTg==,size_16,color_FFFFFF,t_70)



pDel = pHead;
pHead = pDel->pNext;
pHead->pPri = NULL;
Free(pDel);


尾删:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021032219060854.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NwcmluZ1dKTg==,size_16,color_FFFFFF,t_70)



Free(pDel);
pTmp->pNext = NULL;


中间删除:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210322190644736.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NwcmluZ1dKTg==,size_16,color_FFFFFF,t_70)



pTmp = pHead;
For(i = 0; i < iOffset-1; i++)
{
pTmp = pTmp->pNext;
}
pTmp->pNext = pDel->pNext;
pDel->pNext->pPri = pTmp;


**代码实现:**  
 ***第一步:doublelink.h***



#ifndef _DOUBLE_LINK_H_
#define _DOUBLE_LINK_H_

typedef int data_t;

//节点
typedef struct DoubleLinkNode
{
struct DoubleLinkNode *pPri;
data_t data;
struct DoubleLinkNode *pNext;
}DoubleLinkNode;

//描述双向链表
typedef struct DoubleLink
{
DoubleLinkNode *pHead;
int count;
}DoubleLink;

enum DOUBLE_LINK_OP
{
TAIL = -1,
HEAD,
DOUBLE_LINK_ERR,
DOUBLE_LINK_OK
};

DoubleLink *createDoubleLink();
int insertItemDoubleLink(DoubleLink *pLink, int iOffset, data_t tData);
int deleteItemDoubleLink(DoubleLink *pLink, int iOffset, data_t *pData);
void showDoubleLink(DoubleLink *pLink);
void destroyDoubleLink(DoubleLink **ppLink);

#endif


***第二步:doublelink.c***



#include<stdio.h>
#include “doubleLink.h”
#include <stdlib.h>
#include <string.h>

DoubleLink *createDoubleLink()
{
DoubleLink *pLink = (DoubleLink *)malloc(sizeof(DoubleLink));
if(NULL == pLink)
{
return NULL;
}
memset(pLink, 0, sizeof(DoubleLink));
return pLink;
}

int insertItemDoubleLink(DoubleLink *pLink, int iOffset, data_t tData)
{
if(NULL == pLink || iOffset < -1)
{
return DOUBLE_LINK_ERR;
}

DoubleLinkNode \*pNode = (DoubleLinkNode \*)malloc(sizeof(DoubleLinkNode));
if(NULL == pNode)
{
	return DOUBLE_LINK_ERR;
}
memset(pNode, 0, sizeof(DoubleLinkNode));
pNode->data = tData;

//如果是空链表
if(0 == pLink->count)
{
	pLink->pHead = pNode;
	pLink->count++;
	return DOUBLE_LINK_OK;
}

DoubleLinkNode \*pTmp = pLink->pHead;

//如果iOffset的值很大,就直接插入到末尾
if(iOffset >= pLink->count)
{
	iOffset = TAIL;
}
int i;
switch(iOffset)
{
	case HEAD:
		pNode->pNext = pLink->pHead;
		pLink->pHead->pPri = pNode;
		pLink->pHead = pNode;
		break;
	case TAIL:
		while(pTmp->pNext != NULL)
		{
			pTmp = pTmp->pNext;
		}
		pTmp->pNext = pNode;
		pNode->pPri = pTmp;
		break;
	default:
		//中间插入
	    for(i = 0; i < iOffset-1; i++)
		{
			pTmp = pTmp->pNext;
		}
		pNode->pNext = pTmp->pNext;
		pTmp->pNext->pPri = pNode;
		pNode->pPri = pTmp;
		pTmp->pNext = pNode;
		break;
}
pLink->count++;
return DOUBLE_LINK_OK;

}
int deleteItemDoubleLink(DoubleLink *pLink, int iOffset, data_t *pData)
{
if(NULL == pLink || NULL == pLink->pHead || NULL == pData || iOffset < -1)
{
return DOUBLE_LINK_ERR;
}

DoubleLinkNode \*pDel = pLink->pHead;
DoubleLinkNode \*pTmp = pLink->pHead;
int i;

//如果iOffset很大,就尾删
if(iOffset >= pLink->count-1)
{
	iOffset = TAIL;
}

switch(iOffset)
{
	case HEAD:
		pLink->pHead = pDel->pNext;
		pLink->pHead->pPri = NULL;
		break;
	case TAIL:
		pDel = pTmp->pNext;
		//如果只剩下一个节点
		if(NULL == pDel)
		{
			pDel = pTmp;
			break;
		}
		while(pDel->pNext != NULL)
		{

			pTmp = pTmp->pNext;
			pDel = pTmp->pNext;
		}
		pTmp->pNext = NULL;
		break;
	default:
		for(i = 0; i < iOffset-1; i++)
		{
			pTmp = pTmp->pNext;
		}
		pDel = pTmp->pNext;
		pTmp->pNext = pDel->pNext;
		pDel->pNext->pPri = pTmp;
        
}
\*pData = pDel->data;
free(pDel);
pDel = NULL;
pLink->count--;
return DOUBLE_LINK_OK;

}
void showDoubleLink(DoubleLink *pLink)
{
if(NULL == pLink || NULL == pLink->pHead)
{
return;
}
DoubleLinkNode *pTmp = pLink->pHead;
while(pTmp != NULL)
{
printf(“%d “, pTmp->data);
pTmp = pTmp->pNext;
}
printf(”\n”);
}

void destroyDoubleLink(DoubleLink **ppLink)
{
if(NULL == ppLink || NULL == *ppLink)
{
return;
}

DoubleLinkNode \*pDel = (\*ppLink)->pHead;
while(pDel != NULL)
{
	(\*ppLink)->pHead = pDel->pNext;
	free(pDel);
	pDel = (\*ppLink)->pHead;
}
free(\*ppLink);
\*ppLink = NULL;

}


第三步:main.c



#include<stdio.h>
#include “doubleLink.h”

int main()
{
DoubleLink *pLink = createDoubleLink();
insertItemDoubleLink(pLink, HEAD, 100);
insertItemDoubleLink(pLink, HEAD, 200);
insertItemDoubleLink(pLink, HEAD, 300);
insertItemDoubleLink(pLink, TAIL, 888);
insertItemDoubleLink(pLink, 2, 999);

showDoubleLink(pLink);
data_t data;
deleteItemDoubleLink(pLink, HEAD, &data);
showDoubleLink(pLink);
deleteItemDoubleLink(pLink, TAIL, &data);
showDoubleLink(pLink);
deleteItemDoubleLink(pLink, 1, &data);
showDoubleLink(pLink);

destroyDoubleLink(&pLink);
return 0;

}


二、栈和队列  
 1、栈和队列都是属于线性表  
 2、什么是线性表?—元素和元素之间的逻辑关系是一对一,那么就是线性表  
 3、线性表有两种存储结构:顺序存储 链式存储  
 4、顺序表----顺序存储的线性表  
 5、链表----链式存储的线性表  
 所以:栈有顺序栈也有链式栈、队列有顺序队列也有链式队列


本质上栈和队列都是线性表,只不过我们之前讲的顺序表和单链表对于哪里插入和哪里删除没有限制,头部、中间、尾部随便,无所谓,你需要哪种操作,都有,但是栈和队列就对顺序表和单链表的插入和删除操作进行了限制


栈只允许在头部插入和删除  
 队列只能在尾部插入,头部删除


顺序栈:  
 回忆顺序表:





还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!


王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。


对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!


【完整版领取方式在文末!!】


***93道网络安全面试题***


![](https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png)








![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)





![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)





内容实在太多,不一一截图了


### 黑客学习资源推荐


最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

#### 1️⃣零基础入门


##### ① 学习路线


对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。


![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)


##### ② 路线对应学习视频


同时每个成长路线对应的板块都有配套的视频提供:


![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值