C语言之结构体和链表

1.实验目的

1)掌握结构体的定义与使用;

2)掌握结构体数组的概念和应用;

3)掌握链表的概念、设计与实现、以及应用。

2.实验内容

1)课本例题,9.7, 9.11, 9.12

 

2)输入并运行以下程序:

#include <stdio.h>

union data

{

int i[2];

float a;

long b;

char c[4];

}u;

 

 

void main()

{

scanf("%d,%d",&u.i[0],&u.i[1]);

printf("i[0]=%d,i[1]=%d,a=%f,b=%ld,c[0]=%c,c[1]=%c,c[2]=%c,c[3]=%c\n",u.i[0],u.i[1],u. a,u.b,u.c[0],u.c[1],u.c[2],u.c[3]);

}

请分析以上程序运行的结果?

(3) 儿童信息链表构建

#include <stdio.h>

#include <stdlib.h>

 

struct Child  // 链表结点结构体

{

  // 结点数据

  float height;  float weight;  int age;  char gender;

  // 后继结点地址

  struct Child *next;

};

 

typedef struct Child ChildNode;

 

void inputChild( ChildNode* child )  // 结点数据输入函数

{

  printf( "Age: " );

  scanf( "%d", &child->age);

  getchar();

  printf( "Gender: " );

  scanf( "%c", &child->gender);

  printf( "Height: " );

  scanf( "%f", &child->height);

  printf( "Weight: " );

  scanf( "%f", &child->weight);

}

 

void printList( ChildNode* child )

{

  ChildNode *current;

  current = child;  // 遍历指针初始状态指向表头

  while( current->next != NULL ){

    current = current->next;  // 当前指针移动到下一个结点

    printf( "Age  %d\t", current->age );

    printf( "Gender  %c\t", current->gender );

    printf( "Height  %f\t", current->height );

    printf( "Weight  %f\n", current->weight );

  }

}

 

ChildNode* createList( int n )  // 生成链表

{

  ChildNode *p, *child;  int i;

  // 建立一个空的头结点

  child = (ChildNode*)malloc(sizeof(ChildNode));  

  child->next = NULL;  // 初始化指针域

  for( i = n; i > 0; --i ){  // 依次建立并向表头插入结点

    // 创建新结点

    p = (ChildNode *)malloc(sizeof(ChildNode));

    inputChild( p );  // 输入数据到新结点

    // 将新结点插入到表头结点之后

    p->next = child->next;  child->next = p;

  }

  return child;

}

 

void main()

{

  ChildNode *childList = NULL;

  int n;

  printf( "Number of children: " );

  scanf( "%d", &n );

  childList = createList( n );  // 构造链表

  printList(childList);

}

 


例题1

#include<stdio.h>
#define N 3
struct Student
{   int num;
	char name[20];
	float score[3];
	float aver;
};
int main()
{
	void input(struct Student stu[]);
	struct Student max(struct Student stu[]);
	void print(struct Student stu);
	struct Student stu[N],*p=stu;
	input(p);
	print(max(p));
	return 0;
}



void input(struct Student stu[])
{   int i;
    printf("请输入各学生的信息:学号、姓名、三门课成绩:\n");
    for(i=0;i<N;i++)
	{scanf("%d%s%f%f%f",&stu[i].num ,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
    stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;}
}



struct Student max(struct Student stu[])
{   int i,m=0;
    for(i=0;i<N;i++)
		if(stu[i].aver>stu[m].aver) m=i;
	return stu[m];
}


void print(struct Student stud)
{   printf("\n成绩最高的学生是:\n");
    printf("学号:%d\n姓名:%s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",
		stud.num ,stud.name ,stud.score[0],stud.score[1],stud.score[2],stud.aver);
}


例题2

#include<stdio.h>
struct
{ int num;
  char name[10];
  char sex;
  char job;
  union
  { int clas;
    char position[10];
  }category;
}person[2];

int main()
{ int i;
  for(i=0;i<2;i++)
  { printf("please enter the data of person:\n");
    scanf("%d%s%c%c",&person[i].num,&person[i].name,
		&person[i].sex,&person[i].job);
	if(person[i].job=='s')
		scanf("%d",&person[i].category.clas);
	else if(person[i].job=='t')
		scanf("%s",person[i].category.position);
	else
		printf("Input error!");
  }
  printf("\n");
  printf("No. name           sex job class/position\n");
  for(i=0;i<2;i++)
  {
	  if(person[i].job=='s')//若是学生
		  printf("%-6d%-10s%-4c%-4c%-10d\n",person[i].num,person[i].name,
		  person[i].sex,person[i].job,person[i].category.clas);
	  else//若是老师
		  printf("%-6d%-10s%-4c%-4c%-10d\n",person[i].num,person[i].name,
		  person[i].sex,person[i].job,person[i].category.clas);
  }
  return 0;
}


例题3

#include<stdio.h>
int main()
{
	enum Color{red,yellow,blue,white,black};                               //声明枚举类型enum Color
    int i,j,k,pri;                                                         //定义枚举变量i,j,k,pri
	int n,loop;
	n=0;
	for(i=red;i<=black;i++)                                                //外循环使i的值从red变到black
		for(j=red;j<=black;j++)                                            //中循环使j的值从red变到black
			if(i!=j)                                                       //如果两球不同色
			{ for(k=red;k<=black;k++)                                      //内循环使k的值从red变到black
			  if((k!=i)&&(k!=j))                                           //如果三球不同色
			  { n=n+1;                                                     //符合条件的次数加1
			    printf("%-4d",n);                                          //输出当前是第几个符合条件的组合
				for(loop=1;loop<=3;loop++)                                 //先后对三个球分别处理
				{ 
					switch(loop)                                           //loop的值从1变到3
					{ case 1:pri=i;break;                                  //loop的值为1时,把第1个球的颜色赋给pri
					  case 2:pri=j;break;                                  //loop的值为2时,把第2个球的颜色赋给pri
					  case 3:pri=k;break;                                  //loop的值为3时,把第3个球的颜色赋给pri
					  default:break;
					}
					switch(pri)                                            //根据球的颜色输出相应的文字
					{ case red:printf("%-10s","red");break;                //pri的值等于枚举常量red时输出"red"
					  case yellow:printf("%-10s","yellow");break;          //pri的值等于枚举常量yellow时输出"yellow"
					  case blue:printf("%-10s","blue");break;              //pri的值等于枚举常量blue时输出"blue"
					  case white:printf("%-10s","white");break;            //pri的值等于枚举常量white时输出"white"
					  case black:printf("%-10s","black");break;            //pri的值等于枚举常量black时输出"black"
					  default:break;
					}
				}
				printf("\n");
			}}
	printf("\ntotal:%5d\n",n);
	return 0;
}
    






  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DXnima

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值