作业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;
}