user-0 提问: 用栈和队将二进制转换为十进制

回复:
user: user-0
content: 引用 3 楼 paschen 的回复:建议楼主学会调试，设置断点，单步跟踪程序运行，观察变量变化情况，看是哪与你期望的不一致，分析原因 调试的嵌套一多起来我就看晕了，不过我会耐心去学会调试的，感谢版主

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct node {     char data;     node* next; }NodeStack,*LinkStack;  //置空栈 LinkStack InsertEmpty(); //判断栈是否为空 bool IsStackEmpty(LinkStack LS); //进栈 void PushStack(LinkStack *LS, char data); //出栈 int PopStack(LinkStack *LS,char* data); //输出栈 void Print(LinkStack LS);    /*队*/ typedef struct Que {     char  data;     Que* next; }NodeQueue,*LinkQueue;  typedef struct {     LinkQueue front;     LinkQueue rear; }Queue;  //置空队 Queue* CreatNew(); //判断队是否为空 bool IsQueueEmpty(Queue* QE); //入队 void EnQue(Queue **Que, char data); //出队 void OutQue(Queue **Que, char* data);    //将二进制转为十进制 double Change(char* ss,LinkStack LS,Queue* QE);   /*****函数实现源文件*****/ /****function.cpp*****/  /* #include"headfile.h" #include<stdlib.h> #include<stdio.h> */ /*****************************栈************************/ //置空栈 LinkStack InsertEmpty() {     LinkStack LS = (LinkStack)malloc(sizeof(NodeStack));     LS->next = NULL;     LS->data = 0;     return LS; } //判断栈是否为空 bool IsStackEmpty(LinkStack LS) {     if (LS->next)         return true;     else         return false; } //进栈 void PushStack(LinkStack *LS, char data) {     LinkStack new_node = (LinkStack)malloc(sizeof(NodeStack));     new_node->data = data;     new_node->next = (*LS)->next;     (*LS)->next = new_node; } //出栈 int PopStack(LinkStack *LS, char* data) {     if (IsStackEmpty(*LS))     {         LinkStack p = (*LS)->next;         (*LS)->next = p->next;         *data = p->data;         free(p);         return 1;     }     else         return 0; }  //输出栈 void Print(LinkStack LS) {     if (LS->next)     {         LinkStack p = LS;         while (p->next)         {             printf("%c   ", p->next->data);             p = p->next;         }     }     else     {         printf("栈空\n");     } } /********************队*************************/ //置空队 Queue* CreatNew() {     Queue *new_one = (Queue*)malloc(sizeof(Queue));     LinkQueue node = (LinkQueue)malloc(sizeof(NodeQueue));     node->next = NULL;     node->data = 0;     new_one->front = new_one->rear = node;     return new_one; }  //判断队是否为空 bool IsQueueEmpty(Queue* QE) {     if (QE->front == QE->rear)         return true;     else         return false; }  //入队 void EnQue(Queue **Que, char data) {     LinkQueue LQ = (LinkQueue)malloc(sizeof(NodeQueue));     LQ->data = data;     LQ->next = NULL;     (*Que)->rear->next = LQ;     (*Que)->rear = LQ; }  //出队 void OutQue(Queue **Que, char * data) {      if ((*Que)->front->next == (*Que)->rear)     {         *data = (*Que)->front->next->data;         free((*Que)->front->next);         (*Que)->rear = (*Que)->front;     }     else     {         LinkQueue p = (*Que)->front->next;         *data = p->data;         (*Que)->front->next = p->next;         free(p);     } }         //将二进制转为十进制 double Change(char* ss, LinkStack LS, Queue* QE) {     bool flag = true;     char ch;     int i = 0;     double sum1 = 0, sum2 = 0,temp=0, k = 1, n = 1;     LinkStack p = LS;     Queue* q = QE;     /*如果字符串有小数点，则将字符串分为整数和小数两部分，       整数部分进栈，小数部分入队*/     for (i = 0; *(ss + i); i++)     {         if (*(ss + i) == '.') {             flag = false;             continue;         }         if (flag)         {             printf("%c +++\n", ss[i]);             PushStack(&LS, *(ss + i));         }         else         {             printf("%c ---\n", ss[i]);             EnQue(&QE, *(ss + i));         }     }     p = LS;     q = QE;     while (IsStackEmpty(p))     {         PopStack(&p, &ch);         printf("+++%c  ", ch);         temp = (double)(ch - '0');         printf("tmp = %lf\n", temp);         sum1 += temp * k;         k *= 2;     }     while (!IsQueueEmpty(q))     {         OutQue(&q, &ch);         printf("---%c  ", ch);         temp = (double)(ch - '0');         printf("---tmp = %lf\n", temp);         n *= 1.0 / 2;         sum2 += temp*n;         printf("&&&&\n");     }     printf("sum1=%lf\n", sum1);     printf("sum2=%lf\n", sum2);     return (sum1 + sum2);  }  /*******主函数************/ /* #include"headfile.h" #include<stdlib.h> #include<stdio.h> */ #define MAXSIZE     32 int main() {     LinkStack LS = InsertEmpty();     Queue* QE = CreatNew();     char ss[MAXSIZE];     printf("输入二进制:\n");     scanf("%s", ss);     printf("\n十进制是：%lf\n",Change(ss, LS, QE));     Print(LS);     return 0; }   参考一下吧  我将所有结构体，函数定义和声明放在一个文件里。若保持你的多文件操作，可以对比对应的函数修改，修改你的函数； 问题主要是出在传一重指针上，应该传二重指针。其他的修改，详见上面的代码； 建议对比看一下；  是的，要用二位指针保存变化的头指针，感谢，另外还有两个小问题是判断栈空的函数条件写反了，小数部分的1/2=0没有注意到

user: user-1
content: 建议楼主学会调试，设置断点，单步跟踪程序运行，观察变量变化情况，看是哪与你期望的不一致，分析原因

user: user-2
content: 个人感觉注释没必要那么多，因为你的函数定义时函数名基本上能表示函数的作用和功能。

user: user-2
content: #include <stdio.h> #include <stdlib.h>  typedef struct node {     char data;     node* next; }NodeStack,*LinkStack;  //置空栈 LinkStack InsertEmpty(); //判断栈是否为空 bool IsStackEmpty(LinkStack LS); //进栈 void PushStack(LinkStack *LS, char data); //出栈 int PopStack(LinkStack *LS,char* data); //输出栈 void Print(LinkStack LS);    /*队*/ typedef struct Que {     char  data;     Que* next; }NodeQueue,*LinkQueue;  typedef struct {     LinkQueue front;     LinkQueue rear; }Queue;  //置空队 Queue* CreatNew(); //判断队是否为空 bool IsQueueEmpty(Queue* QE); //入队 void EnQue(Queue **Que, char data); //出队 void OutQue(Queue **Que, char* data);    //将二进制转为十进制 double Change(char* ss,LinkStack LS,Queue* QE);   /*****函数实现源文件*****/ /****function.cpp*****/  /* #include"headfile.h" #include<stdlib.h> #include<stdio.h> */ /*****************************栈************************/ //置空栈 LinkStack InsertEmpty() {     LinkStack LS = (LinkStack)malloc(sizeof(NodeStack));     LS->next = NULL;     LS->data = 0;     return LS; } //判断栈是否为空 bool IsStackEmpty(LinkStack LS) {     if (LS->next)         return true;     else         return false; } //进栈 void PushStack(LinkStack *LS, char data) {     LinkStack new_node = (LinkStack)malloc(sizeof(NodeStack));     new_node->data = data;     new_node->next = (*LS)->next;     (*LS)->next = new_node; } //出栈 int PopStack(LinkStack *LS, char* data) {     if (IsStackEmpty(*LS))     {         LinkStack p = (*LS)->next;         (*LS)->next = p->next;         *data = p->data;         free(p);         return 1;     }     else         return 0; }  //输出栈 void Print(LinkStack LS) {     if (LS->next)     {         LinkStack p = LS;         while (p->next)         {             printf("%c   ", p->next->data);             p = p->next;         }     }     else     {         printf("栈空\n");     } } /********************队*************************/ //置空队 Queue* CreatNew() {     Queue *new_one = (Queue*)malloc(sizeof(Queue));     LinkQueue node = (LinkQueue)malloc(sizeof(NodeQueue));     node->next = NULL;     node->data = 0;     new_one->front = new_one->rear = node;     return new_one; }  //判断队是否为空 bool IsQueueEmpty(Queue* QE) {     if (QE->front == QE->rear)         return true;     else         return false; }  //入队 void EnQue(Queue **Que, char data) {     LinkQueue LQ = (LinkQueue)malloc(sizeof(NodeQueue));     LQ->data = data;     LQ->next = NULL;     (*Que)->rear->next = LQ;     (*Que)->rear = LQ; }  //出队 void OutQue(Queue **Que, char * data) {      if ((*Que)->front->next == (*Que)->rear)     {         *data = (*Que)->front->next->data;         free((*Que)->front->next);         (*Que)->rear = (*Que)->front;     }     else     {         LinkQueue p = (*Que)->front->next;         *data = p->data;         (*Que)->front->next = p->next;         free(p);     } }         //将二进制转为十进制 double Change(char* ss, LinkStack LS, Queue* QE) {     bool flag = true;     char ch;     int i = 0;     double sum1 = 0, sum2 = 0,temp=0, k = 1, n = 1;     LinkStack p = LS;     Queue* q = QE;     /*如果字符串有小数点，则将字符串分为整数和小数两部分，       整数部分进栈，小数部分入队*/     for (i = 0; *(ss + i); i++)     {         if (*(ss + i) == '.') {             flag = false;             continue;         }         if (flag)         {             printf("%c +++\n", ss[i]);             PushStack(&LS, *(ss + i));         }         else         {             printf("%c ---\n", ss[i]);             EnQue(&QE, *(ss + i));         }     }     p = LS;     q = QE;     while (IsStackEmpty(p))     {         PopStack(&p, &ch);         printf("+++%c  ", ch);         temp = (double)(ch - '0');         printf("tmp = %lf\n", temp);         sum1 += temp * k;         k *= 2;     }     while (!IsQueueEmpty(q))     {         OutQue(&q, &ch);         printf("---%c  ", ch);         temp = (double)(ch - '0');         printf("---tmp = %lf\n", temp);         n *= 1.0 / 2;         sum2 += temp*n;         printf("&&&&\n");     }     printf("sum1=%lf\n", sum1);     printf("sum2=%lf\n", sum2);     return (sum1 + sum2);  }  /*******主函数************/ /* #include"headfile.h" #include<stdlib.h> #include<stdio.h> */ #define MAXSIZE     32 int main() {     LinkStack LS = InsertEmpty();     Queue* QE = CreatNew();     char ss[MAXSIZE];     printf("输入二进制:\n");     scanf("%s", ss);     printf("\n十进制是：%lf\n",Change(ss, LS, QE));     Print(LS);     return 0; }   参考一下吧  我将所有结构体，函数定义和声明放在一个文件里。若保持你的多文件操作，可以对比对应的函数修改，修改你的函数； 问题主要是出在传一重指针上，应该传二重指针。其他的修改，详见上面的代码； 建议对比看一下；