用C语言中的链表将二进制转换为十进制
您好,我的代码有一个问题,它显示了这个错误:“分段错误:11”这是我的代码,我正试图制作一个程序,使用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
#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
未初始化为零,但在循环中执行ap=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;
}