c - 找出遍历链表时出现段错误的最佳方法是什么?

标签 c list

我正在尝试找出并需要帮助来确定为什么我的程序在我的主程序中出现段错误:

int main (void){
  lista_conti *p = createlist();
  Conto c = malloc(sizeof(Conto));
  c->nome="uno";
  c->predecessore=NULL;
  c->costo=0;
  c->visited=0;
  insert(p,c);
  printf("\n%d\n", isEmpty(p));
  Conto con =p->conto;
  char *nome = con->nome;    /*SEGMENTATION FAULT*/
}

这是我的程序的完整列表,包括上面提到的主要内容。

/我的结构/

typedef struct lista_conti{

void* conto;
struct lista_conti *succ, *prec;
}lista_conti;


typedef struct{
  char *nome;
  lista_conti *predecessore;   /*valore hash(nome) del predecessore*/
  int costo;
  int visited; /*0 FALSE 1 TRUE*/
}*Conto;

lista_conti *createlist (void){

lista_conti *q = malloc(sizeof(lista_conti));

    if(!q) {
        fprintf(stderr,"Errore di allocazione nella creazione della lista\n");
        exit(-1);
    };
    q->succ = q->prec = q;
    return q;
}

/*Gli passo il puntatore alla testa della lista*/

int isEmpty(lista_conti *p){
  if(p == NULL)
    return 1;
  else
     return 0;
}

/打印完整列表/

void printList(lista_conti *p){
    lista_conti *r;
     r=p;
     if(r==NULL)
    {
       printf("NO ELEMENT IN THE LIST :");
     return;
     }
   /* traverse the entire linked list */
    while(r!=NULL)
  {   
    Conto cnt = r->conto;     
    printf(" -> %s ",cnt->nome);
    r=r->succ;

  }
   printf("\n");
}

/* 在 head 中插入一个元素 */

void insert(lista_conti *p, void* c){ 
   printf("nella funzione insert");
   if(isEmpty(p) == 1){
      printf("\nLISTA VUOTA\n");
      p->conto = c;
      p->succ=NULL;
   }

lista_conti *q = malloc(sizeof(lista_conti));
if(!q) {
    fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
    exit(-1);   
};
q->conto = c;
q->succ = p->succ;
p->succ->prec = q;
p->succ = q;
q->prec = p;
}

/* 在尾部插入一个元素。 */

void insertatend(lista_conti *p, Conto c){

lista_conti *q = malloc(sizeof(lista_conti));

if(!q) {
    fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
    exit(-1);   
};
q->conto = c;
q->prec = p->prec;
p->prec->succ = q;
p->prec = q;
q->succ = p;
}




int main (void){
  lista_conti *p = createlist();
  Conto c = malloc(sizeof(Conto));
  c->nome="uno";
  c->predecessore=NULL;
  c->costo=0;
  c->visited=0;
  insert(p,c);
  printf("\n%d\n", isEmpty(p));
  Conto con =p->conto;
  char *nome = con->nome;    /*SEGMENTATION FAULT*/
}

插入后,当我尝试访问 con->nome 时,程序返回段错误。我不知道为什么。我创建列表时有问题吗?当我插入时?

最佳答案

初始化列表后,您将使用未初始化的 conto 字段创建第一个节点。

插入新节点后,原来的第一个节点保持不变,因此当您尝试取消引用 p->conto 时,会导致段错误。

创建双向链表的正确方法是使用另一个结构来保存头和尾(如果您愿意,您也可以添加计数);它们都被初始化为 NULL。

插入更新头部,追加更新尾部。

关于c - 找出遍历链表时出现段错误的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888847/

相关文章:

python - 使用 list.pop(0) 对开销有什么影响?

c# - 如何在C#中获取动态对象的类型?

c - 我应该避免转换指针吗?

c - For inside for - 如何在不花时间创建线程的情况下进行内部并行

C 缓冲区硬编码问题

python - 我的数据集显示一个字符串,而它应该是一个大括号集/字典

转换为字符串时, float 的 Python 列表以 ':' 结尾

c - at91sam7 :interrupt for receiving a new a character uart

c - 如何推送(使用 libgit2)

Java读取文件并为每个对应行创建一个对象