C语言数据结构,看要求,老师留的课后题,上课没听明白,求大佬解答,要求使用链表。

如题所述

其实这些问题都很简单,都是你学过的那些知识,结合起来使用而已。

比如找最低工资不就相当于在一个数组里面查找最小数吗?最高工资就是找最大数。

平均工资就是计算一个数组的平均数。。。。这些都是换汤(数组换链表)不换药(算法思路不变),这道题唯一存在一点难度的就是排序问题。因为单链表(虽然题目没有说非要用单链表,也可以用双链表,但是操作更为复杂,我用的单链表)排序确实挺麻烦的,我指的是根据链表中的某一项成员来对每一个节点进行排序。那么把问题简单化就可以了,话又说回来,就是学过的知识(如果还没有学到请忽略),数组,数组排序会吧,排序,最简单的冒泡会吧!剩下一个问题,就是链表怎么变成数组,使用指针数组就可以(不知道自己去看看)。把链表中的每一个节点放进指针数组里面去,然后按照冒泡排序的算法步骤进行排序就大功告成了。啰嗦了这么久还是直接来点实际的吧,毕竟这东西是需要练的。

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define NAME_LENGTH 11    /* 名字长度     */

#define MAX_NAME_LENGTH NAME_LENGTH-1

#define MAX_STAFF   100   /* 员工最多人数 */

#define ONE_LEVEL   5000.0

#define TWO_LEVEL   8000.0

#define THREE_LEVEL 17000.0

#define FOUR_LEVEL  30000.0

#define FIVE_LEVEL  40000.0

#define SIX_LEVEL   60000.0

#define SEVEN_LEVEL 85000.0

#define EIGHT_LEVEL  sizeof(double)

#define ONE_PER_POINT   0.0

#define TWO_PER_POINT   0.03

#define THREE_PER_POINT 0.1

#define FOUR_PER_POINT  0.2

#define FIVE_PER_POINT  0.25

#define SIX_PER_POINT   0.30

#define SEVEN_PER_POINT 0.35

#define EIGHT_PER_POINT 0.45

#define INSURANCE       0.21

#define FREE_DUTY       5000.0

#define FALSE 0

#define TRUE  1

typedef int _bool;

typedef struct staff *sta;

struct staff {

char name[NAME_LENGTH];

double salary;

sta next;

};

sta head = NULL;

static int max_staff = 0;

static void add_staff(void);               /* 添加员工,在提示输入姓名时按下回车结束输入 */

static void print_staff(void);             /* 打印员工信息 */

static void search_lowst_salary(void);     /* 查找工资最高的员工 */

static void search_highest_salary(void);   /* 查找工资最低的员工 */

static void avg_salary(void);              /* 求平均工资 */

static void per_point(void);               /* 工资段位人数及百分比 */

static void sort_salary(char s);           /* 工资排序 */

static void swap_staff(sta a, sta b);      /* 交换节点,没有写,因为换了另一种算法 */

static void free_staff(void);              /* 释放内存 */

static void scottare(double *salary);      /* 缴税后的工资 */

static void high_sort(void);               /* 高到低排序,即降序 */

static void low_sort(void);                /* 低到高排序,即升序 */

int main(void) {

add_staff();

printf("员工信息录入完成\n");

printf("员工原始信息\n");

print_staff();

// printf("请输入相应的操作选项\n");

search_lowst_salary();

search_highest_salary();

avg_salary();

per_point();

printf("工资升序排序\n");

sort_salary('a');

print_staff();

printf("工资降序排序\n");

sort_salary('d');

print_staff();

free_staff();

return 0;

}

static void add_staff(void) {

sta temp;

int i;

char name[NAME_LENGTH];

char ch;

while ( 1 ) {

i = 0;

printf("请输入员工姓名: ");

while ( ( ch = getchar() ) != '\n' ) {

name[i++] = ch;

if ( i >= MAX_NAME_LENGTH - 1 ) {

fflush(stdin); /* 清空输入缓冲区 */

break;

}

}

if ( i == 0 ) return;

name[i] = '\0';

temp = (sta)malloc(sizeof(struct staff));

if ( temp == NULL ) {

perror("Error");

printf("请重试");

continue;

}

while ( 1 ) {

printf("请输入该员工工资: ");

scanf("%lf", &temp->salary);

if ( temp->salary < 1.0 ) {

printf("工资应该不小于1, 请重新输入\n");

continue;

}

scottare(&temp->salary);

break;

}

getchar();

temp->next = head;

head = temp;

strncpy(temp->name, name, i+1);

max_staff++;

if ( max_staff >= MAX_STAFF ) {

printf("员工人数最多100人\n");

return;

}

}

}

static void print_staff(void) {

sta tmp = head;

printf("员工姓名\t工资\n");

while ( tmp != NULL ) {

printf("%s\t\t%0.2f\n", tmp->name, tmp->salary);

tmp = tmp->next;

}

printf("-----------------分割线----------------\n");

}

static void search_lowst_salary(void) {

sta tmp = head->next;

sta lowst = head;

while ( tmp != NULL ) {

if ( lowst->salary > tmp->salary ) {

lowst = tmp;

}

tmp = tmp->next;

}

printf("最低工资员工\n");

printf("员工姓名\t工资\n");

printf("%s\t\t%0.2f\n", lowst->name, lowst->salary);

printf("-----------------分割线----------------\n");

}

static void search_highest_salary(void) {

sta tmp = head->next;

sta highest = head;

while ( tmp != NULL ) {

if ( highest->salary < tmp->salary ) {

highest = tmp;

}

tmp = tmp->next;

}

printf("最高工资员工\n");

printf("员工姓名\t工资\n");

printf("%s\t\t%0.2f\n", highest->name, highest->salary);

printf("-----------------分割线----------------\n");

}

static void avg_salary(void) {

sta tmp = head;

double avg = 0.0;

while ( tmp != NULL ) {

avg += tmp->salary;

tmp = tmp->next;

}

printf("员工平均工资: %0.2f\n", avg / max_staff );

printf("-----------------分割线----------------\n");

}

static void per_point(void) {

sta tmp = head;

int level[3] = { 0, 0, 0 };

while ( tmp != NULL ) {

if ( tmp->salary < 3000 ) level[0]++;

else if ( tmp->salary >= 5000 ) level[2]++;

else level[1]++;

tmp = tmp->next;

}

printf("工资小于3000的人数: %d人, 百分比: %0.2f%%\n", level[0], (level[0] / (double)max_staff)*100 );

printf("工资在[3000,5000)的人数: %d人, 百分比: %0.2f%%\n", level[1], (level[1] / (double)max_staff)*100 );

printf("工资大于等于5000的人数: %d人, 百分比: %0.2f%%\n", level[2], (level[2] / (double)max_staff)*100 );

}

static void sort_salary(char s) {

if ( s == 'd' ) {

high_sort();

} else if ( s == 'a' ) {

low_sort();

}

}

/*

*    单链表排序算法,为了通俗易懂,

*    本例子采用冒泡排序法。

*    思路:将链表的每一个节点存放到指针数组中,把

*    每一个节点当成一个数字(该数字基于工资),然后

*    冒泡排序的算法进行排序。

*/

static void high_sort(void) {

sta sa[MAX_STAFF]; /* 指针数组,用于排序 */

int i = 0;

int j;

sta tmp = head;

sta buff;

if ( max_staff == 1 ) return;

while ( tmp != NULL ) {

sa[i++] = tmp;

tmp = tmp->next;

}

sa[i] = NULL;

i = 0;

while ( i < max_staff ) {

j = i + 1;

while ( j < max_staff ) {

tmp = sa[j];

if ( sa[i]->salary > tmp->salary ) {

tmp = sa[i]; sa[i] = sa[j]; sa[j] = tmp;

}

j++;

}

i++;

}

i = 0;

while ( sa[i] != NULL ) {

sa[i]->next = sa[i+1];

i++;

}

head = sa[0];

}

/*

*   此处的注释和high_sort()函数的注释一样。

*/

static void low_sort(void) {

sta sa[MAX_STAFF];

int i = 0;

int j;

sta tmp = head;

sta buff;

if ( max_staff == 1 ) return;

while ( tmp != NULL ) {

sa[i++] = tmp;

tmp = tmp->next;

}

sa[i] = NULL;

i = 0;

while ( i < max_staff ) {

j = i + 1;

while ( j < max_staff ) {

tmp = sa[j];

if ( sa[i]->salary < tmp->salary ) {

tmp = sa[i]; sa[i] = sa[j]; sa[j] = tmp;

}

j++;

}

i++;

}

i = 0;

while ( sa[i] != NULL ) {

sa[i]->next = sa[i+1];

i++;

}

head = sa[0];

}

static void free_staff(void) {

sta tmp = head;

while ( tmp != NULL ) {

head = tmp->next;

free(tmp);

tmp = head;

}

}

static void scottare(double *salary) {

double sco;

double per;

if ( *salary <= ONE_LEVEL   )      { return;                }

else if ( *salary <= TWO_LEVEL   ) { per = TWO_PER_POINT;   }

else if ( *salary <= THREE_LEVEL ) { per = THREE_PER_POINT; }

else if ( *salary <= FOUR_LEVEL  ) { per = FOUR_PER_POINT;  }

else if ( *salary <= FIVE_LEVEL  ) { per = FIVE_PER_POINT;  }

else if ( *salary <= SIX_LEVEL   ) { per = SIX_PER_POINT;   }

else if ( *salary <= SEVEN_LEVEL ) { per = SEVEN_PER_POINT; }

else                               { per = EIGHT_PER_POINT; }

*salary = ( *salary - *salary * INSURANCE ) - ( *salary - *salary * INSURANCE - FREE_DUTY ) * per;

/*

return TRUE;

*/

}

再给你看看怎么用,下面是运行结果图(工资都是指税后工资):

祝你愉快。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-06-11
我数学是体育老师教的
第2个回答  2019-06-12
在动画版《三国演义》中有较多多音字读错音和错别字及不符合时代的用字:例如蜀汉后主刘禅的“禅”字应读“shàn”(和刘备义子刘封的“封”字对应,取“封禅”之意),在动画中却错读成了多音字“chán”;猇亭的“猇”字错写成了“虎”字等。
第3个回答  2019-06-11
老舍评价说:“鬼狐有性格,笑骂成文章。”版本信息编辑追问

去你爹的