C语言实现使用带头结点的单链表来构造栈结构
来源:互联网 发布:视频赚钱软件 编辑:程序博客网 时间:2024/06/05 07:36
我在前面两篇博客中分别使用了静态数组、动态数组两种方式来构造栈,实现起来很方便,但总觉得灵活性还不够,因为无论怎样,我们都是要指定数组的长度。这篇博客中我们将会使用带头结点的单链表来模拟栈。为什么选用单链表呢?因为对于栈来说,弹出、压入等操作都是对栈顶来操作的。而单链表对第一个节点的操作是最为方便的。两者刚好能对应起来。代码上传至 https://github.com/chenyufeng1991/Stack_LinkedList 。
(1)声明节点类型、函数
typedef int elemType;typedef struct NodeList{ int element; struct NodeList *next;}Node;void createStack(Node **pNode);void destroyStack(Node *pNode);void push(Node *pNode,int value);void pop(Node *pNode);void top(Node *pNode);int isEmpty(Node *pNode);int isFull(Node *pNode);void printStack(Node *pNode);
(2)初始化单链表
//初始化带头结点的单链表void createStack(Node **pNode){ *pNode = (Node *)malloc(sizeof(Node)); if (*pNode == NULL) { printf("%s函数执行,内存分配失败,初始化单链表失败\n",__FUNCTION__); }else{ (*pNode)->next = NULL; printf("%s函数执行,带头结点的单链表初始化完成\n",__FUNCTION__); }}
(3)压入一个元素
//压入一个元素void push(Node *pNode,int value){ Node *pInsert; pInsert = (Node *)malloc(sizeof(Node));//需要检测分配内存是否成功 pInsert == NULL ? memset(pInsert, 0, sizeof(Node)); pInsert->next = NULL; pInsert->element = value; pInsert->next = pNode->next; pNode->next = pInsert;}
(4)弹出一个元素
//弹出一个元素void pop(Node *pNode){ if (!isEmpty(pNode)) { Node *pNext; pNext = pNode->next; pNode->next = pNext->next; free(pNext); pNext = NULL; }}
(5)打印栈元素
//打印栈元素void printStack(Node *pNode){ if (!isEmpty(pNode)) { Node *pMove; pMove = pNode->next; while (pMove != NULL) { printf("%d ",pMove->element); pMove = pMove->next; } printf("\n"); }else{ printf("栈为空,打印失败\n"); }}
(6)清空栈元素
//清空栈元素void destroyStack(Node *pNode){ Node *pMove; pMove = pNode->next; while (pMove != NULL) { pNode->next = pMove->next; free(pMove); pMove = pNode->next; }}
(7)判断栈是否为空
//判断栈是否为空int isEmpty(Node *pNode){ /** * 当只有一个头结点的时候,该链表就为空 */ if (pNode->next == NULL) { return 1; } return 0;}
(8)取栈顶元素
//取栈顶元素void top(Node *pNode){ if (!isEmpty(pNode)) { printf("栈顶元素为%d\n",pNode->next->element); }}
(8)测试代码
int main(int argc, const char * argv[]) { Node *pList; createStack(&pList); push(pList, 3);push(pList, 1);push(pList, 9);push(pList, 4);push(pList, 7); printStack(pList); pop(pList);pop(pList); printf("经过pop后栈的元素为:\n"); printStack(pList); top(pList); destroyStack(pList); printStack(pList); return 0;}
3 0
- C语言实现使用带头结点的单链表来构造栈结构
- 不带头结点的单链表的实现(C语言)
- 带头结点的链队列实现(C语言)
- 带头结点的链队列实现(C语言)
- 带头结点的链队列实现(C语言)
- C语言实现单链表(带头结点)的基本操作
- C语言实现单链表节点的删除(带头结点)
- C语言实现单链表的节点插入(带头结点)
- C语言实现单链表的逆序打印(带头结点)
- 用c语言实现链栈 (带头结点)
- C语言实现单链表-不带头结点
- 双指针不带头结点的链栈的实现(C语言)
- 双指针不带头结点的链栈的实现(C语言)
- C语言 带头结点的单链表
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- C语言实现非循环双链表节点的删除(带头结点尾结点)
- C语言实现双向非循环链表(带头结点尾结点)的节点插入
- 带头结点的单链表实现(C++)
- 也来看看Android的ART运行时
- [编译环境][gcc]在函数中定义函数
- 【B类】BI商业智能、大数据、Mysql、等系列课程集
- acm520
- MediaPlayer 音乐播放器进度条
- C语言实现使用带头结点的单链表来构造栈结构
- 【D类】编程开发视频课程系列
- java操作mongodb数据库
- HTML的发展历史
- 用最高效的方式计算2*8
- 【E类】Linux视频课程集
- c++ string
- 一步一步学ROP之gadgets和2free篇
- 50条如果其他类型更合适,尽量避免使用字符串