C语言 链表
不清楚为什么运行只会显示输入操作数,不能调用函数题目: 1) 建立一个单向链表,头指针是list,链表中每个结点包含姓名、基本工资信息,编写count_list函数统计链表中超过平均基本工资的人数。 要求在主函数中建立单向链表(注:当输入基本工资为0时,表示输入结束。),然后调用count_list函数统计链表中超过平均基本工资的人数,最后输出统计结果和平均基本工资。
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct worker_node
{
char name;
int money;
struct worker_node *next;
};
struct worker_node *createlist()
{
struct worker_node *list,*tail,*p;
list=p=NULL;
int money;
char name;
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;
}
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct worker_node {
char name;
int money;
struct worker_node *next;
};
struct worker_node *createlist() {
struct worker_node *list, *tail, *p;
list = tail = p = NULL;
int money;
char name;
printf("请输入职工的基本工资和姓名(当输入基本工资为0,表示输入结束):");
scanf("%d %s", &money, name);
while (money != 0) {
p = (struct worker_node *) malloc(sizeof(struct worker_node));
p->money = money;
strcpy(p->name, name);
p->next = NULL;
if (list == NULL)
list = p;
else
tail->next = p;
tail = p;
scanf("%d %s", &money, name);
}
return list;
}
void count_list(struct worker_node *list) {
struct worker_node *q;
int sum, count, count1;
double average;
sum = count = count1 = 0;
q = list;
if (list != NULL) {
for (; q != NULL; q = q->next) {
sum = sum + q->money;
count++;
}
average = (double) sum / count;
for (q = list; q != NULL; q = q->next) {
if (q->money > average) count1++;
}
printf("超过基本工资的人数%d,平均基本工资%lf", count1, average);
} else
printf("无职工信息!");
}
int main() {
int k;
struct worker_node *list = NULL;
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:
count_list(list);
break;
default:
break;
}
printf("\n");
}
system("pause");
return 0;
}
以下是对代码所做的修改:
[*]修改 createlist() 函数中的 scanf 语句,用 %s 而不是 %c 来读取字符串。
[*]在 createlist() 函数的循环中增加 scanf 语句,以便不断读取新输入。
[*]在 createlist() 函数中为新创建的结点的 next 成员赋值 NULL。
[*]修改 count_list() 函数的返回类型为 void,因为它不需要返回链表。
[*]修改 count_list() 函数中的遍历条件,使其在链表结尾时停止。
[*]删除 main() 函数中的 average 变量,因为它没有使用。
[*]修改 main() 函数中的 count_list() 函数调用。
页:
[1]