ds_day06

作业1

题目

链栈实现进制转换

结果

在这里插入图片描述

代码

main.c

#include "head.h"

int main(int argc, char const *argv[])
{
    int num,hex;

    printf("输入num: ");
    scanf("%d", &num);
    printf("输入转换的进制 (2~36): ");
    scanf("%d", &hex);
    dec_convert(num,hex);

    return 0;
}

head.h

#ifndef _HEAD_H_
#define _HEAD_H_

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

typedef int DataType;

typedef struct node{
    DataType data;
    struct node* next;
}Node;

typedef struct linked_stack{
    struct node top;    
}Stack;

// 初始化
Stack *stack_init();

// 遍历
void to_string(Stack *stack);

// push = 头插
int push(Stack *stack,DataType elem);

// pop  = 头删
DataType pop(Stack *stack);

Stack *stack_destory(Stack *stack);

int dec_convert(int num,int hex);

#endif //_HEAD_H_

func.c

#include "head.h"

/*
* 十进制转其他进制
* @param   l  链表
* @param   e  要转换的十进制数
* @return  成功 
*/

int dec_convert(int num, int hex)
{
    Stack *stack = stack_init();
    if (stack == NULL)
        return -1;

    for (; num > 0; num /= hex) {
        push(stack, num % hex);
    }

    Node *next;
    for (Node *cur = stack->top.next; cur != NULL; cur = next) {
        next = cur->next;
        DataType val = pop(stack);
        if(hex > 10 && hex <= 10 + 26 && val > 10){
            printf("%c", val + 'A' - 10);
        }else{
            printf("%d", val);
        }
    }
    putchar('\n');

    return 0;
}

/*
* 初始化
* @return  成功栈地址    失败NULL
*/
Stack *stack_init(){
    Stack *stack = (Stack *)malloc(sizeof(stack));
    if (stack == NULL)
        return NULL;
    
    // stack->top.data = NULL;
    stack->top.next = NULL;

    return stack;
}

/*
* 创建节点
* @return  成功节点地址    失败NULL
*/
Node *node_init(){
    Node *node = (Node *)malloc(sizeof(Node));
    if (node == NULL)
        return NULL;

    return node;
}

// 遍历
void to_string(Stack *stack){
    // 栈不存在
    if (stack == NULL){
        printf("遍历失败\n");
        return ;
    }
    for (Node *cur = stack->top.next; cur != NULL; cur = cur->next){
        printf("%d  ",cur->data);
    }
    putchar('\n');
    
}


/*
* 压栈
* @param   l  链表
* @param   e  要插入的元素
* @return  成功0    失败-1
*/
int push(Stack *stack,DataType elem){
    // 栈不存在
    if (stack == NULL){
        printf("压栈失败\n");
        return -1;
    }
    
    Node *new_node = node_init();

    new_node->data = elem;

    new_node->next = stack->top.next;
    stack->top.next = new_node;
    
    return 0;
}


/*
* 出栈
* @param   l  链表
* @return  成功 出栈的元素    失败-1
*/
DataType pop(Stack *stack){
    // 栈不存在,栈空
    if (stack == NULL || stack->top.next == NULL)
        return -1;

    Node *first_node = stack->top.next;
    stack->top.next =  first_node->next;

    DataType val = first_node->data;
    free(first_node);

    return val;
}

/*
* 空间释放 
* @param   l  链表
* @param   e  要插入的元素
* @return  成功0    失败-1
*/
Stack *stack_destory(Stack *stack){
    if (stack == NULL)
        return NULL;

    Node *cur,*next;
    for (cur = stack->top.next; cur != NULL; cur = next){
        next = cur->next;
        free(cur);
        cur = NULL;
    }
    free(stack);

    return NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值