回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++源代码 >> 数据结构与算法 C >> 二进制转换十进制(链表)
最 近 更 新
[转] 猴子吃桃问题的一..
通讯录程序源代码推荐
快速排序
二路插入排序
[经典算法 C] 高斯分布..推荐
[数据结构 C]赫夫曼编码推荐
线索二叉树
二叉树的基本操作
银行业务模拟推荐
杨辉三角推荐
最 新 推 荐
通讯录程序源代码推荐
[经典算法 C] 高斯分布..推荐
[数据结构 C]赫夫曼编码推荐
银行业务模拟推荐
杨辉三角推荐
迷宫求解推荐
括弧匹配检验推荐
单链表的实现及其操作推荐
顺序表及其操作推荐
二进制转换十进制(顺序..推荐
热 门 排 行
通讯录程序源代码推荐
迷宫求解推荐
杨辉三角推荐
快速排序
银行业务模拟推荐
[转] 猴子吃桃问题的一..
[经典算法 C] 高斯分布..推荐
[数据结构 C]赫夫曼编码推荐
十进制转换八进制
二进制转换十进制(顺序..推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

二进制转换十进制(链表)


来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:一般
发布于2005-10-22 21:17 被读3132次 【字体:

/*
 * FileName:          bin2dec.c
 * Author:            Antigloss at http://stdcpp.cn
 * LastModifiedDate:  2005-7-23 10:50
 * Purpose:           Translate binary number to decimal number
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

/* 清空输入缓冲 */
#define flush_stdin() { int c; while ( ( c = getchar() ) != '\n' && c != EOF ); }

typedef struct Link {
       char bit;
       struct Link *next; /* 链表指针 */
} Link; /* 定义链表结构 */

Link* bit_list( int *, char * ); /* 输入二进制 */
double bin_to_dec( Link *, int ); /* 二进制转换十进制 */
void destroy_list( Link * ); /* 释放空间 */

int main( void )
{
      Link *bin; /* 定义链表指针 */
      double dec=0;
      int i; /* 用于转化成十进制的次数 */
      char negflag; /* 正负标记 */

      /* 不推荐使用 while(1),因为 while(1) 是有条件循环,          */
      /* 而 for(;;) 是无条件循环,因此,for(;;) 效率比 while(1) 高。*/
      for (;;) {
          fputs( "Please input a binary number: ", stdout );
          bin = bit_list( &i, &negflag );
          if ( !bin ) {
              int c;
              puts("Invalid input!");
              flush_stdin();
              continue;
          } else if ( bin->bit == '\n' ) {
              break; /* 用户没有输入,退出 */
          }
          /* 进行转换 */
          dec = bin_to_dec( bin, i );
          printf( "%g\n", dec * negflag ); /* 输出结果 */
          /* 释放内存 */
          destroy_list( bin );
      }

      destroy_list( bin );
      puts( "Thanks for using our product!" );

      return 0; /* 无误退出 */
}

/* begin of bit_list */
Link *bit_list( int *i, char *flag )
{
     char integer = 1, positive = 1;
     char addend[2] = { 0, 1 };
     Link *head, *mid, *end;

     /* 形成链表 */
     head = mid = malloc( sizeof *head );
     if ( !head ) { /* 若内存分配不成功,则退出 */
         perror("Error: malloc");
         exit(-1);
     }
     head->next = NULL; /* 初始化指针 */

     /* 用户输入二进制数字 */
     *i = -1;
     *flag = 1;
     while ( ( mid->bit = getchar() ) != '\n') { /* 按回车结束输入 */
          if ( mid->bit < '0' || mid->bit > '1' ) { /* 输入合法性检查 */
              if ( positive && mid->bit == '-' ) {
                  *flag = -1; /* 负数 */
                  positive = 0;
                  continue;
              } else if ( integer && mid->bit == '.' ) { /* 小数 */
                  integer = 0;
                  continue;
              } else { /* 如果输入的不是二进制数字 */
                  destroy_list( head );
                  return NULL; /* 用户输入的不是 q,返回 NULL */
              }
          }
          positive = 0;
          end = malloc( sizeof *head );
          if ( !end ) { /* 若内存分配不成功,则退出 */
              perror("Error: malloc");
              destroy_list( head );
              exit( -1 );
          }
          mid->next = end; /* 连接两块内存空间 */
          mid = end;
          mid->next = NULL;
          (*i) += addend[integer];
     }

     return head;
} /* end of bit_list */

/* begin of bin_to_dec */
double bin_to_dec( Link *h, int i )
{
     double dec = 0;

     while ( h->bit != '\n' ) {  
         h->bit -= '0';
         dec += h->bit * pow(2, i);
         h = h->next;
         i--;
     }

     return dec;
} /* end of bin_to_dec */

/* begin of destroy_list */
void destroy_list( Link *h )
{
     Link *tmp;

     while ( h ) {
         tmp = h->next;
         free( h );
         h = tmp;
     }
} /* end of destroy_list */

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:暂无相关专题

上一篇:无相关文章
下一篇:二进制转换十进制(顺序表)

共有评论 0 条 网友评分 1分 查看全部评论

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss