链表实现栈 and 队列
介绍
本文采用链表形式取实现栈和队列操作;都具有基本功能
- 栈:
例题为:进制转换
功能:具有出栈、入栈、清空三个
详细参考:C_栈(进制转换)- 队列:
无例题(仅测试)
功能:具有头部插入队列、尾部出队列、清空队列、获取头部元素、获取尾部元素五个功能
源码
链表 - 栈
#include<stdlib.h>
#include<stdio.h>
//用 链表 的形式实现 栈
typedef struct Linked_List
{
int data;
Linked_List* naxt;
Linked_List* pre;
}NODE, *PNODE;
/*****************************初始化*****************************/
//初始化方法一:
void Init_Linked_List_1(PNODE *top)
{
(*top) = (PNODE)malloc(sizeof(NODE));
(*top)->naxt = NULL;
(*top)->pre = NULL;
}
//初始化方法二(带数据初始化)
PNODE Init_Linked_List_2(int data)
{
PNODE p = (PNODE)malloc(sizeof(NODE));
p->naxt = NULL;
p->pre = NULL;
p->data = data;
return p;
}
/*****************************插入值*****************************/
//头部插入(详细看图解)
void TopInsert(PNODE top, int data)
{
//调用初始化创建一个新节点并赋值
PNODE p = Init_Linked_List_2(data);
p->naxt = top->naxt;//第一步
if (p->naxt != NULL) p->naxt->pre = p;//第二步
p->pre = top;//第三步
top->naxt = p;//第四步
}
/*****************************打印值*****************************/
void Print_Linked_list(PNODE top)
{
//定义一个变量记录top(第一个节点)
PNODE temp = top->naxt;
//循环判断temp->naxt记录的是不是NULL;
while (temp != NULL)
{
printf("%d->", temp->data);
temp = temp->naxt;
}
printf("NULL\n");
}
/*****************************清空值*****************************/
void DeleAll_Linked_list(PNODE top)
{
PNODE p;
while (top)//当top == NULL时结束循环
{
p = top;//临时结构体指针记录节点
top = top->naxt;//获取下一个节点地址
free(p);//释放结构体指针记录的节点
}
printf("释放成功\n");
}
void main()
{
/*****************************初始化*****************************/
PNODE list;
//方法一:
Init_Linked_List_1(&list);
方法二:带 data 初始化(意味着第一个指针位置有 data)
//list = Init_Linked_List_2(3);
int x = 66666;
//入栈
while (x != 0)
{
TopInsert(list, x % 16);//十进制转16进制
x >>= 4;//这里也要同步右移4位(PS:相当于除16);
}
//出栈
Print_Linked_list(list);
//清空栈
DeleAll_Linked_list(list);
system("pause");
}
链表 - 队列
插入队列部分代码图解(PS:此图仅为理论图,实际代码并非如图绘制)
#include<stdio.h>
#include<stdlib.h>
typedef struct Linked_Queue
{
int data;
Linked_Queue *begin;
Linked_Queue *end;
}NODE, *PNODE;
//初始化(带数据初始化)
PNODE Init_insert(int data)
{
PNODE p = (PNODE)malloc(sizeof(NODE));
p->begin = NULL;
p->end = NULL;
p->data = data;
return p;
}
//头部插入(看图解or看注释很容易明白)
void TopInsert(PNODE top, int data)
{
//调用初始化创建一个新节点并赋值
PNODE p = Init_insert(data);
/***************************************************
判断是否就top一个节点
(1)没有节点时,可以直接创建后链接top节点;
(2)当有节点时,需要 先链接下一个节点 在 链接top节点;
****************************************************/
if (top->end == NULL)
{
//没有节点时:执行下列语句(参考图一)
top->end = p;
p->begin = top;
p->end = top;
top->begin = p;
}
else
{
//有节点时:执行下列语句(参考图二)
p->end = top->end;
p->end->begin = p;
p->begin = top;
top->end = p;
}
}
//输出值
void Print_Linked_Queue(PNODE top)
{
PNODE temp = top->begin;
printf("\n打印结果: ");
//当获取到top时对比data数据结束循环
while (temp->data != top->data)
{
printf("%d->", temp->data);
temp = temp->begin;//获取下一个节点地址
}
printf("\n");
}
//打印队头元素
void Fine_head_Queue(PNODE top)
{
printf("队列头部元素:%d->\n", top->end->data);
}
//打印队尾元素
void Fine_end_Queue(PNODE top)
{
printf("\n队列尾部元素:%d->\n", top->begin->data);
}
//清空队列
void DeleAll_Linked_Queue(PNODE top)
{
PNODE p = top;
while (p->data != top->data)//当获取到top时对比data数据结束循环
{
p = top;//临时结构体指针记录节点
top = top->begin;//获取下一个节点地址
free(p);//释放结构体指针记录的节点
}
printf("\nQueue释放成功\n");
}
void main()
{
//初始化并赋值data(方便判断是否队空)
PNODE queue = Init_insert(NULL);
//插入元素
TopInsert(queue, 1);
TopInsert(queue, 2);
TopInsert(queue, 3);
TopInsert(queue, 4);
TopInsert(queue, 5);
Fine_head_Queue(queue);//获取队头元素
Fine_end_Queue(queue);//获取队尾元素
Print_Linked_Queue(queue);//打印所有元素
DeleAll_Linked_Queue(queue);//清空所有元素
system("pause");
}