0

我正在学习C。我试图解决以下问题,但遇到了几个问题。

我不使用指针控制链表。

这是问题所在:

我们想编写用于管理公司员工的函数。员工由其姓名(字符串)、人员编号(整数)、工作小时数(实际)和小时费率(实际)定义。

  1. 定义 Employee 数据类型
  2. 功能:
  • saisir雇员;它允许您从键盘输入员工
  • 加入雇员;在屏幕上显示员工
  • 计算工资;它计算并返回员工的工资(salary = nbh * rate_h)
  1. 我们现在想将一组员工存储在一个链表中,为此定义节点和 ListEmp 数据类型。
  • ajouter雇员;它允许您将新员工添加到列表中(添加可以在列表的开头或结尾进行,您可以选择)
  • saisirList 雇员;它允许您从键盘输入 n 个员工的列表。
  • affichListemploye; 在屏幕上显示员工列表。
  • 总薪水;它计算并返回列表中所有员工的总工资
  1. 编写一个执行以下操作的 main 函数:
  • 申报员工名单
  • 使用键盘输入员工人数
  • 进入列表
  • 计算所有员工的总工资
  • 显示列表的内容,以及总工资

我的代码:

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

typedef struct
{
 char nom[20];
 int mat;
 float ht;
 float tx ;
}Employe;


typedef struct
{
    Employe *employe;
    struct ListEmp *suivant;
}ListEmp;

typedef struct 
{
    ListEmp *premier;
}Elements;


void saisirEmploye(Employe *e)
{
    printf("Sasir le nom \n");
    scanf("%s",e->nom);
    printf("Saisir le matricule \n");
    scanf("%d",&e->mat);
    printf("Saisir le nombre d’heures travaillees \n");
    scanf("%f",&e->ht);
    printf("Saisir le taux horaire \n");
    scanf("%f",&e->tx);

}

void afficheEmp(Employe e)
{
    printf("Nom : %s | Matricule : %d | Nombre d’heures travaillees : %f | Taux horaire : %f \n",e.nom,e.mat,e.ht,e.tx);
}

float calculSalaire(Employe e)
{
    float salaire = 0;
    salaire = (e.ht)*(e.tx) ;
    return salaire;
}

Elements *init()
{
    ListEmp *liste = malloc(sizeof(ListEmp));
    Elements *elements = malloc(sizeof(Elements));

    if (liste == NULL || elements == NULL)
    {
        exit(EXIT_FAILURE);
    }

    liste->employe = NULL;
    liste->suivant = NULL;
    elements->premier = liste;

    return elements;
}


void ajouterEmp(Elements *elements, Employe *employe)
{
    /* Création du nouvel élément */
    ListEmp *nouveau = malloc(sizeof(*nouveau));
    
    if (elements == NULL || nouveau == NULL)
    {
        exit(EXIT_FAILURE);
    }
    
    nouveau->employe = employe;

    /* Insertion de l'élément au début de la liste */
    nouveau->suivant = elements->premier;
    elements->premier = nouveau;
}


int main()
{
 // Employes e;
 // e.tete=NULL;
 // int n=0;
 // float t=0;
 // printf("Donner le nombre des Emplyes \n"); // saisie du nbr des employes
 // scanf("%d ",&n);
 // saisirListEmp(&e,n); // saisie de la liste
 // t=totalSalaire(e); //calcule du salaire totale
 // afficheList(e); // affichage du contenu
 // printf("le salaire totale=%f ",t); // affichage du salaire
 
 
 Employe e;
 printf("Saisr un emplye \n");
 saisirEmploye(&e);
 //printf("Nom emplye : %s \n", e.nom);
 afficheEmp(e);
 printf("Salaire : %f",calculSalaire(e));
 
 Elements *maListe = init();
 ajouterEmp(maListe,e)
 
 return 0;
}

编辑代码:

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

typedef struct
{
    char nom[20];
    int mat;
    float ht;
    float tx;
} Employe;


typedef struct Elem
{
    Employe employe;
    struct Elem *prev;
    struct Elem *next;
}Elem;

typedef struct
{
    Elem *first;
    Elem *last;
}ListEmp;


void saisirEmploye(Employe *e)
{
    printf("Sasir le nom \n");
    scanf("%s",e->nom);
    printf("Saisir le matricule \n");
    scanf("%d",&e->mat);
    printf("Saisir le nombre d’heures travaillees \n");
    scanf("%f",&e->ht);
    printf("Saisir le taux horaire \n");
    scanf("%f",&e->tx);

}

void afficheEmp(Employe e)
{
    printf("Nom : %s | Matricule : %d | Nombre d’heures travaillees : %f | Taux horaire : %f \n",e.nom,e.mat,e.ht,e.tx);
    printf("\n");
}

float calculSalaire(Employe e)
{
    float salaire = 0;
    salaire = (e.ht)*(e.tx) ;
    return salaire;
}


ListEmp *init()
{
    ListEmp *listEmp = malloc(sizeof(ListEmp));
    Elem *elem = malloc(sizeof(Elem));
    Employe employe;

    if (listEmp == NULL || elem == NULL)
    {
        exit(EXIT_FAILURE);
    }
    strcpy(employe.nom, "Hamza");
    employe.mat = 123;
    elem->employe = employe;
    elem->next = NULL;
    listEmp->first = elem;

    return listEmp;
}

void auDebut(ListEmp *listEmp, Employe employe)
{
    printf("1 Au debut \n");
    Elem *elem = (Elem*)malloc(sizeof(Elem));
    elem->employe = employe;
    elem->next = listEmp->last;
    elem->prev = NULL;
    if(listEmp->last)
        listEmp->last->prev = elem;
    else
        listEmp->last = elem;
    listEmp->first = elem;
}

void aLaFin(ListEmp *listEmp, Employe employe)
{
    
    Elem *elem = (Elem*)malloc(sizeof(Elem));
    elem->employe = employe;
    elem->prev = listEmp->first;
    elem->next = NULL;
    if(listEmp->first)
        listEmp->first->next = elem;
    else
        listEmp->first = elem;
    listEmp->last = elem;
    
//    Elem *elem = (Elem*)malloc(sizeof(Elem));
//    if(!elem) exit(EXIT_FAILURE);
//    elem->employe = employe;
//    elem->next = listEmp->first;
//    listEmp->first = elem;
}





void ajouterEmploye(ListEmp *listEmp, Employe employe)
{
    char element;
    printf("Voulez-vous ajouter le nouvel employe au début de la liste d ou a la fin de la liste f ? \n");
    scanf(" %c", &element);
    if (element == 'd')
        //printf("Au debut \n");
        auDebut(listEmp,employe);
    else if (element == 'f')
        //printf("A la fin \n");
        aLaFin(listEmp,employe);
}

void saisirListEmploye(ListEmp *listEmp, int n)
{
    Employe employe;
    for(int i=1;i<=n;i++)
    {
        printf("Employe %d\n",i);
        saisirEmploye(&employe);
        ajouterEmploye(listEmp,employe);
    }
}

void affichListEmploye(ListEmp *listEmp)
{
    Elem *i = listEmp->first;
    while(i != NULL)
    {
        afficheEmp(i->employe);
        i = i->next;
    }
}


float totalSalaire(ListEmp *listEmp)
{
    float total = 0;
    Elem *i = listEmp->first;
    while (i != NULL)
    {

        total += calculSalaire(i->employe);
        i = i->next;
    }
    return total;
}

int main()
{
 
    Employe e;
    int n;
    //printf("Saisr un emplye \n");
    //saisirEmploye(&e);
    //printf("Nom emplye : %s \n", e.nom);
    //afficheEmp(e);
    //printf("Salaire : %f",calculSalaire(e));
    //printf("\n\n");
    
    ListEmp *listEmp = init();
    //ajouterEmploye(listEmp,e);
    
    printf("Combien d'employes souhaitez-vous ajouter ?\n");
    scanf("%d",&n);
    saisirListEmploye(listEmp,n);
    
    affichListEmploye(listEmp);
    printf("Le salaire total de tous les employés de la liste est : %f", totalSalaire(listEmp));

    return 0;
}

错误:

main.c: In function ‘ajouterEmp’:
main.c:87:22: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
     nouveau->suivant = elements->premier;
                      ^
main.c: In function ‘main’:
main.c:114:21: error: incompatible type for argument 2 of ‘ajouterEmp’
  ajouterEmp(maListe,e)
                     ^
main.c:76:6: note: expected ‘Employe * {aka struct  *}’ but argument is of type ‘Employe {aka struct }’
 void ajouterEmp(Elements *elements, Employe *employe)
      ^~~~~~~~~~
main.c:116:2: error: expected ‘;’ before ‘return’
  return 0;
  ^~~~~~

你能帮我吗?谢谢!

4

1 回答 1

2

关于您的类型错误:已定义

typedef struct {
    char  nom[20];
    int   mat;
    float ht;
    float tx;
} Employe;

但后来你使用Employes了而不是Employe,例如在

void ajouterEm (Employes *e, Elem nemp) { /* ... */ }

ElementsElem这里一样。这就是您收到未知类型错误的原因。在

ajouterEmp(maListe, e)

指令后还必须有一个分号。还应注意指针(例如Employes*)和整个结构(不带*)传递给函数的位置。

修复此错误后进行编辑:

typedef struct{
    Employe *employe;
    struct ListEmp *suivant;
} ListEmp;

类型名称ListEmp已在 中的定义中使用suivant,但仅在下面的行中定义。利用

typedef struct _ListEmp {
    Employe *employe;
    struct _ListEmp *suivant;
} ListEmp;

反而。结构获取名称_ListEmp,然后定义struct _ListEmpListEmp. 对于第三个错误

ajouterEmp(maListe, e)

必须传递一个指针,但Employe e它是一个完整的数据结构。写

ajouterEmp(maListe, &e);

而是添加分号。

于 2020-07-05T10:36:00.363 回答