首页 文章

Linkedlist包含C中的struct

提问于
浏览 56
-2

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

(我收到此错误错误:

从类型'void *'enlace-> contact = malloc(sizeof(contact));中分配类型'Contacto '时不兼容的类型;)

#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

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

    • 将字符指针传递给 scanf("%s",&nom); . 我想你想读一个字符串,而不是你传递一个字符的地址(因为字符数组是内部的指针;)) . 然后你应该将 nom 声明为一个字符数组并以这种方式使用它 .

    • 为什么要在这里为 node->contact 分配内存: enlace->contact = malloc(sizeof(contact)); 你需要为此分配内存 .

    • viewNames() 方法中,也许你的意思是: printf("%s",ptr->contact.name); . 从查看您发布的代码来看,Contacto已经有了这个字段,而不是您要访问的字段 .

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

    我改变了你的代码:

    #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 : $
    

相关问题