第三周项目五(2):数组做数据成员(输入工资和员工人数)

问题及代码:

/*
*Copyright (c)2014,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:  数组做数据成员 .cpp
*作    者:白云飞
*完成日期:2015年3月20日
*版 本 号:v1.0
*
*问题描述:在main函数定义Salary类的对象,输入工资,再给每个人涨500元工资,排序后工资数据,然后输出结果。在main()中先输入职工人数,作为参数传递给输入职工工资的成员函数,然后利用动态分配内存的机制,开辟一个大小正好的连续空间,完成上面的工作。
*程序输入:工资,员工人数
*程序输出:排序的工资
*/
#include <iostream>
using namespace std;
class Salary
{
private:
    double *salarys; //多人的工资
    int number;  //实际人数
public:
    void set_salarys( );//输入职工工资(输入-1标志着工资输入结束),工资保存到salary数组中,实际人数保存到number中;
    void add_salarys(int x);//给每个人涨x元工资
    void sort_salarys();//对工资排序
    void show_salarys( );//显示工资信息
};
void Salary::set_salarys( )
{
    int i=0,x;
    cout<<"请输入员工人数:";
    cin>>number;
    salarys=new double[number];
    cout <<"请输入工资数目:";
    for(i=0; i<number; i++)
    {
        cin>>x;
        salarys[i]=x;
    }
}
void Salary::add_salarys(int x)
{
    int i;
    for(i=0; i<number; i++)
    {
        salarys[i]+=x;
    }
}
void Salary::sort_salarys()
{
    int i,j;
    double s;
    for(i=0; i<number-1; i++)
        for(j=0; j<number-1-i; j++)
        {
            if(salarys[j]<salarys[j+1])
            {
                s=salarys[j];
                salarys[j]=salarys[j+1];
                salarys[j+1]=s;
            }
        }
}
void Salary::show_salarys( )
{
    int i;
    cout<<"排序后的工资:";
    for(i=0; i<number; i++)
        cout<<salarys[i]<<" ";
}
int main()
{
    Salary a;
    a.set_salarys();
    a.add_salarys(500);
    a.sort_salarys();
    a.show_salarys();
    return 0;
}


运行结果:

<think>嗯,用户想用C语言实现一个单向链表,存储员工的姓名基本工资,然后通过max_list函数找到最高工资员工信息。首先,我得先回忆一下单向链表的基本结构。每个节点需要包含姓名、工资一个指向下一个节点的指针。对吧?然后,创建链表的部分,可能需要逐个添加节点,或者一次输入多个员工的信息。 接下来,关于max_list函数,这个函数需要遍历整个链表,比较每个节点的工资,记录下最大的那个。但要注意,可能有多个员工有相同的最高工资,不过用户好像只需要找到第一个出现的,或者随便一个?题目没说,可能默认第一个最大的就行。 然后,用户要求只用stdio.hstdlib.h,所以得用标准库函数。比如,mallocfree来分配释放内存。结构体应该定义为struct Employee,包含char数组存姓名,float或double存工资,以及一个指向下一个节点的指针。 创建链表的时候,可能需要一个头节点,或者不带头节点?用户可能不知道头节点的概念,所以或许直接用一个指针指向第一个节点,当链表为空时,这个指针是NULL。添加节点的话,可以用尾插法或者头插法。但用户可能需要按输入顺序存储,所以尾插法更合适,但尾插法需要记录尾节点,或者每次遍历到末尾,这样效率可能不高。不过对于练习来说,可能没问题。 那具体步骤大概是:定义结构体,编写创建节点的函数,编写添加节点到链表的函数,或者直接在main函数里逐个创建节点并链接起来。然后实现max_list函数,遍历链表,比较工资,保存当前最大值的节点指针。最后,打印出这个节点的姓名工资。 需要注意的地方:字符串的存储,比如姓名应该用字符数组,比如name[50],或者动态分配内存。但用户可能希望简单,所以用固定大小的数组更合适,比如char name[50]。这样在输入的时候可以用scanf("%s", name),但要注意缓冲区溢出的问题,不过作为示例程序可能没问题。 在输入员工信息时,可能需要循环输入,直到用户输入某个终止条件,比如输入“exit”或者工资为负数。但用户的问题中没有说明输入方式,所以可能需要预设一定数量的员工,或者在运行时动态添加。或者让用户输入人数,然后逐个输入。比如,先输入人数n,然后输入n个员工的姓名工资。 不过用户的问题可能希望程序能动态添加节点,直到用户停止。但可能用户想简化,所以直接在main函数里创建几个节点,手动链接起来测试。 然后,max_list函数的参数应该是链表的头节点指针,返回最大节点的指针。或者,如果链表为空,返回NULL,这样在调用时需要检查返回值是否为NULL。 还有一个问题,如何处理多个最大工资的情况?比如,如果有多个员工工资相同且都是最大值,应该返回第一个遇到的还是最后一个?根据通常的法,可能返回第一个遇到的,或者遍历整个链表确保找到最大的。但题目没有说明,所以可能返回第一个最大的即可。 另外,在比较工资时,需要使用float或double类型,需要注意浮点数比较的精度问题,但用户可能输入的是整数,所以用float应该足够。 结构体的定义应该是这样的: struct Employee { char name[50]; float salary; struct Employee* next; }; 然后,创建节点的函数: struct Employee* create_node(const char* name, float salary) { struct Employee* node = (struct Employee*)malloc(sizeof(struct Employee)); if (node == NULL) { printf("内存分配失败\n"); exit(1); } strcpy(node->name, name); node->salary = salary; node->next = NULL; return node; } 然后,在main函数中,创建几个节点,并链接成链表。或者让用户输入节点信息,动态构建链表。比如: struct Employee* head = NULL; struct Employee* tail = NULL; int n; printf("输入员工数量:"); scanf("%d", &n); for (int i = 0; i < n; i++) { char name[50]; float salary; printf("输入姓名工资:"); scanf("%s %f", name, &salary); struct Employee* node = create_node(name, salary); if (head == NULL) { head = node; tail = node; } else { tail->next = node; tail = node; } } 然后,max_list函数的实现: struct Employee* max_list(struct Employee* head) { if (head == NULL) return NULL; struct Employee* max_node = head; struct Employee* current = head->next; while (current != NULL) { if (current->salary > max_node->salary) { max_node = current; } current = current->next; } return max_node; } 然后在main函数中调用: struct Employee* max_employee = max_list(head); if (max_employee != NULL) { printf("最高工资员工:%s,工资:%.2f\n", max_employee->name, max_employee->salary); } else { printf("链表为空\n"); } 不过需要注意,当链表为空时处理的情况,避免解引用空指针。 此外,用户可能需要释放链表的内存,但题目中没有提到,不过作为好习惯,应该在程序结束前释放所有节点。可以用一个循环遍历链表,逐个free。 但用户的问题可能更关注如何创建链表实现max_list函数,所以示例代码可能不需要包含释放内存的部分,但实际应用中应该加上。 另外,关于链表的插入创建,可能需要检查内存分配是否成功,比如在create_node函数中,如果malloc返回NULL,则处理错误。 现在,用户的问题可能需要将这些部分整合成一个完整的程序,包括结构体定义、创建节点、构建链表、max_list函数,以及主函数中的输入输出。 可能还需要处理用户输入的细节,比如输入姓名的格式,是否允许空格。如果用scanf的%s,则无法读取带空格的姓名,这时候可能需要改用fgets,但这样会更复杂。用户可能接受使用不带空格的姓名作为示例,所以用scanf即可。 总结步骤: 1. 定义结构体Employee,包含name、salarynext指针。 2. 实现创建节点的函数。 3. 在main中构建链表,通过用户输入或预设数据。 4. 实现max_list函数,遍历链表找到最大工资的节点。 5. 输出结果。 6. 释放内存(可选,但推荐)。 然后,把这些步骤写成代码,确保符合用户的要求,仅使用stdio.hstdlib.h,没有其他头文件。 可能遇到的问题:节点链接是否正确,遍历是否遗漏,比较工资是否正确处理浮点数,以及处理空链表的情况。 测试用例:例如,三个节点,工资分别为3000、5000、4000,应找到第二个节点。或者所有工资相同,返回第一个。或者链表为空,返回NULL。 现在,把这些写成代码,并确保符合用户给出的格式要求,比如代码块用python的语法高亮,但实际上是C语言。不过用户给出的示例中,快速排序的代码块用的是python,但用户的问题是关于C语言的,所以可能用户希望代码块用正确的语法,但系统可能需要调整。不过根据用户提供的系统级指令,代码块可能需要使用正确的标记,但用户示例中的python可能只是示例,实际应按照用户的问题来写C代码。 所以最终的代码应该包含: 结构体定义,create_node函数,构建链表,max_list函数,主函数中的输入输出处理,以及内存释放(如果需要)。 现在,将这些步骤写成回答,结构清晰,分步骤说明,并附上代码。</think>### 分步实现说明 #### 1. 定义链表结构体 使用结构体存储员工信息,包含三个成员: - `name[50]`:存储员工姓名 - `salary`:存储基本工资(浮点型) - `next`:指向下一个节点的指针 ```c struct Employee { char name[50]; float salary; struct Employee* next; }; ``` #### 2. 创建节点函数 通过`malloc`动态分配内存,初始化成员后返回节点指针: ```c struct Employee* create_node(const char* name, float salary) { struct Employee* node = (struct Employee*)malloc(sizeof(struct Employee)); strcpy(node->name, name); node->salary = salary; node->next = NULL; return node; } ``` #### 3. 构建链表 通过头指针尾指针维护链表,实现高效尾插: ```c struct Employee* head = NULL; struct Employee* tail = NULL; // 示例:插入三个节点 head = create_node("张三", 8000); tail = head; tail->next = create_node("李四", 12000); tail = tail->next; tail->next = create_node("王", 9500); ``` #### 4. 实现max_list函数 遍历链表比较工资值,记录最大值节点: ```c struct Employee* max_list(struct Employee* head) { if (head == NULL) return NULL; struct Employee* max_node = head; struct Employee* current = head->next; while (current != NULL) { if (current->salary > max_node->salary) { max_node = current; } current = current->next; } return max_node; } ``` #### 5. 主函数整合 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 结构体定义函数实现此处省略... int main() { // 构建链表 struct Employee* head = create_node("张三", 8000); head->next = create_node("李四", 12000); head->next->next = create_node("王", 9500); // 查找最大值 struct Employee* max_emp = max_list(head); if (max_emp) { printf("最高工资员工: %s, 工资: %.2f\n", max_emp->name, max_emp->salary); } // 释放内存(实际应用需遍历释放) return 0; } ``` #### 关键点说明 1. **内存管理**:每个节点通过`malloc`动态分配,实际应用需通过`free`释放内存 2. **尾指针优化**:使用尾指针可将插入时间复杂度降为$O(1)$[^3] 3. **边界处理**:`max_list`函数已处理空链表情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值