因此,我试图编写这个程序,其中应该可以创建一个动态列表,其中存储有关某些汽车(型号,颜色,年份)的数据,然后应该可以查看所有这些列表。程序中没有错误,也没有分段错误,但是当我试图可视化列表时,我没有得到任何输出。我尝试使用GDB来调试它,并且在输入过程中结构指针实际上没有得到任何数据。下面是完整的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
char modello[81];
char colore[81];
int anno;
struct node *next;
};
typedef struct node car;
car* insertNode(car* head);
car* destroyer(car* head);
void visualizer(car *head);
int main(){
car *head = NULL;
int n,tasto;
char option,enter;
do{
printf("Premere 1 per inserire un nuovo veicolo nel catalogo.n");
printf("Premere 2 per visualizzare l'intero catalogo.n");
printf("Premere qualsiasi altro tasto per uscire.nn");
scanf("%i",&tasto);
switch (tasto){
case 1:
insertNode(head);
break;
case 2:
visualizer(head);
break;
default:
break;
}
}while(tasto==1||tasto==2);
if(head!=NULL)
head=destroyer(head);
printf("Uscita.n");
return 0;
}
car* insertNode(car *head){
car *temp;
car *prec;
temp=(car *)malloc(sizeof(car));
if(temp!=NULL){
temp->next=NULL;
if(head==NULL)
head=temp;
else{//Raggiungi il termine della lista
for(prec=head;(prec->next)!=NULL;prec=(prec->next));
prec->next=temp;
}
printf("Inserire il modello dell'auto: ");
scanf("%s",&temp->modello);
printf("Inserire il colore dell'auto: ");
scanf("%s",&temp->colore);
printf("Inserire l'anno di immatricolazione dell'auto: ");
scanf("%i",&temp->anno);
printf("n");
}
else
printf("Memoria esaurita!n");
return head;
}
void visualizer(car* head){
car *temp;
int i=1;
temp=head;
while(temp!=NULL){
printf("Auto numero %i:n",i);
printf("Modello: %s.n",temp->modello);
printf("Colore: %s.n",temp->colore);
printf("Anno di immatricolazione: %i.n",temp->anno);
printf("n");
i++;
temp=temp->next;
}
}
car *destroyer(car* head){
car *temp;
while(head!=NULL){
temp=head;
head=head->next;
free(temp);
}
return NULL;
}
谁能解释一下为什么会这样?我不知道这有什么问题。
第一个错误是在do while中,当您在case开关中大约第31行时,您没有将插入函数的返回值存储在任何地方。下面是固定的代码:
do{
printf("Premere 1 per inserire un nuovo veicolo nel catalogo.n");
printf("Premere 2 per visualizzare l'intero catalogo.n");
printf("Premere qualsiasi altro tasto per uscire.nn");
scanf("%i",&tasto);
switch (tasto){
case 1:
head=insertNode(head);
break;
case 2:
visualizer(head);
break;
default:
break;
}
}while(tasto==1||tasto==2);
第二个错误是当您在插入节点中从键盘获取值时。你正在使用"&"当您已经知道要填充的数组的地址时,请使用操作符,因为您确实在处理数组。这里你可以看到修复后的代码:
car* insertNode(car *head){
car *temp;
car *prec;
temp=(car *)malloc(sizeof(car));
if(temp!=NULL){
temp->next=NULL;
if(head==NULL)
head=temp;
else{//Raggiungi il termine della lista
for(prec=head;(prec->next)!=NULL;prec=(prec->next));
prec->next=temp;
}
printf("Inserire il modello dell'auto: ");
scanf("%s",temp->modello);
printf("Inserire il colore dell'auto: ");
scanf("%s",temp->colore);
printf("Inserire l'anno di immatricolazione dell'auto: ");
scanf("%i",&temp->anno);
printf("n");
}
else
printf("Memoria esaurita!n");
return head;
}