gpt4 book ai didi

c - 链表: Adding and removing issues

转载 作者:行者123 更新时间:2023-11-30 20:11:19 25 4
gpt4 key购买 nike

首先,对不起我的英语。

对于一个项目,我必须制作一个车库管理程序。有一个机械师的链接列表。我现在制作了这个函数:一个用于在此列表中添加机制(addMec),一个用于删除机制(remMec)。

这是 addMec 函数:

    void addMec(mechanics* first)
{
mechanics *new = malloc(sizeof(mechanic));
int speciality();
if(first==NULL)
{
return(0);
} else
{

printf("Add mechanic : \n");
// Ask for needed informations.
printf("Employee-Number : ");
scanf("%5d",&new->number);
printf("\nName : ");
scanf("%s",&new->name);
printf("\nFirst Name : ");
scanf("%s",&new->first_name);
new->speciality = speciality();
// Add to end -> new->next = NULL
new->next = NULL;
printf("%d %s %s %d\n",new->number,
new->name, new->first_name, new->speciality);
mechanics *current = first;
while(current->next!=NULL)
{
current = current->next;
}
current->next = new;
}
}

此函数不会在列表中添加任何内容。如果我尝试调试程序,我会收到一条 SIGSEGV 消息。

函数remMec

int remMec(mechanics* first)
{
int numrem, ret = 0;
mechanics *current, *intercale;
printf("Supprimer l'employe numero : ");
scanf("%5d",&numrem);
// On parcoure la liste à la recherche du numero d'employe.
current = first;
while(current->next != NULL)
{
// Nécéssaire si l'élément à supprimer est le premier de la liste.
if(current->number == first->number)
{
if(current->number == numrem && current != NULL)
{
intercale = first;
first = first->next;
free(intercale);
ret = 1;
}
}
if(current->number == numrem)
{
intercale = current->next;
current->next = intercale->next;
free(intercale);
ret = 1;
}
current = current->next;
}
if(ret)
{
return 1;
} else
{
return 0;
}
}

此函数的问题是它删除了搜索元素的下一个元素。示例:在列表中:15264 约翰·克里斯 112569 克里斯·约翰 2如果我尝试删除约翰·克里斯,它也会删除克里斯·约翰

这是结构:

typedef struct{
char name[31],first_name[31];
int speciality, number;
struct mechanic *next;
}mechanic;

编辑:当我尝试显示列表时,似乎发生了 SIGSEGV。这是该函数:

void displayList(mechanic *first, int n)
{
int i;
mechanic *courant = malloc(sizeof(mechanic));
current = first;
printf("Mechanics :\n");
for(i = 1; i<n; i++)
{

printf("%5d %s %s",current->number,current->name, current->first_name);
switch(current->speciality)
{
case 1: printf(" Wheels\n");break;
case 2: printf(" Motor\n");break;
case 3: printf(" Carrosserie\n");break;
case 4: printf(" Chassis\n");break;
default: printf(" Maintenance\n");break;
}
current = current->next;
}
}

主要:

int main()
{
int nbMec = 1,i,choise;
int menu();
int remMec(mechanics*);
void afficherListe(mechanics*, int);
void addMec(mechanics*);
mechanics *first, *current, *nextM;
first = malloc(sizeof(mechanics));
current = first;

FILE *fdat, *fdat2;
fdat = fopen("clients.dat","r");
fdat2 = fopen("employe.dat","r");

// Lecture du fichier contenant les mécaniciens
fscanf(fdat2,"%5d",&current->number);
while(!feof(fdat2))
{
fscanf(fdat2,"%s%s%1d",&current->name, &current->first_name, &current->speciality);
nextM = malloc(sizeof(mechanics));
current->next = nextM;
nbMec++;
current = nextM;
fscanf(fdat2,"%5d",&currentM->number);

}

//Finir la liste avec NULL
current = first;
for(i = 1; i<nbMec; i++){
current = current->next;
}
current->next = NULL;
free(nextM);

DisplayList(first,nbMec);

// Redirection en fonction du choix dans le menu
choise = menu();
if(choise == 1)
{
// Ajout d'un mécano
addMec(first);
nbMec++;
displayList(first,nbMec);

} else if (choise == 2)
{
if(remMec(first))
{
printf("Mecanicien efface de la liste.\n");
nbMec--;
} else
{
printf("Impossible.\n");
}
afficherListe(first,nbMec);
} else
{
//Ajout d'un rendez-vous
}



return 0;
}

这是员工.dat 文件:

12345 Ric Hochet 1
13456 Jean Valjean 2
14567 Rick Grimes 3
15007 James Bond 4
16789 Rogge Jacquie 5

记录示例:

XXXXX  CCCCC   CCCCC        X
number name first_name speciality

你能帮我吗?谢谢!

最佳答案

我找到了解决方案:关于 addMec,感谢 CiaPan。在这些问题之后,我选择在列表的开头添加一个新机制。我还创建了一个列表结构,其中包含第一个元素。这是正确的 addMec(请注意,对于该项目,我添加了一个代表(修复)数组)。:

    void addMec(list *list, int number, char name[], char first_name[], int speciality)
{
int i;
mechanics *new = malloc(sizeof(mechanics));
if(list == NULL || new == NULL)
{
exit(EXIT_FAILURE);
}
new->number = number;
strcpy(new->name,name);
strcpy(new->first_name,first_name);
new->speciality = speciality;

for(i = 1; i<=50; i++)
{
new->rep->year=0;
new->rep->day = 0;
new->rep->month = 0;
new->rep->price = 0;
new->rep->emergency = 0;
strcpy(new->rep->brkdwn,"");
}
new->next = list->first;
list->first = new;
list->nbElmt++;



}

关于 remMec,我在其他网站上搜索,一位名叫 pagrette 的用户向我解释了。有了这些行,

intercale = current->next;
current->next = intercale->next;
free(intercale);

我刚刚释放了下一个元素谢谢您的帮助!

关于c - 链表: Adding and removing issues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41224361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com