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
老舍评价说:“鬼狐有性格,笑骂成文章。”版本信息编辑追问

去你爹的

帮我看下这个c语言课设答辩老师可能会问的问题,顺便解答一下,感激不尽...
1、C语言基本概念,主要是程序循环,各个语句的表达语法及意义(这个是基本的);2、设计的总体思路,达到的目的结果;3、设计的过程,从主函数开始写程序...然后程序嵌套什什么什么的...有逻辑的叙述,重点说明你做了什么工作。4、重头戏,程序的调试过程(单片机程序的话),往往这部分大家都会忽略这个...

一道C语言课程设计题目,求大老解答
首先,你应该把实际的问题抽象成一个能够用数据表示出来的问题(数据结构部分),这个题目中包括,单词,相同单词的数量,相同单词分别占各自文章单词总数的百分比,至于相同单词出现的次数,这个和相同单词出现的数量有什么不同,表示暂时没看出来,你可以定义一个结构体VocabularyInfo,记录单词,单词在本文章出现...

数据结构 (c语言版)胡学纲 课后习题 答案谢谢了,大神帮忙啊
试用C++的类声明定义“复数”的抽象数据类型。要求 (1) 在复数内部用浮点数定义它的实部和虚部。 (2) 实现3个构造函数:缺省的构造函数没有参数;第二个构造函数将双精度浮点数赋给复数的实部,虚部置为0;第三个构造函数将两个双精度浮点数分别赋给复数的实部和虚部。 (3) 定义获取和修改复数的...

关于自考《数据结构导论》的疑问!同比C语言(分不多全给,请不啬指点)
一般情况下,把数据结构学的非常好后都不一定会编程,若你真要严格要求自己,我建议你把c中结构体及链表那块的知识弄懂,要非常懂,还有就是地址和指针那块的知识弄懂就ok了,再就是看看教学视频,在网上搜一些现成的程序,拷过去运行一下,改改其中的代码,你一下就明白了,也就是在读程序中领悟算...

跪求数据结构课程设计(C语言版)代码,感激不尽
《数据结构课程精讲教案合集-复旦大学(共计1061页).pdf 》百度网盘免费资源下载 链接: https:\/\/pan.baidu.com\/s\/15uwjtHgKKzZdheWFQC21pQ ?pwd=abzc 提取码: abzc

数据结构C语言题目求解答,最后面的主函数main应该怎么写?
main可以建立两个多项式,相加后得到另一个多项式。并输出这三个多项式。然后释放链表空间。结束程序。

关于数据结构的问题,用C语言描述
比如:求表深度,复制广义表等。这种题目,可以根据不同角度广义表的表现形式运用两种不同的方式解答:一是把一个广义表看作是表头和表尾两部分,分别对表头和表尾进行操作;二是把一个广义表看作是若干个子表,分别对每个子表进行操作。第五章 树与二叉树从对线性结构的研究过度到对树形结构的研究,是数据结构课程学习...

数据结构的习题(C语言版)
4],偶数为1,位置为[2],因此要生成的数列中前4个必定为奇数,而题目中没有对大小的要求,因此只用将偶数与最后面的奇数对换位置即可。对换的次数即为偶数的个数。大概思路如此,不过有很多方法可以高效的存储和计算,具体实现,希望你能亲自琢磨下,还可以巩固一下C技巧。祝好,有问题可以探讨。

物理题---要求:要写过程。 - - 老师上课讲了,还是没有听懂,好心人帮忙...
解:由Q=I2Rt得:I= QRt= 10w10Ω×100s=0.1A;由欧姆定律得:电路中的总电阻为:R总= UI= 4V0.1A=40Ω,则RL=R总-R=30Ω.由P= U2RL得:U= P×RL=6V 故答案为:6V.实际功率是I^2R=0.3W heihei.

C语言程序设计 链表的综合操作(急)
《高级程序设计语言》(用WIN-TC软件)课程设计一、课程设计的问题描述用C语言编写一个程序,通过链表的建立、输出、删除、插入等基本操作,实现学生成绩管理,从键盘输入学生信息,学生信息用结构体表示,包括学号、姓名、三门课成绩:语文、数学、英语。二、课程设计目标和要求必做:1. 插入功能:在学生链表中插入一个学生...

相似回答