我正在尝试在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();
}
答案 0 :(得分: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 : $