使用C中的链表将二进制转换为十进制

时间:2016-12-22 12:25:04

标签: c linked-list

您好我的代码有问题它显示此错误:“分段错误:11”这里是我的代码我正在尝试制作一个程序,使用C中的列表将二进制链表转换为十进制

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

typedef struct cellule{
    int b;
    struct cellule* Next;
}Cellule;

typedef Cellule* liste;

int BinToEntier(liste a){
    int n;
    int j=0;
    liste p=NULL;
    for (p=a; p->Next!=NULL; p=p->Next) {
      n+=(p->b)*pow(2,j);
      j++;
    }
    return n;
}

int main() {
  liste a=NULL;
  liste p;
  a= (liste) malloc(sizeof(Cellule));
  p=a;
  for (int i = 0; i < 4; i++) {
    puts("enter b");
    scanf("%i", &(p->b));
    p=p->Next;
  }
  printf("%i\n", BinToEntier(a));
  return 0;
}

2 个答案:

答案 0 :(得分:2)

在:

  a= (liste) malloc(sizeof(Cellule));

a未初始化为零,但在您的循环中,您执行了p=a;...p=p->Next。这将访问未定义的内存,可能导致seg错误。 (注意scanf("%i", &(p->b));也可能导致seg错误。)

同样在BinToEntier中,您忘记初始化n

答案 1 :(得分:2)

函数main()中的for循环导致分段错误。简单地说,您不是为列表的每个节点(即Cellule)分配空间,而是仅分配第一个元素。此外,但几乎同样重要的是,您附加到列表尾部的最后一个节点的分配是错误的。

考虑切换到下面给出的用法。

int main() {
    liste p=NULL;
    liste *tp = &p;
    for (int i = 0; i < 4; i++) {
        *tp = malloc(sizeof(Cellule));
        puts("enter b");
        scanf("%i", &((*tp)->b));
        *tp=&((*tp)->Next);
    }
    *tp = NULL;
    printf("%i\n", BinToEntier(p));
    return 0;
}

上面给出的代码使用变量tp,它是指向Cellule的指针。 (即列表节点)实际上,我们更新tp以显示列表中最后一个Cellule的“Next”属性,并在我们向列表p添加新节点时更新它。