c语言链表实现任意进制相互转化


#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Linknode
{
    ElemType data;
    struct Linknode *next;
}LiStack;
 
//初始化栈
void InitStack(LiStack* &s)
{
    s = (LiStack *)malloc(sizeof(LiStack));
    s->next = NULL;
}
 
//进栈
void Push(LiStack* &s,ElemType e)
{
    LiStack *p;//定义一个新指针
    p = (LiStack *)malloc(sizeof(LiStack));//新节点
    p->data = e;
    p->next = s->next;
    s->next = p;
}
 
//出栈
void Pop(LiStack* &s,ElemType e)
{
    LiStack *p=s->next;//定义一个在栈顶的指针
    if(s->next == NULL)
        return;
    else
    {
        p->data =e;
        s->next=p->next;
        free(p);
        return;
    }
}
//遍历
void StackTraverse(LiStack* &s)
{
    LiStack *p=s->next;
    while(p !=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
//获得栈顶元素
bool GetTop(LiStack* &s,ElemType &e)
{
    LiStack *p=s->next;
    if(s->next == NULL)
        return false;
    e=p->data;
    return true;
}
//判断是否为空
void StackEmpty(LiStack* &s)
{
    if(s->next==NULL)
        printf("栈空");
    else
    {
        printf("栈为:\n");
        StackTraverse(s);
    }
}
//清空栈
void ClearStack(LiStack* &s)
{
    s->next=NULL;
    printf("已清空\n");
}
//销毁栈
void Destroy(LiStack* &s)
{
    LiStack *p=s->next,*q=s;
    while(p!=NULL)
    {
        free(q);
        q=p;
        p=p->next;
    }
    free(p);
}
int main()
{   
    LiStack a;
    LiStack *s = &a;
    int m,num,t;
    InitStack(s);
    ElemType e;
    while(1)
    {
        printf("1;进行进制转换,2;清空,3:销毁并退出\n");
        scanf("%d",&t);
        switch(t)
        {
            case 1: printf("请输入一个十进制的正整数:");
                    scanf("%d",&num);
                    int X;
                    printf("请输入要转换的进制:");
                    scanf("%d",&X);
                    while(num != 0)
                    {
                        m=num%X;
                        Push(s,m);
                        num/= X;
                    }
                    printf("对应的%d进制为:",X);
                    while(s->next != NULL)
                    {   
                        GetTop(s,e);
                        printf("%d",e);
                        Pop(s,e);
                    }
                    printf("\n");
                    break;
            case 2: ClearStack(s);
                    break;
            case 3: Destroy(s);
                    printf("已销毁\n");
                    exit(0);
            default:    printf("error\n");
        }
    }
}

运行截图实例:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早睡的叶子

你的鼓励就是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值