这期内容就不详细具体展开了,但该有的代码还是有的,学习数据结构重点就是要亲自把代码实现,所以如果您再自己亲自写代码的过程中有什么疑问欢迎大家评论区讨论。
废话不多说直接上代码。
目录
1.栈代码实现 1.1主要功能介绍
2.队列代码实现 2.1主要功能介绍
1.栈代码实现
1.1主要内容: 栈的初始化、元素入栈、元素出栈、获取栈顶元素、打印栈。
其实栈是在链表表尾进行插入和删除的线性表。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
// 定义变量结构体 与单链表类似
typedef struct node
{
int data;
struct node* next;
}Node;
// 初始化
Node* initStack()
{
Node* S = (Node*)malloc(sizeof(Node));
assert(S);
S->data = 0;
S->next=NULL;
return S;
}
//插入函数(尾插)
void push(Node* s,int x)
{
Node* node = (Node*)malloc(sizeof(node));
assert(node);
node->data = x;
node->next = s->next;
s->next = node;
s->data++;
}
// 判断栈是否为空, 为后面出栈做准备
int is_emepty(Node* S)
{
if (S->data == 0 || S->next == NULL)
return 1;
else
return 0;
}
// 此函数能获取栈顶元素
int Gettop(Node* S)
{
if (is_emepty(S))
return -1;
else
return S->next->data;
}
// 出栈函数(尾删)
int pop(Node* S)
{
int d;
Node* node = S->next;
if (is_emepty(S)) //判断是否是空栈
{
return -1;
}
else
{
d = node->data;
S->next = node->next;
return d;
}
}
// 栈打印函数
void printStack(Node* S)
{
Node* node = S->next;
while (node != NULL) //循环遍历
{
printf("%d->", node->data);
node = node->next;
}
printf("NULL\n");
}
//主函数调用其他子函数
int main()
{
Node* S = initStack();
push(S, 1);
push(S, 2);
push(S, 3);
pop(S);
printf("%d\n", Gettop(S));
printStack(S);
return 0;
}
2.队列代码实现
2.1 主要内容: 队列初始化、入队、出队、打印队列。
其实队列时只能在一端插入,另一端删除的线性表。
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct node
{
int data;
struct node* next;
}Node;
//队列的初始化
Node* initQueue()
{
Node* Q = (Node*)malloc(sizeof(Node));
assert(Q);
Q->next = NULL;
Q->data = 0; // 用来记录元素个数
return Q;
}
//判断队列是否为空
int is_emepty(Node* Q)
{
if (Q->data == 0 || Q->next == NULL)
return 1;
else
return 0;
}
//入队 尾插
void enQueue(Node* Q, int data)
{
Node* q = Q->next;
Node* node = (Node*)malloc(sizeof(Node));
assert(node);
if (is_emepty(Q))
{
Q->next = node;
node->data = data;
node->next = NULL;
}
else
{
/*for (int i = 0; i < Q->data; i++)
{
q = q->next;
}*/
while (q->next) //两种找到尾结点的方式
{
q = q->next;
}
q->next = node;
node->data = data;
node->next = NULL;
}
Q->data++;
}
//出队 头出
void deQueue(Node* Q)
{
Node* node = Q->next;
if (is_emepty(Q))
return;
else
Q->next = node->next;
free(node);
node = NULL;
Q->data--;
}
// 打印函数
void printQueue(Node* Q)
{
Node* node = Q->next;
while (node)
{
printf("%d->", node->data);
node = node->next;
}
printf("NULL\n");
}
//主函数调用
int main()
{
Node* Q = initQueue();
enQueue(Q, 1);
enQueue(Q, 2);
deQueue(Q);
printf("%d\n", Q->data);
printQueue(Q);
return 0;
}