/*
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进制的功能,写完了又觉得这个算法笨的要命,寒!望高手指点下有没有简单点的算法。