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;

}

相关推荐
骑士雄师8 分钟前
学生管理系统python版本比对
开发语言·python
basketball6169 分钟前
C++ 的 const 相关知识点总结
开发语言·c++
凯瑟琳.奥古斯特14 分钟前
信号分类与特性解析
java·开发语言·职场和发展
bnmoel21 分钟前
数据结构深度剖析栈与队列:结构、边界实现与进出操作全解析
c语言·数据结构·算法··队列
WL_Aurora23 分钟前
Python 算法基础篇之查找算法(一):顺序查找、二分查找与插值查找
开发语言·python·算法
阿文的代码库29 分钟前
对于C++中push_back的原理介绍与分析
开发语言·c++
枕星而眠33 分钟前
C++ 核心语法精讲:auto / 模板 / 命名空间 / 动态内存 从用法到面试
开发语言·c++·面试
沐知全栈开发40 分钟前
jEasyUI 创建异步提交表单
开发语言
yoyo_zzm40 分钟前
六大编程语言核心差异全解析
c语言·c++·spring boot·php
liu****40 分钟前
第16届国赛蓝桥杯大赛C/C++大学C组
c语言·数据结构·c++·算法·蓝桥杯