/*
Name: 10进制数转换为2进制数 (链表实现)
Copyright:
Author:alan
Date: 19-09-07 21:23
Description:
Compiler:Dev-C++
*/
#include <stdio.h>
#include <malloc.h>
/******创建链表结构体*******/
typedef struct node
{
int num;
struct node *next;
}node;
node *h,*p;
/***创建链表结构体结束****/
/*十进制转换为二进制turn*/
void turnten_two(int num)
{
int flag=1; //声明标记变量flag
int _num; //声明变量_num,用来存放转换后的一个二进制数字
h=(node*)malloc(sizeof(node)); //逆序建立一个单链表
h->next=NULL;
while(flag)
{
_num=num%2; //对目标数字取模
p=(node*)malloc(sizeof(node));
p->num=_num;
p->next=h->next;
h->next=p;
num=num/2;
if(num==0) //商为0时退出循环
flag=0;
}
p=h;
while(p->next!=NULL)//输出二进制数
{
p=p->next; //注意:
printf("%d",p->num);//这两个式子的顺序不可换
}
putchar('\n');
}
//#if 0
/****建立双向链表结点类型******/
typedef struct Node
{
int two;
int count;
struct Node *prior;
struct Node *next;
}DLnode;
DLnode *h1,*p1,*s1;
/***二进制转换为十进制(有点笨)*******/
void turntwo_ten(void)
{
DLnode *ph;
int _two,_count=0,ten=0;
h1=(DLnode*)malloc(sizeof(DLnode));
p1=h1;
printf("每输入完一个数需要按一下回车确认\n");
printf("结束输入请按3\n"); //这没处理好
printf("输入二进制数:\n");
scanf("%d",&_two);
getchar();
while(_two>=0&&_two<3)
{
s1=(DLnode*)malloc(sizeof(DLnode));
s1->two=_two;
s1->count=_count;
p1->next=s1;
s1->prior=p1;
p1=s1; //让p始终指向尾结点
_count++;
scanf("%d",&_two);
getchar();
}
h1->prior=NULL;
p1->next=NULL;
/*双向链表创建完毕*/
ph=h1;
p1=s1;
while(ph->next!=NULL&&p1->prior!=NULL)
{
ph=ph->next;
ten=ten+(ph->two)*pow(2,p1->count);;
p1=p1->prior;
}
if(_two>=0&&_two<4)
printf("转换为十进制数为:%d\n",ten);
else
printf("你输入的不是二进制数!\n");
}
//#endif
int menu(void)
{
int ch;
printf("=============\n");
printf("1 10――2\n");
printf("2 2――10\n");
printf("0 exit\n");
printf("=============\n");
printf("choice:");
scanf("%d",&ch);
return ch;
}
int main(void)
{
int n,flag;
flag=menu();
while(1)
{
switch(flag)
{
case 1:
{
char msg[]={"输入一个十进制数:"},_msg[]={"转换成二进制数:"};
puts(msg);
scanf("%d",&n);
puts(_msg);
turnten_two(n);
while(1);
p=h;
while(p->next!=NULL) //这段代码应该有问题吧
{
free(p); //这里把p先free了
p=p->next;//这步还怎么进行
} //郁闷
free(h); //望高手指点
/**回到主菜单**/
getch();///////getch();不用加#include<conio.h> 也能用了???
system("cls");//如果单独写一个函数int main(void){getch();return 0;}则不行
flag=menu();
}
break;
case 2:
{
turntwo_ten();
/**回到主菜单**/
getch();
system("cls");
flag=menu();
}
break;
case 0:exit(0);
default :printf("again:");
}
}
return 0;
}
今天又添了个2进制转化为10进制的功能,写完了又觉得这个算法笨的要命,寒!望高手指点下有没有简单点的算法。
----------------解决方案--------------------------------------------------------
干嘛动不动就链表啊
有时候用点数组 可能简单点
----------------解决方案--------------------------------------------------------
数组的长度不好确定啊,声明长了浪费内存,声明少了不够用,所以就选择动态的链表了
----------------解决方案--------------------------------------------------------
有多大的数用二进制64位最大了.也不会浪费多少吧.
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------
我没有想到这个.谢谢你了
对了.我用Dec-C++4.9.9.2,在上面的程序中使用getch();怎么不用加#include <conio.h>这个头文件了?是编译器的Bug吗?
----------------解决方案--------------------------------------------------------
链表用在这儿简直就是大才小用,而且是简单的问题复杂了.
----------------解决方案--------------------------------------------------------
/*
Name: 10进制转换2进制(数组实现)
Copyright:
Author:
Date: 23-09-07 10:52
Description:
*/
#include <stdio.h>
void conversion(int decimal)
{
int binsys[64],quotient,arithmetical_compliment,i=0;
while(decimal=decimal/2)
{
arithmetical_compliment=decimal%2;
binsys[i++]=arithmetical_compliment;
}
printf("i=%d\n",i--);
printf("转化为二进制数:\n");
for(i;i>=0;i--)
printf("%d",binsys[i]);
}
int main(void)
{
int decimal;
printf("Input a integer:");
scanf("%d",&decimal);
conversion(decimal);
while(1);
return 0;
}
在nuciewth斑的提示下,用数组改写,相比以前那个长长的代码要简单多了。其实当时写的时候只想到输出二进制数的时候要逆序输出,想也没想就逆向建了个链表,可写完了一看…
现在才知道我当时犯了个大错误:把顺序表的随机存取特性给忘了。链式存储虽然是动态的,但都得“从头开始”,它的特征是顺序存取。从这点来看还是用数组要好一些,至少代码量可以减少一半!
下顿饭买烤排吃去,给自己长长记性,有想去的咱一块哈...我请客... 我全我一
----------------解决方案--------------------------------------------------------
这个是用栈写的:
/*
Name: 10进制数转换为2进制数 (栈实现)
Copyright:
Author:
Date: 20-09-07 00:00
Description:
Compiler:Dev-C++ 4.9.9.2
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <SqStack.h>
/**开始转换函数**/
void conversion(int num)
{
SqStack *S;
int _num,*fx=&_num,flag;
S=(SqStack*)malloc(sizeof(SqStack));
InitStack(S);
flag=Empty(S);
while(num)
{
_num=num%2;
num=num/2;
Push(S,_num);
}
while(S->top>0)
{
GetTop(S,fx);
Pop(S);
printf("%d",*fx);
}
}
int main(void)
{
int n;
char msg[]={"输入一个十进制数:"},_msg[]={"转换成二进制数:"};
puts(msg);
scanf("%d",&n);
puts(_msg);
conversion(n);
putchar('\n');
while(1);
}
今天用栈重写了10进制与2进制的转化,觉得比用链表还要简单。
关于栈的一些基本操作我写成了一个头文件,用起来还相当方便。下面是头文件的内容:
/*
Name: 顺序栈的基本操作
Copyright:
Author:
Date: 22-09-07 18:10
Description:
*/
#include <malloc.h>
#define MAXSIZE 64
/**声明栈的顺序存储结构***/
typedef struct
{
int num[MAXSIZE];
int top;
}SqStack;
/*栈的初始化*/
void InitStack(SqStack *S)
{
S->top=0;
}
/*判空栈操作*/
int Empty(SqStack *S)
{
return(S->top==0);//栈为空则返回1,非空返回0
}
/*元素进栈操作*/
void Push(SqStack *S,int x)
{
if(S->top==MAXSIZE)//判断栈是否已满
printf("栈已满,继续进栈会发生上溢!\n");
else
{
S->num[S->top]=x;
S->top++;
}
}
/*元素出栈操作*/
void Pop(SqStack *S)
{
if(S->top==0)
printf("栈下溢出!\n");
else
S->top--;
}
/*取栈顶元素操作*/
void GetTop(SqStack *S,int *x)
{
if(S->top==0)
printf("无栈顶元素!\n");
else
{
--S->top;
*x=S->num[S->top++];
}
}
我觉得也比较简单
----------------解决方案--------------------------------------------------------
还可以再简化
----------------解决方案--------------------------------------------------------