本题使用链栈进行进制转换,基本思想为短除法,核心函数为
void OctConversion(LinkStack sstack,int n);
void HexConversion(LinkStack sstack,int n)
下面对函数逐一介绍:
1.在void OctConversion(LinkStack sstack,int n);函数中,n为需要转换的十进制数,将n除以8的余数压入栈中,下一次循环商当作被除数,直到商变为0.再逐一输出栈中元素,即为八进制数。
2.在void HexConversion(LinkStack sstack,int n);函数中,n为需要转换的十进制数,将n除以16的余数压入栈中,下一次循环商当作被除数,直到商变为0.再逐一输出栈中元素,即为十六进制数。但十六进制转换与八进制转换稍有差别,大于等于10的数需要用大写字母A,B,C,D,E,F表示,所以当余数大于等于10时,压入栈中的不是11,12,13,14,15,而是A,B,C,D,E,F。
完整代码如下
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
struct Node
{
DataType data;
struct Node*next;
};
typedef struct Node*PNode;//节点类型
typedef struct Node*top,*LinkStack;//栈顶和链栈类型
LinkStack SetNullStack_Link()//创建空链栈
{
LinkStack top=(LinkStack)malloc(sizeof(struct Node));
if(top!=NULL)//判断节点是否创建成功
{
top->next=NULL;//必须指定头节点为NULL,之后要用头插法插入节点
}
else
{
printf("alloc failure");//创建头节点失败
}
return top;
}
void Push_Link(LinkStack top,DataType x)//进栈,不需要判断链栈是否会溢出
{
PNode p=