C语言中 栈、队列、双向链表

一、双向链表

逻辑: 相较于单向链表,双向链表需要多存储一个上一节点的地址。

1. 节点的定义

typedef struct Node

{

int nVal;

struct Node* pNext;

struct Node* pLast;

}List;

2. 链表的添加

与单向链表相似,分成两种情况:链表中没有节点和链表中有节点

链表中没有节点,则新节点既链表中有节点是头结点也是尾节点。

链表中有节点,则新节点为尾节点,同时向前指针指向旧的尾节点

添加函数的定义:

void AddNode(List** ppHead, List** ppEnd, int nVal)

{

List* pTemp=malloc(sizeof(List));

pTemp->nVal =nVal;

pTemp->pLast = NULL;

pTemp->pNext = NULL;

if (*ppHead == NULL)

{

*ppHead = pTemp;

}

else

{

(*ppEnd)->pNext = pTemp;

pTemp->pLast = *ppEnd;

}

*ppEnd = pTemp;

}

3. 主函数中的使用:

int main()

{

List* pHead = NULL;

List* pEnd = NULL;

AddNode(&pHead, &pEnd, 1);

AddNode(&pHead, &pEnd, 2);

AddNode(&pHead, &pEnd, 3);

AddNode(&pHead, &pEnd, 4);

return 0;

}

二、队列

逻辑:先进先出,不允许插入

1.节点的定义

typedef struct Node

{

int nVal;

struct Node* pNext;

}Queue;

2.入队函数

void Push(Queue** ppHead, Queue** ppEnd, int nVal)

{

Queue* pTemp = malloc(sizeof(Queue));

pTemp->nVal = nVal;

pTemp->pNext = NULL;

if (NULL == *ppHead)

{

*ppHead = pTemp;

}

else

{

(*ppEnd)->pNext = pTemp;

}

*ppEnd = pTemp;

}

3.出队函数

int Pop(Queue** ppHead, Queue** ppEnd)

{

if (*ppHead != NULL)

{

Queue* pDel = *ppHead;

*ppHead = (*ppHead)->pNext;

int n = pDel->nVal;

free(pDel);

pDel = NULL;

if (NULL == *ppHead)

{

*ppEnd = NULL;

}

return n;

}

return -1;

}

4. 主函数中的使用:

int main()

{

Queue* pHead = NULL;

Queue* pEnd = NULL;

Push(&pHead, &pEnd, 1);

Push(&pHead, &pEnd, 2);

Push(&pHead, &pEnd, 3);

printf("%d\n", Pop(&pHead, &pEnd));

printf("%d\n", Pop(&pHead, &pEnd));

printf("%d\n", Pop(&pHead, &pEnd));

return 0;

}

三、栈

逻辑:后进先出

1.节点的定义

typedef struct Node

{

int nVal;

struct Node* pNext;

}Stack;

2.入栈函数

void Push(Stack** ppTop, int nVal)

{

Stack* pTemp= malloc(sizeof(Stack));

pTemp->nVal = nVal;

pTemp->pNext = *ppTop;

*ppTop = pTemp;

}

3.出栈函数

int Pop(Stack** ppTop)

{

if (*ppTop != NULL)

{

Stack* pDel = *ppTop;

*ppTop = (*ppTop)->pNext;

int n = pDel->nVal;

free(pDel);

pDel = NULL;

return n;

}

return -1;

}

4. 主函数中的使用:

int main()

{

Stack* pTop = NULL;

Push(&pTop, 1);

Push(&pTop, 2);

Push(&pTop, 3);

printf("%d\n", Pop(&pTop));

printf("%d\n", Pop(&pTop));

printf("%d\n", Pop(&pTop));

return 0;

}

相关推荐
智购科技无人售货机工厂店25 分钟前
玻璃瓶饮料破损率突然上升,排查发现是取货口缓冲垫老化了~YH
java·开发语言·人工智能·python·eclipse
枫叶丹434 分钟前
语音 AI 怎样边听边答:实时对话系统的工作原理
开发语言·人工智能·chatgpt·开源·php·agent·codex
xie0510_43 分钟前
Any类简要实现
开发语言·c++·算法
小狼Solar1 小时前
SAP MDG 功能范围说明(基于S/4HANA 2025)
java·开发语言
kimnoic1 小时前
Python常用标准库模块及查询使用方法
开发语言·python
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言输入和输出(4)
c语言·开发语言·学习
道尔柯南1 小时前
C++ 入门基础详解:从第一个程序到核心语法特性
开发语言·c++
盛世宏博智慧档案1 小时前
Modbus TCP+PoE以太网温湿度传感器项目部署全流程,附网络调试实操
开发语言·tcp/ip·php·以太网·传感器·温湿度
ACP广源盛139246256731 小时前
Type-C 扩展坞方案选型笔记|国产 DP1.2 转 HDMI2.0 桥接芯片 GSV2201D@ACP 评估
开发语言·笔记·硬件架构·硬件工程·hdmi·国产芯片
yuniko-n1 小时前
【JUC】线程间通信
java·开发语言