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

用C语言中的链表将二进制转换为十进制,c,linked-list,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

您好,我的代码有一个问题,它显示了这个错误:“分段错误: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;
}
#包括
#包括
#包括
类型定义结构单元{
int b;
结构单元*下一步;
}细胞;
类型定义单元*liste;
int BinToEntier(列表a){
int n;
int j=0;
listep=NULL;
for(p=a;p->Next!=NULL;p=p->Next){
n+=(p->b)*pow(2,j);
j++;
}
返回n;
}
int main(){
liste a=NULL;
李斯特p;
a=(列表)malloc(细胞大小);
p=a;
对于(int i=0;i<4;i++){
认沽权(“输入b”);
scanf(“%i”和(p->b));
p=p->Next;
}
printf(“%i\n”,BinToEntier(a));
返回0;
}
在:

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


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

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

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;
}
intmain(){
listep=NULL;
liste*tp=&p;
对于(int i=0;i<4;i++){
*tp=malloc(细胞大小);
认沽权(“输入b”);
scanf(“%i”和(*tp)->b);
*tp=&(*tp)->Next;
}
*tp=NULL;
printf(“%i\n”,BinToEntier(p));
返回0;
}

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

欢迎使用堆栈溢出。奇怪的是,为什么代码会抛出
(liste)
malloc()的结果?这当然不是必需的,只是按照OP的例子?没有特别的原因。可以看出,实际上最好不要投下它。我只是不想对OP提供的代码做任何其他修改。但是既然你提出了它,让我用最佳实践来修复它。我当然理解不想修复太多OP的代码,因为它有5+个其他弱点/问题。
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;
}