| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3047 人关注过本帖
标题:10进制数转换为2进制数 (链表实现)里面有几个问题
取消只看楼主 加入收藏
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
结帖率:100%
收藏
 问题点数:0 回复次数:4 
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 
2007-09-22 19:59
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:0 
数组的长度不好确定啊,声明长了浪费内存,声明少了不够用,所以就选择动态的链表了

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2007-09-22 20:07
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:0 

我没有想到这个.谢谢你了
对了.我用Dec-C++4.9.9.2,在上面的程序中使用getch();怎么不用加#include <conio.h>这个头文件了?是编译器的Bug吗?


天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2007-09-22 20:23
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:0 

/*
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斑的提示下,用数组改写,相比以前那个长长的代码要简单多了。其实当时写的时候只想到输出二进制数的时候要逆序输出,想也没想就逆向建了个链表,可写完了一看…
现在才知道我当时犯了个大错误:把顺序表的随机存取特性给忘了。链式存储虽然是动态的,但都得“从头开始”,它的特征是顺序存取。从这点来看还是用数组要好一些,至少代码量可以减少一半!
下顿饭买烤排吃去,给自己长长记性,有想去的咱一块哈...我请客... 我全我一


天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2007-09-23 16:12
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:0 

这个是用栈写的:
/*
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++];
}
}
我觉得也比较简单


天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2007-09-23 16:16
快速回复:10进制数转换为2进制数 (链表实现)里面有几个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018937 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved