链式队列和链式栈

链式队列

头文件

#ifndef __HTLINKLIST_H__
#define __HTLINKLIST_H__

typedef int datatype;

typedef struct Node
{
	union
	{
		datatype data;
		int len;
	};

	struct Node *next;

}Node;

typedef struct
{
	Node *head;
	Node *tail;
}Linklist, *Linklistptr;

//创建一个空间
Linklistptr list_create();

//判断空
int list_empty(Linklistptr LQ);

//入队
int list_push(Linklistptr LQ,datatype e);

//遍历
int list_show(Linklistptr LQ);

//出队
int list_pop(Linklistptr LQ);

//尾删
int list_delete_tail(Linklistptr LQ);

//释放
void list_free(Linklistptr LQ);

#endif

源文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "htlinklist.h"

//创建一个头指针和尾指针
Linklistptr list_create()
{
	Linklistptr LQ=(Linklistptr)malloc(sizeof(Linklist));
	if(NULL==LQ)
	{
		printf("创建失败\n");
		return NULL;
	}

	//创建成功的话,说明里面有两个指针
	//申请一个链表将head指针指向头节点
	LQ->head=(Node*)malloc(sizeof(Node));
	if(NULL==LQ->head)
	{
		printf("创建失败\n");
		return NULL;
	}

	//成功需要将链表初始化
	LQ->head->len=0;
	LQ->head->next=NULL;

	//将尾指针指向头节点
	LQ->tail=LQ->head;

	printf("队列创建成功\n");
	return LQ;
}

//判断空
int list_empty(Linklistptr LQ)
{
	//判断逻辑
	if(NULL==LQ||NULL==LQ->head)
	{
		printf("所给队列不合法\n");
		return -1;
	}

	return LQ->head==LQ->tail;
}

//入队
int list_push(Linklistptr LQ,datatype e)
{
	//判断逻辑
	if(NULL==LQ||NULL==LQ->head)
	{
		printf("入队失败\n");
		return 0;
	}

	//申请一个节点封装数据
	Node *q=(Node *)malloc(sizeof(Node));
	if(NULL==q)
	{
		printf("申请失败\n");
		return -1;
	}

	q->data=e;
	q->next=NULL;

	//尾插过程
	q->next=LQ->tail->next;
	LQ->tail->next=q;

	//将尾指针指向q节点
	LQ->tail=q;

	printf("插入成功\n");

	//自增
	LQ->head->len++;

	return 1;
}

//遍历
int list_show(Linklistptr LQ)
{
	//判断逻辑
	if(NULL==LQ||list_empty(LQ))
	{
		printf("遍历失败\n");
		return 0;
	}

	//遍历过程
	Node *q=LQ->head;
	for(int i=1;i<=LQ->head->len;i++)
	{
		q=q->next;
		printf("元素分别是:");
		printf("%d\t",q->data);
	}
	putchar(10);
	return 1;
}

//出队
int list_pop(Linklistptr LQ)
{
	//判断逻辑
	if(NULL==LQ||list_empty(LQ))
	{
		printf("出队失败\n");
		return 0;
	}

	Node *q=LQ->head->next;
	//头删
	LQ->head->next=q->next;
	free(q);
	q=NULL;
	/*LQ->head->next=LQ->head->next->next;
	free(LQ->head->next);*/

	//自减
	LQ->head->len--;

	//判断队伍中是否已经删除完所有节点
	if(LQ->head->next==NULL)
	{
		//将尾指针重新指向头结点
		LQ->tail=LQ->head;
	}
	return 1;
}

//尾删
int list_delete_tail(Linklistptr LQ)
{	
	//判断逻辑
	if(NULL==LQ||list_empty(LQ))
	{
		printf("尾删失败\n");
		return 0;
	}

	//尾删过程
	free(LQ->tail);

	//自减
	LQ->head->len--;

	return 1;
}

//释放
void list_free(Linklistptr LQ)
{
	//判断逻辑
	if(NULL==LQ)
	{
		printf("释放失败\n");
		return ;
	}
	if(!list_empty(LQ))
	{
		list_pop(LQ);
	}

	//释放头节点
	free(LQ->head);
	LQ->head=LQ->tail=NULL;

	//释放队列
	free(LQ);
	LQ=NULL;
	printf("释放成功\n");
}

主函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "htlinklist.h"
int main(int argc, const char *argv[])
{
	Linklistptr LQ=list_create();
	if(NULL==LQ)
	{
		return -1;
	}

	//入队
	list_push(LQ,1);
	list_push(LQ,2);
	list_push(LQ,1);
	list_push(LQ,3);
	list_push(LQ,8);

	//遍历
	list_show(LQ);

	//尾删
	//list_push(LQ);
	//printf("%d\n",LQ->head->len);
	//list_show(LQ);

	//出队
	list_pop(LQ);
	list_pop(LQ);
	list_pop(LQ);
	list_pop(LQ);
	list_pop(LQ);

	list_show(LQ);

	//释放
	list_free(LQ);

	return 0;
}

链式栈

 

头文件

#ifndef __LINKLISTZ_H__
#define __LINKLISTZ_H__

typedef int datatype;

typedef struct stack
{
	union
	{
		datatype data;  //数据
		int top;  //记录栈的栈顶
	};

	struct stack *next;  //指向下个节点的指针

}stack, *stackptr;

//创建一个空间
stackptr stack_create();

//判空
int stack_empty(stackptr S);

//入栈
int stack_push(stackptr S,datatype e);

//遍历
void stack_show(stackptr S);

//出栈
int stack_pop(stackptr S);

//获取栈顶元素并修改
int stack_top(stackptr S,datatype e);

//求栈的大小
int stack_size(stackptr S); 

//释放
void stack_free(stackptr S);

#endif

源文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "linklistz.h"

//创建一个空间
stackptr stack_create()
{
	//从堆区创建一个空间
	stackptr S=(stackptr)malloc(sizeof(stack));
	if(NULL==S)
	{
		printf("该链表栈不合法\n");
		return NULL;
	}

	//初始化
	S->top=-1; //表长初始化
	S->next=NULL; //头结点初始化
	
	printf("链表栈创建成功\n");
	
	return S;
}

//判断空
int stack_empty(stackptr S)
{
	//判断逻辑
	if(NULL==S)
	{
		printf("判断空失败\n");
		return 0;
	}

	return S->top==-1; //表长为-1说明为空
}

//入栈
int stack_push(stackptr S,datatype e)
{
	//判断逻辑
	if(NULL==S)
	{
		printf("入栈失败\n");
		return 0;
	}

	//创建节点封装数据
	stackptr p=(stackptr)malloc(sizeof(stack));
	if(NULL==p)
	{
		printf("创建失败\n");
		return 0;
	}

	//节点初始化
	p->data=e;
	p->next=NULL;
	
	//先自增
	S->top++;
	
	//入栈(头插)
	//头插过程
	p->next=S->next;
	S->next=p;
	
	return 1;
}

//遍历
void stack_show(stackptr S)
{
	if(NULL==S||stack_empty(S))
	{
		printf("遍历失败\n");
		return ;
	}

	//遍历过程
	//定义一个指针指向头结点
	stackptr q=S;
	printf("从栈顶到栈底中的元素分别为:");
	for(int i=0;i<=S->top;i++)
	{
		q=q->next;
		printf("%d\t",q->data);
	}
	putchar(10);

	printf("遍历成功\n");
}

//出栈(头删)
int stack_pop(stackptr S)
{
	//判断逻辑
	if(NULL==S||stack_empty(S))
	{
		printf("出栈失败\n");
		return 0;
	}


	//定义一个指针指向第一个节点
	stackptr q=S->next;

	printf("%d出栈成功\n",q->data);
	
	//头删过程
	S->next=q->next;

	//释放第一个节点
	free(q);
	q->next=NULL; //置空,不然后面节点会出现随机值
	
	//自减
	S->top--;
	
	return 1;
}

//获取栈顶元素并修改
int stack_top(stackptr S,datatype e)
{
	//判断逻辑
	if(NULL==S||stack_empty(S))
	{
		printf("修改失败\n");
		return 0;
	}

	//修改过程

	//修改元素
	S->next->data=e;

	printf("修改成功\n");
	
	return 1;
}

//求栈的大小
int  stack_size(stackptr S)
{
	//判断逻辑
	if(NULL==S||stack_empty(S))
	{
		printf("求大小失败\n");
		return 0;
	}

	//求大小
	return S->top+1;
}
//释放
void stack_free(stackptr S)
{
	//判断逻辑
	if(NULL==S)
	{
		printf("释放失败\n");
		return ;
	}

	if(!stack_empty(S))
	{
		while(S->top!=-1)
		{
			stack_pop(S);
		}
	}

	//释放头结点
	free(S);
	S=NULL;

	printf("释放成功\n");
}

主函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "linklistz.h"
int main(int argc, const char *argv[])
{
	//调用创建空间函数
	stackptr S=stack_create();
	if(NULL==S)
	{
		return -1;
	}

	//入栈(先进去的后出,后进去的先出)
	stack_push(S,8);
	stack_push(S,3);
	stack_push(S,1);
	stack_push(S,2);
	stack_push(S,1);

	//遍历
	stack_show(S);

	//出栈
	stack_pop(S);
	stack_pop(S);
	stack_pop(S);

	stack_show(S);

	//获取栈顶元素并修改
	stack_top(S,7);
	
	stack_show(S);

	//求栈的大小
	printf("栈的大小为%d\n",stack_size(S));
	
	//释放
	stack_free(S);

	return 0;
}

思维导图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值