鱼C论坛

 找回密码
 立即注册
查看: 2228|回复: 1

[已解决]C语言 链表

[复制链接]
发表于 2023-4-6 21:03:58 | 显示全部楼层 |阅读模式
20鱼币
不清楚为什么运行只会显示输入操作数,不能调用函数

题目:   1) 建立一个单向链表,头指针是list,链表中每个结点包含姓名、基本工资信息,编写count_list函数统计链表中超过平均基本工资的人数。
       要求在主函数中建立单向链表(注:当输入基本工资为0时,表示输入结束。),然后调用count_list函数统计链表中超过平均基本工资的人数,最后输出统计结果和平均基本工资


#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct worker_node
{
        char name[20];
        int money;
        struct worker_node *next;
};
struct worker_node *createlist()
{
        struct worker_node *list,*tail,*p;
        list=p=NULL;
        int money;
        char name[20];
        printf("请输入职工的基本工资和姓名(当输入基本工资为0,表示输入结束):");
        scanf("%d %c",&money,name);
        while(money!=0)
        {
                p=(struct worker_node*)malloc(sizeof(struct worker_node));
                p->money =money;
                strcpy(p->name ,name);
                if(list==NULL) list=p;
                else tail->next =p;
                tail=p;
        }
        return list;
       
}
struct worker_node *count_list(worker_node *list)
{
        struct worker_node *q;
        int sum,count,count1;
        double average;
        sum=count=count1=0;
        q=list->next;
        if(list!=NULL)
        {
                for(;q->next !=NULL;q=q->next )
                {
                        sum=sum+q->money ;
                        count++;
                }
                average=sum/count;
                for(q=list->next ;q->next!=NULL;q=q->next  )
                {
                        if(q->money >average) count1++;
                }
                printf("超过基本工资的人数%d,平均基本工资%lf",count1,average);
        }
        else printf("无职工信息!");
        return list;
}
int main()
{
        int average,k;
        struct worker_node*p,*list;
        printf("*******************\n");
        printf("2:输入\t1:超过平均工资的人数和平均工资\n");
        printf("*******************\n");
        while(1)
        {
                printf("请输入操作序号:");
                scanf("%d",&k);
                if(!k)
                {
                        break;
                 }
                switch(k)
                {
                        case 2:list=createlist(); break;
                        case 1:list=*count_list(worker_node *list); break;
                        default:break;
                }
                printf("\n");
        }
        system("pause");
        return 0;
}

最佳答案
2023-4-6 21:03:59
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. struct worker_node {
  5.     char name[20];
  6.     int money;
  7.     struct worker_node *next;
  8. };

  9. struct worker_node *createlist() {
  10.     struct worker_node *list, *tail, *p;
  11.     list = tail = p = NULL;
  12.     int money;
  13.     char name[20];
  14.     printf("请输入职工的基本工资和姓名(当输入基本工资为0,表示输入结束):");
  15.     scanf("%d %s", &money, name);
  16.     while (money != 0) {
  17.         p = (struct worker_node *) malloc(sizeof(struct worker_node));
  18.         p->money = money;
  19.         strcpy(p->name, name);
  20.         p->next = NULL;
  21.         if (list == NULL)
  22.             list = p;
  23.         else
  24.             tail->next = p;
  25.         tail = p;
  26.         scanf("%d %s", &money, name);
  27.     }
  28.     return list;
  29. }

  30. void count_list(struct worker_node *list) {
  31.     struct worker_node *q;
  32.     int sum, count, count1;
  33.     double average;
  34.     sum = count = count1 = 0;
  35.     q = list;
  36.     if (list != NULL) {
  37.         for (; q != NULL; q = q->next) {
  38.             sum = sum + q->money;
  39.             count++;
  40.         }
  41.         average = (double) sum / count;
  42.         for (q = list; q != NULL; q = q->next) {
  43.             if (q->money > average) count1++;
  44.         }
  45.         printf("超过基本工资的人数%d,平均基本工资%lf", count1, average);
  46.     } else
  47.         printf("无职工信息!");
  48. }

  49. int main() {
  50.     int k;
  51.     struct worker_node *list = NULL;
  52.     printf("*******************\n");
  53.     printf("2:输入\t1:超过平均工资的人数和平均工资\n");
  54.     printf("*******************\n");
  55.     while (1) {
  56.         printf("请输入操作序号:");
  57.         scanf("%d", &k);
  58.         if (!k) {
  59.             break;
  60.         }
  61.         switch (k) {
  62.             case 2:
  63.                 list = createlist();
  64.                 break;
  65.             case 1:
  66.                 count_list(list);
  67.                 break;
  68.             default:
  69.                 break;
  70.         }
  71.         printf("\n");
  72.     }
  73.     system("pause");
  74.     return 0;
  75. }
复制代码


以下是对代码所做的修改:

  • 修改 createlist() 函数中的 scanf 语句,用 %s 而不是 %c 来读取字符串。
  • 在 createlist() 函数的循环中增加 scanf 语句,以便不断读取新输入。
  • 在 createlist() 函数中为新创建的结点的 next 成员赋值 NULL。
  • 修改 count_list() 函数的返回类型为 void,因为它不需要返回链表。
  • 修改 count_list() 函数中的遍历条件,使其在链表结尾时停止。
  • 删除 main() 函数中的 average 变量,因为它没有使用。
  • 修改 main() 函数中的 count_list() 函数调用。

最佳答案

查看完整内容

以下是对代码所做的修改: [*]修改 createlist() 函数中的 scanf 语句,用 %s 而不是 %c 来读取字符串。 [*]在 createlist() 函数的循环中增加 scanf 语句,以便不断读取新输入。 [*]在 createlist() 函数中为新创建的结点的 next 成员赋值 NULL。 [*]修改 count_list() 函数的返回类型为 void,因为它不需要返回链表。 [*]修改 count_list() 函数中的遍历条件,使其在链表结尾时停止。 [*]删除 main() 函数中的 ave ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-6 21:03:59 | 显示全部楼层    本楼为最佳答案   
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. struct worker_node {
  5.     char name[20];
  6.     int money;
  7.     struct worker_node *next;
  8. };

  9. struct worker_node *createlist() {
  10.     struct worker_node *list, *tail, *p;
  11.     list = tail = p = NULL;
  12.     int money;
  13.     char name[20];
  14.     printf("请输入职工的基本工资和姓名(当输入基本工资为0,表示输入结束):");
  15.     scanf("%d %s", &money, name);
  16.     while (money != 0) {
  17.         p = (struct worker_node *) malloc(sizeof(struct worker_node));
  18.         p->money = money;
  19.         strcpy(p->name, name);
  20.         p->next = NULL;
  21.         if (list == NULL)
  22.             list = p;
  23.         else
  24.             tail->next = p;
  25.         tail = p;
  26.         scanf("%d %s", &money, name);
  27.     }
  28.     return list;
  29. }

  30. void count_list(struct worker_node *list) {
  31.     struct worker_node *q;
  32.     int sum, count, count1;
  33.     double average;
  34.     sum = count = count1 = 0;
  35.     q = list;
  36.     if (list != NULL) {
  37.         for (; q != NULL; q = q->next) {
  38.             sum = sum + q->money;
  39.             count++;
  40.         }
  41.         average = (double) sum / count;
  42.         for (q = list; q != NULL; q = q->next) {
  43.             if (q->money > average) count1++;
  44.         }
  45.         printf("超过基本工资的人数%d,平均基本工资%lf", count1, average);
  46.     } else
  47.         printf("无职工信息!");
  48. }

  49. int main() {
  50.     int k;
  51.     struct worker_node *list = NULL;
  52.     printf("*******************\n");
  53.     printf("2:输入\t1:超过平均工资的人数和平均工资\n");
  54.     printf("*******************\n");
  55.     while (1) {
  56.         printf("请输入操作序号:");
  57.         scanf("%d", &k);
  58.         if (!k) {
  59.             break;
  60.         }
  61.         switch (k) {
  62.             case 2:
  63.                 list = createlist();
  64.                 break;
  65.             case 1:
  66.                 count_list(list);
  67.                 break;
  68.             default:
  69.                 break;
  70.         }
  71.         printf("\n");
  72.     }
  73.     system("pause");
  74.     return 0;
  75. }
复制代码


以下是对代码所做的修改:

  • 修改 createlist() 函数中的 scanf 语句,用 %s 而不是 %c 来读取字符串。
  • 在 createlist() 函数的循环中增加 scanf 语句,以便不断读取新输入。
  • 在 createlist() 函数中为新创建的结点的 next 成员赋值 NULL。
  • 修改 count_list() 函数的返回类型为 void,因为它不需要返回链表。
  • 修改 count_list() 函数中的遍历条件,使其在链表结尾时停止。
  • 删除 main() 函数中的 average 变量,因为它没有使用。
  • 修改 main() 函数中的 count_list() 函数调用。

评分

参与人数 1荣誉 +3 鱼币 +5 贡献 +3 收起 理由
灰乐 + 3 + 5 + 3 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-11 08:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表