八月九日作业

1、链队

头文件

#ifndef _FX_H_
#define _FX_H_

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

typedef int datatype;

//定义一个结点结构体
typedef struct Node
{
	union
	{
		datatype data;
		int len;
	};
	struct Node* next;
}Node;

//定义一个链队
typedef struct
{
	Node* Head;    //记录队列的头部
	Node* Tail;    //记录队列的尾部
}LinkQueue,*LinkQueuePtr;


//创建一个链式队列
LinkQueuePtr queue_create();

//判空
int queue_empty(LinkQueuePtr LQ);

//入队
int queue_push(LinkQueuePtr LQ,datatype e);

//遍历队
void queue_show(LinkQueuePtr LQ);

//出队
int queue_pop(LinkQueuePtr LQ);

//销毁队列
void queue_free(LinkQueuePtr LQ);




#endif

源文件

#include"fx.h"

//创建一个队列
LinkQueuePtr queue_create()
{
	//创建一个队列
	LinkQueuePtr LQ=(LinkQueuePtr)malloc(sizeof(LinkQueue));
	if(NULL==LQ)
	{
		printf("创建失败\n");
		return NULL;
	}
	
	//创建一个链表,将Head指针指向头结点
	LQ->Head=(Node*)malloc(sizeof(Node));
	if(NULL==LQ->Head)
	{
		printf("创建失败\n");
		return NULL;
	}

	//对头结点进行初始化
	LQ->Head->next=NULL;
	LQ->Head->len=0;

	//将尾指针指向头结点
	LQ->Tail=LQ->Head;
	printf("创建成功\n");
	return LQ;

}



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

	return LQ->Head==LQ->Tail;
}



//入队
int queue_push(LinkQueuePtr LQ,datatype e)
{
	if(NULL==LQ)
	{
		printf("入队失败\n");
		return 0;
	}

	//申请一个结点封装数据
	Node* P=(Node*)malloc(sizeof(Node));
	if(NULL==P)
	{
		printf("入队失败\n");
		return 0;
	}

	//对结点进行初始化
	P->next=NULL;
	P->data=e;

	//开始入队
	LQ->Tail->next=P;
	LQ->Tail=P;       //尾指针后移

	//队长变化
	LQ->Head->len++;
	printf("入队成功\n");
	return 1;
	                                                                                                                                                                           
}



//遍历队
void queue_show(LinkQueuePtr LQ)
{
	//判断逻辑
	if(NULL==LQ||queue_empty(LQ))
	{
		printf("遍历失败\n");
	}

	//定义一个遍历指针
	Node* q=LQ->Head->next;

	printf("从队头到队尾元素分别是: ");
	//开始遍历
	while(q!=NULL)
	{
		printf("%d\t",q->data);
		q=q->next;
	}
	putchar(10);
}



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

	//标记出队结点
	Node* P=LQ->Head->next;
	printf("%d出队成功\n",P->data);

	//孤立出队结点
	LQ->Head->next=P->next;

	//释放出队结点
	free(P);
	P=NULL;

	//队长变化
	LQ->Head->len--;
	
	//当链表为空时,尾指针重新指向头结点
	if(LQ->Head->next==NULL)
	{
		LQ->Tail=LQ->Head;
	}
	return 1;
}



//销毁队列
void queue_free(LinkQueuePtr LQ)
{
	//判断逻辑
	if(NULL==LQ)
	{
		printf("销毁失败\n");
	}

	//释放结点
	while(LQ->Head->next!=NULL)
	{
		queue_pop(LQ);
	}
	
	//释放头结点
	free(LQ->Head);
	LQ->Tail=LQ->Head=NULL;

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



测试文件

#include"fx.h"

int main(int argc, const char *argv[])
{
	//调用创建队列函数
	LinkQueuePtr LQ=queue_create();
	if(NULL==LQ)
	{
		return -1;
	}


	//调用入队函数
	queue_push(LQ,9);
	queue_push(LQ,5);
	queue_push(LQ,2);
	queue_push(LQ,7);
	queue_push(LQ,1);
	queue_push(LQ,3);
	queue_push(LQ,6);
	queue_push(LQ,4);
	
	//调用遍历函数
	queue_show(LQ);



	//调用出队函数
	queue_pop(LQ);
	queue_pop(LQ);
	queue_pop(LQ);
	queue_show(LQ);



	//调用销毁函数
	queue_free(LQ);
	LQ=NULL;
	
	return 0;
}

2、链栈

头文件

#ifndef _ZY_H_
#define _ZY_H_

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

typedef int datatype;

typedef struct Node
{
	union
	{
		datatype data;
		int len;
	};
	struct Node* next;
}LinkStack,*LinkStackPtr;


//创建栈
LinkStackPtr stack_create();

//判空
int stack_empty(LinkStackPtr S);

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

//遍历
void stack_show(LinkStackPtr S);

//出栈
int stack_pop(LinkStackPtr S);

//链栈的销毁
void stack_free(LinkListPtr S)




#endif

源文件

#include"zy.h"

//创建栈
LinkStackPtr stack_create()
{
	//创建栈
	LinkStackPtr S=(LinkStackPtr)malloc(sizeof(LinkStack));
	if(NULL==S)
	{
		printf("创建失败\n");
		return NULL;
	}

	//对头结点进行初始化
	S->len=0;
    S->next=NULL;

	printf("创建成功\n");
	return S;
}



//判空
int stack_empty(LinkStackPtr S)
{
	//判断逻辑
	if(NULL==S)
	{
		printf("所给链表不合法\n");
		return 0;
	}
	return S->next==NULL;
}




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

	//申请结点封装数据
	LinkStackPtr=(LinkStackPtr)malloc(sizeof(LinkStack));
	if(NULL==P)
	{
		printf("申请失败\n");
		return 0;
	}
	
	//对结点进行初始化
	P->data=e;
	P->next=NULL;

	//开始入栈
	P->next=L->next;
	S->next=P;
	S->len++;

	printf("入栈成功\n");
	return 1;
}



//遍历
void stack_show(LinkStackPtr S)
{
	//判断逻辑
	if(NULL==S||stack_empty(S))
	{
		printf("遍历失败\n");
	}

	//定义一个遍历指针
	LinkStackPtr q=S->next;

	//开始遍历
	printf("从栈顶到栈地元素分别为: ");
	while(q!=NULL);
	{
		printf("%d\t",q->data);
		q=q->next;
	}
		
}



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

	//删除逻辑
	LinkStackPtr P=S->next;
	S->next=P->next;
	free(P);
	P==NULL;

	//表长变化
	S->len--;
	printf("头删成功\n");
	return 1;
}



//链栈的销毁
void stack_free(LinkListPtr S)
{
	//判断逻辑
	if(NULL==S)
	{
		printf("释放失败\n");
	}

	//将所有结点全部释放
	while(!stack_empty(S))
	{
		stack_pop(S);
	}

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

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

测试文件

#include"zy.h"

int main(int argc, const char *argv[])
{
	//调用创建栈函数
	LinkStackPtr S=stack_create();
	if(NULL==S)
	{
		return 0;
	}



	//调用入栈函数
	stack_push(S,9);
	stack_push(S,5);
	stack_push(S,2);
	stack_push(S,7);
	stack_push(S,6);
	stack_push(S,4);
	stack_push(S,1);

	//调用遍历函数
	stack_show(S);


	//调用出栈函数
	stack_pop(S);
	stack_pop(S);
	stack_pop(S);
	stack_show(S);



	//调用销毁函数
	stack_free(S);
	S=NULL;
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值