当前位置: 代码迷 >> C语言 >> 10进制数转换为2进制数 (链表实现)里面有几个问题
  详细解决方案

10进制数转换为2进制数 (链表实现)里面有几个问题

热度:417   发布时间:2007-09-22 19:59:04.0
10进制数转换为2进制数 (链表实现)里面有几个问题


/*

Name: 10进制数转换为2进制数 (链表实现)

Copyright:

Author:alan

Date: 19-09-07 21:23

Description:

Compiler:Dev-C++ 4.9.9.2

*/

#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); //这里把pfree

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

2007922星期六14:47:09

搜索更多相关的解决方案: 链表  进制数  Roman  

----------------解决方案--------------------------------------------------------

干嘛动不动就链表啊
有时候用点数组 可能简单点


----------------解决方案--------------------------------------------------------
数组的长度不好确定啊,声明长了浪费内存,声明少了不够用,所以就选择动态的链表了
----------------解决方案--------------------------------------------------------
有多大的数用二进制64位最大了.也不会浪费多少吧.
----------------解决方案--------------------------------------------------------
回复:(nuciewth)有多大的数用二进制64位最大了.也不...
tong shang
----------------解决方案--------------------------------------------------------

我没有想到这个.谢谢你了
对了.我用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++];
}
}
我觉得也比较简单


----------------解决方案--------------------------------------------------------

还可以再简化


----------------解决方案--------------------------------------------------------