栈的进制转换【链栈实现】
思路:循环把余数入栈
循环出栈,直到栈空为止
头文件
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int datatype;
typedef struct Node
{
union
{
int len;
datatype data;
};
struct Node *next;
}*linkstack;
int create_head();
int create_node();
int push(linkstack top, datatype e);
int pop(linkstack top);
void output(linkstack top);
int linkstack_free(linkstack top);
void ver(int n,int m);
#endif
自定义文件
#include"head.h"
int create_head()
{
linkstack top=(linkstack)malloc(sizeof(struct Node));
if(top==NULL)
return NULL;
top->len=0;
top->next=NULL;
return top;
}
/*
* function: 创建结点
* @param [ in] 无参数
* @param [out]
* @return 成功返回地址 失败返回NULL
*/
int create_node()
{
linkstack p=(linkstack)malloc(sizeof(struct Node));
if(p==NULL)
return NULL;
p->data=0;
p->next=NULL;
return p;
}
/*
* function: 链栈的入栈
* @param [ in] 栈 插入的值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int push(linkstack top,datatype e)
{
//1,判断栈是否存在
if(top==NULL)
{
printf("头插失败\n");
return -1;
}
//2,插入新结点s
linkstack s=create_node();
if(s==NULL)
return -1;
//s的数据域
s->data=e;
//s的指针
s->next=top->next;
top->next=s;
top->len++;
return 0;
}
/*
* function: 链栈的出栈:等价头删
* @param [ in] 链栈
* @param [out]
* @return 成功返回0 失败返回-1
*/
int pop(linkstack top)
{
//1,判断栈是否存在
//2,判断栈是否为空
if(top==NULL || top->len==0)
{
printf("删除失败\n");
return -1;
}
//3,删除
linkstack q=top->next;
printf("出栈的元素是:%d\n",q->data);
top->next=q->next;
free(q);
q=NULL;
top->len--;
return 0;
}
/*
* function: 链栈遍历
* @param [ in] 链栈
* @param [out]
* @return 无返回值函数
*/
void output(linkstack top)
{
puts("");
linkstack p=top;
while(p->next!=NULL)
{
p=p->next;
printf("%d\t",p->data);
}
puts("");
}
/*
* function: 释放链栈的空间
* @param [ in] 链栈
* @param [out]
* @return 返回NULL
*/
int linkstack_free(linkstack top)
{
if(top==NULL)
return NULL;
int n=top->len;
int i;
for(i=0;i<n;i++)
{
linkstack_pop(top);
}
free(top);
top=NULL;
return top;
}
void ver(int n,int m)
{
linkstack top = create_head();
if (head==NULL)
return -1;
while (n > 0)
{
linkstack_push(top,n%m);
n/=m;
}
linkstack_output(top);
linkstack_free(top);
}
主函数文件
#include "head.h"
int main (int argc, const char *argv[])
{
int i,j;
printf("请输入您要转换的数:\n");
scanf("%d",&i);
printf("请输入您要转换成的进制;\n");
scanf("%d",&j);
printf("转换后的数为:\t");
ver(i,j);
return 0;
}