1.main.c
#include <stdio.h>
#include "llistqueue.h"
int main()
{
int num[] = {1, 2, 3, 4, 5};
int size = ((sizeof(num)) / (sizeof(num[0])));
// 创建链式队列
LListQueue_t *llist_queue;
llist_queue = LListQueue_Create();
if (NULL == llist_queue){
printf("error!!!!!\n");
}
// 入栈
for (int i = 0; i < size; i++){
if (0 != LListQueue_EnQueue(llist_queue, num[i])){
printf("error!!!!!\n");
break;
}
}
// 遍历链式队列中的元素
printf("链式队列元素:");
LListQueue_Show(llist_queue);
// 出栈
int temp = 0;
temp = LListQueue_DeQueue(llist_queue);
printf("出队元素:%d\n", temp);
printf("链式队列元素:");
// 遍历链式队列中的元素
LListQueue_Show(llist_queue);
// 释放链式队列空间内存
LListQueue_Free(llist_queue);
return 0;
}
2.llistqueue.c
#include "llistqueue.h"
// 创建链式队列
LListQueue_t *LListQueue_Create()
{
// 定义一个链表头节点结构体变量
LListQueue_t *llist_queue = NULL;
// 申请内存空间
llist_queue = (LListQueue_t *)calloc(1, sizeof(LListQueue_t));
// 错误判断
if (NULL == llist_queue){
return NULL;
}
// 将头节点的指针域指向NULL
llist_queue->next = NULL;
// 返回头节点地址
return llist_queue;
}
// 入队(尾插)
int LListQueue_EnQueue(LListQueue_t *llist_queue, Data_t data)
{
LListQueue_t *llist_queue1 = llist_queue;
LListQueue_t *llist_queue2 = NULL;
// 创建一个链表节点(存储数据和下一个节点的地址)
llist_queue2 = calloc(1, sizeof(LListQueue_t));
if (NULL == llist_queue2){
return -1;
}
// 放入元素
llist_queue2->data = data;
// 依次向后移动直到找到尾部
while (NULL != llist_queue1->next){
llist_queue1 = llist_queue1->next;
}
// 将尾结点的next指针域指向新结点的地址
llist_queue1->next = llist_queue2;
// 将新结点的next指针域指向NULL
llist_queue2->next = NULL;
return 0;
}
// 出队(头删)
int LListQueue_DeQueue(LListQueue_t *llist_queue)
{
// 存储出队的元素
int temp = 0;
// 头节点地址
LListQueue_t *llist_queue1 = llist_queue->next;
// 判断链表是否为空
if (NULL == llist_queue1){
return -1;
}
//保存出队元素
temp = llist_queue1->data;
// 头节点指向首结点的下一个节点
llist_queue->next = llist_queue1->next;
free(llist_queue1);
llist_queue1 = NULL;
// 将出队的元素返回
return temp;
}
// 遍历元素
void LListQueue_Show(LListQueue_t *llist_queue)
{
// 将头结点的地址保存在llist1中
LListQueue_t *llist_queue1 = llist_queue;
// 判断链表是否为空
if (NULL == llist_queue1->next){
return ;
}
// 依次向后移动一位遍历链表元素
while (NULL != llist_queue1->next){
llist_queue1 = llist_queue1->next;
printf("%d ", llist_queue1->data);
}
printf("\n");
}
// 释放内存空间
void LListQueue_Free(LListQueue_t *llist_queue)
{
LListQueue_t *llist_queue1 = NULL;
LListQueue_t *llist_queue2 = NULL;
for (llist_queue1 = llist_queue->next; NULL != llist_queue1; llist_queue1 = llist_queue2){
// 保存当前节点指向的下一个结点的地址
llist_queue2 = llist_queue1->next;
// 释放当前节点内存空间(llist1中保存的地址的内存空间)
free(llist_queue1);
}
// 释放链表中的头节点
free(llist_queue);
}
3.llistqueue.h
#ifndef _LLISTQUEUE_H_
#define _LLISTQUEUE_H_
#include <stdio.h>
#include <stdlib.h>
// 重定义
typedef int Data_t;
// 定义链表节点
typedef struct LinkedListQueue{
Data_t data; // 数据域
struct LinkedListQueue *next; // 指针域
}LListQueue_t;
LListQueue_t *LListQueue_Create();
int LListQueue_EnQueue(LListQueue_t *llist_queue, Data_t data);
int LListQueue_DeQueue(LListQueue_t *llist_queue);
void LListQueue_Show(LListQueue_t *llist_queue);
void LListQueue_Free(LListQueue_t *llist_queue);
#endif
4.运行结果

1559

被折叠的 条评论
为什么被折叠?



