Linkedlist包含C

时间:2017-06-29 05:03:47

标签: c pointers struct linked-list

我正在尝试在C中创建一个包含struct数据的链接列表;但是,由于指针存在一些问题,我无法理解。我是c的全新人物。这是我的代码:主要目标是编写名称并将它们存储在包含结构的链表中

(我收到此错误错误:

  分配给类型'Contacto {aka struct时

不兼容的类型   }'来自类型'void *'       enlace-> contact = malloc(sizeof(contact));)

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

    typedef struct
     {
        char name[50];
        char apellido[50];

     } Contacto ;

    typedef struct nodo {
        Contacto  contact;
        struct nodo* siguiente;
    } nodo;

       nodo *cabecera = NULL;
       nodo *actual = NULL;

      void viewNames()
       {
           nodo *ptr;
           ptr = cabecera;

           printf("**********************************");
           while(ptr != NULL) {        
           printf("%s",ptr->contact.nombre);
           ptr = ptr->siguiente;
    }

            printf("**********************************");
}



    int main (int argc, char *argv[])
     {



         nodo *enlace;
         char nom;
         int cont=0;
         Contacto contact;


         while (1){
              printf("Write names or 0 to exit ");
              scanf("%s",&nom);

               if (nom == '0') {
                    cabecera = enlace;
                    break;
                } else {
                   enlace = (nodo *) malloc(sizeof(nodo));

                   enlace->contact = malloc(sizeof(contact)); 
                   strcpy(enlace->contact.nombre, nom); 
                   enlace->siguiente = actual;
                   actual = enlace;
        }
    }

    viewNames();
}

1 个答案:

答案 0 :(得分:0)

除了大量拼写错误之外,您的代码中还存在一些问题:

  1. 将字符指针传递给scanf("%s",&nom);。我想你想读一个字符串,而不是你传递一个字符的地址(因为字符数组是内部的指针;))。然后你应该将nom声明为一个字符数组并以这种方式使用它。
  2. 您为什么要在此处为​​node->contact分配内存:enlace->contact = malloc(sizeof(contact)); 您已将其声明为正常的结构变量(而不是指针),因此您不需要为此分配内存。

  3. viewNames()方法中,您的意思是:printf("%s",ptr->contact.name);。自从发布您发布的代码后,Contacto就有了这个字段,而不是您尝试访问的字段。

  4. 如果您想使用strcpy,将nom复制到动态分配的结构中,则必须包含C String library

  5. 我改变了你的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> //
    
    typedef struct
    {
      char name[50];
      char apellido[50];
    } Contacto ;
    
    typedef struct node {
      Contacto  contact; //
      struct node* siguiente;
    } node;
    
    node *cabecera = NULL;
    node *actual = NULL;
    
    void viewNames()
    { 
      node *ptr;
      ptr = cabecera;
    
      printf("**********************************");
      while(ptr != NULL) {        
        printf("%s",ptr->contact.name); //
        ptr = ptr->siguiente;
      }
    
      printf("**********************************");
    }
    
    int main (int argc, char *argv[])
    {
      node *enlace;
      char nom[100]; //
      int cont=0;
      Contacto contact;
    
      while (1){
        printf("Write names or 0 to exit ");
        scanf("%s",nom);
    
        if (nom[0] == '0') {
          cabecera = enlace;
          break;
        } else {
          enlace = (node *) malloc(sizeof(node));
    
          //enlace->contact = (Contacto *)malloc(sizeof(Contacto)); //
          strcpy(enlace->contact.name, nom); 
          enlace->siguiente = actual;
          actual = enlace;
        }
      }
    
      viewNames();
    }
    

    当我运行此功能时,我能够看到您从用户处获取的链接列表元素:

    ~/work : $ g++ testLL2.cpp   
    ~/work : $ ./a.out 
    Write names or 0 to exit Rohan
    Write names or 0 to exit Rohit
    Write names or 0 to exit Raman
    Write names or 0 to exit Ronny
    Write names or 0 to exit Reena
    Write names or 0 to exit 0
    **********************************ReenaRonnyRamanRohitRohan**********************************~/work : $