数据结构_Day06

链栈的操作

main.c

#include"head.h"

int main(int argc, const char* argv[])
{
	int n;
	datatype data;
	linkstack_pointer head = linkstack_create_head();
	printf("请输入插入数据的个数:");
	scanf("%d", &n);
	//链栈头插
	for(int i = 0; i<n; i++)
	{
		printf("请输入要插入的数据:");
		scanf("%d", &data);
		linkstack_push(head, data);
	}
	linkstack_output(head);
	// 链栈出栈
	while(NULL != head->next)
	{
		linkstack_pop(head);
		linkstack_output(head);
	}
	linkstack_free(head);

	printf("请输入要转换成二进制的数值:\n");
	scanf("%d", &data);
	number_system_deTobi(data);
	return 0;
}

head.c

#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef int datatype ; //链栈内存储的数据的类型

typedef struct LinkStack_Node//结构体名可以为空
{
	union
	{
		int data;  //数据域
		int len;	//链栈不用栈顶,改成长度
	};
	struct LinkStack_Node * next;

} * linkstack_pointer;//链栈结点指针类型

/*
 * function:	链栈创建头结点
 * @param [void] 
 * @return      成功返回指针,失败返回NULL
 */
linkstack_pointer linkstack_create_head(void);
/*
 * function:	链栈创建普通结点
 * @param [void] 
 * @return      创建成功返回结点指针,失败返回NULL
 */
linkstack_pointer linkstack_create_node(void);
/*
 * function:	链栈入栈
 * @param [head] 头结点指针
 * @param [data] 要入栈的数据
 * @return      成功返回0,失败返回-1
 */
int linkstack_push(linkstack_pointer head, datatype data);
/*
 * function:	链栈遍历
 * @param [head] 头结点指针
 * @return      
 */
void linkstack_output(linkstack_pointer head);
/*
 * function:	链栈出栈
 * @param [head] 头结点指针
 * @return      成功返回出栈数据,失败返回-1
 */
datatype linkstack_pop(linkstack_pointer head);
/*
 * function:	链栈销毁
 * @param [head] 头结点指针
 * @return      成功返回0,失败返回-1
 */
int linkstack_free(linkstack_pointer head);
/*
 * function:	使用栈,将十进制转二进制
 * @param [head] 
 * @return      void
 */
linkstack_pointer number_system_deTobi(int data);
#endif

fun.c

#include"head.h"

/*
 * function:	创建头结点
 * @param [void] 
 * @return      成功返回头结点地址,失败返回NULL
 */
linkstack_pointer linkstack_create_head(void)
{
	linkstack_pointer head = (linkstack_pointer)malloc(sizeof(struct  LinkStack_Node));
	if(NULL == head)
	{
		return NULL;
	}
	head->len = 0;
	head->next = NULL;
	return head;
}
/*
 * function:	创建普通结点
 * @param [void] 
 * @return      创建成功返回结点指针,失败返回NULL
 */
linkstack_pointer linkstack_create_node(void)
{
	linkstack_pointer node = (linkstack_pointer)malloc(sizeof(struct  LinkStack_Node));
	if(NULL == node)
	{
		return NULL;
	}
	node->data = 0;
	node->next = NULL;
	return node;
}
/*
 * function:	入栈
 * @param [head] 头结点指针
 * @param [data] 要入栈的数据
 * @return      成功返回0,失败返回-1
 */
int linkstack_push(linkstack_pointer head, datatype data)
{
	if(NULL == head)
	{
		printf("入栈失败!\n");
		return -1;
	}
	linkstack_pointer p = linkstack_create_node();
	if(NULL == p)
	{
		printf("入栈失败!\n");
		return -1;
	}
	p->data = data;
	p->next = head->next;
	head->next = p;
	head->len++;
	return 0;
}
/*
 * function:	遍历输出
 * @param [head] 头结点指针
 * @return
 */
void linkstack_output(linkstack_pointer head)
{
	if(NULL == head || 0 == head->len)
	{
		printf("遍历失败!\n");
		return;
	}
	linkstack_pointer p = head;
	if(NULL == p)
	{
		printf("遍历失败!\n");
		return;
	}
	while(NULL != p->next)
	{
		p = p->next;
		printf("%d\t", p->data);
	}
	printf("\n");

}
/*
 * function:	链栈出栈
 * @param [head] 链栈头结点指针
 * @return      成功返回出栈数据,失败返回-1
 */
datatype linkstack_pop(linkstack_pointer head)
{
	if(NULL == head || head->len == 0)
	{
		printf("出栈失败!\n");
		return -1;
	}
	datatype data;
	linkstack_pointer p = head->next;
	if(NULL == p)
	{
		printf("出栈失败!\n");
		return -1;
	}
	data = p->data;
	printf("%d出栈\n", data);
	head->next = p->next;
	free(p);
	p = NULL;
	head->len--;
	printf("\n");
	return data;
}
/*
 * function:	链栈销毁
 * @param [head] 头结点指针
 * @return      成功返回0,失败返回-1
 */
int linkstack_free(linkstack_pointer head)
{
	if(NULL == head)
	{
		printf("销毁失败!\n");
		return -1;
	}
	linkstack_pointer p = head;
	if(NULL == p)
	{
		printf("销毁失败!\n");
		return -1;
	}
	while(NULL != head->next)
	{
		p = head->next;
		head->next = p->next;
		free(p);
		head->len--;
	}
	free(head);
	p = NULL;
	return 0;
}
/*
 * function:	使用栈,将十进制转二进制
 * @param [head] 
 * @return      void
 */
linkstack_pointer number_system_deTobi(int data)
{
	linkstack_pointer head = linkstack_create_head();
	if(data<0 || head == NULL)
	{
		printf("转换失败\n");
		return NULL;
	}
	
	linkstack_pointer temp;
	while(data)
	{
		linkstack_push(head, data%2);
		data = data/2;

	}
	while(NULL != head->next)
	{
		linkstack_pop(head);
	}
	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值