写出一个程序的功能结构,该程序能输入职工工号和完成的产品数量,程序允许同一职工有多次输入,由程序对其完成的产品数量实现累计。程序按完成数量对他们排序,并确定他们的名次。按完成的产品数量由多到少的顺序,输出名次、同一名次的职工人数及他们的工号(工号由小到大顺序输出)。要求程序用有序链表存储数据信息。
时间: 2024-02-13 22:07:43 浏览: 31
以下是一个基本的程序功能结构:
1. 定义一个结构体`employee`,包含职工工号和完成的产品数量两个成员变量。
2. 定义一个节点结构体`node`,包含一个`employee`类型的数据成员和指向下一个节点的指针。
3. 定义一个有序链表的头指针`head`,初始值为`NULL`。
4. 编写函数`insert_node`,用于将输入的职工工号和完成的产品数量插入有序链表中。如果输入的职工已经存在于链表中,则更新其完成的产品数量;否则,插入一个新节点。
5. 编写函数`sort_employees`,用于按照完成的产品数量对职工进行排序,并输出对应的名次、人数和工号。具体实现方式可以使用冒泡排序或快速排序等算法。
6. 在主函数中,循环输入职工工号和完成的产品数量,调用`insert_node`函数将其插入有序链表中。
7. 循环结束后,调用`sort_employees`函数进行排序和输出。
下面是一个简单的C语言代码实现示例,仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_ID 1000
typedef struct {
int id; // 职工工号
int count; // 完成的产品数量
} employee;
typedef struct node {
employee data; // 节点数据
struct node *next; // 下一个节点指针
} node;
node *head = NULL;
// 在有序链表中插入节点
void insert_node(int id, int count) {
node *new_node = (node*)malloc(sizeof(node));
new_node->data.id = id;
new_node->data.count = count;
new_node->next = NULL;
if (head == NULL || count > head->data.count) {
new_node->next = head;
head = new_node;
} else {
node *p = head;
while (p->next != NULL && count <= p->next->data.count)
p = p->next;
new_node->next = p->next;
p->next = new_node;
}
}
// 对职工进行排序,并输出名次、人数和工号
void sort_employees() {
int rank = 1, count = 0, prev_count = 0;
node *p = head;
while (p != NULL) {
count++;
if (p->data.count != prev_count) {
printf("第%d名,%d人,产品数量:%d,工号:", rank, count, p->data.count);
rank += count;
count = 0;
prev_count = p->data.count;
}
printf("%d ", p->data.id);
p = p->next;
}
}
int main() {
int id, count;
while (scanf("%d %d", &id, &count) == 2) {
if (id <= 0 || id > MAX_ID) {
printf("职工工号%d无效,请重新输入!\n", id);
continue;
}
insert_node(id, count);
}
sort_employees();
return 0;
}
```