Structure variable

 

        The C language allows users to create a combined data structure composed of different types of data, which is called a structure. Create a structure type in the program:

1. Structure

Create structure

struct Student
{	int num;			//学号为整型 
	char name[20];	//姓名为字符串 
	char sex;			//性别为字符型 
	int age;				//年龄为整型
	float score;			//成绩为实型 
	char addr[30];		//地址为字符串 
};						//注意最后有一个分号 

 Define variables at the same time

struct Student
{	int num;		
	char name[20];
	char sex;	
	int age;
	float score;
	char addr[30];
}student1, student2;

 Define variables

struct Student  student1, student2;

output variable

#include <stdio.h>
int main()
{	struct Student							//声明结构体类型struct Student
	{	long int num;						//以下4行为结构体的成员
		char name[20];
		char sex;
		char addr[20];
	}a={10101,"Li Lin",'M',"123 Beijing Road"};	//定义结构体变量a并初始化
	printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n",a.num,a.name,a.sex,a.addr);
	return 0;
}

Initialization and reference of structure variables

//结构体变量的初始化和引用
student1.num=10010;
/*已定义了student1为student类型的结构体变量,
则student1.num表示student1变量中的num成员,即student1的num(学号)成员*/

Members of structure variables can be subjected to various operations just like ordinary variables.

Structure variables of the same type can be assigned to each other.

student1=student2;		//假设student1和student2已定义为同类型的结构体变量

Example: Enter the student ID, name and grades of two students, and output the student ID, name and grade of the student with higher grades.

#include <stdio.h>
int main()
{	struct Student			//声明结构体类型struct Student 
	{	int num;
		char name[20];
		float score;
	}student1,student2;	//定义两个结构体变量student1,student2 
	scanf("%d%s%f",&student1.num,student1.name,&student1.score);	//输入学生1的数据
	scanf("%d%s%f",&student2.num,student2.name,&student2.score);	//输入学生1的数据
	printf("The higher score is:\n");
	if(student1.score>student2.score)
		printf("%d  %s  %6.2f\n",student1.num,student1.name,student1.score);
	else if(student1.score<student2.score)
		printf("%d  %s  %6.2f\n",student2.num,student2.name,student2.score);
	else
	{	printf("%d  %s  %6.2f\n",student1.num,student1.name,student1.score);
		printf("%d  %s  %6.2f\n",student2.num,student2.name,student2.score);
	}
	return 0;
}

2. Use structure array

struct structure name {member table column} array name [array length];

struct Person
{	char name[20];
	int count;
}
struct Person leader[3];	//leader是结构体数组名 

Example: There are three candidates, and each voter can only vote for one person. It is required to compile a program to count the votes, input the names of the candidates one after another, and finally output the vote results of each person.

#include <string.h>
#include <stdio.h>
struct Person						//声明结构体类型struct Person
{	char name[20];				//候选人姓名
	int count;						//候选人得票数 
}leader[3]={"Li",0,"Zhang",0,"Sun",0};	//定义结构体数组并初始化

int main()
{	int i,j;
	char leader_name[20];			//定义字符数组 
	for(i=1;i<=10;i++)
	{	scanf("%s",leader_name);	//输入所选的候选人姓名
		for(j=0;j<3;j++)
		if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;
	}
	printf("\nResult:\n");
	for(i=0;i<3;i++)
		printf("%5s:%d\n",leader[i].name,leader[i].count);
	return 0;
}

3. Structure pointer

Output the information of the members in the structure variable through the pointer variable pointing to the structure variable.

#include <stdio.h>
#include <string.h>
int main()
{	struct Student			//声明结构体类型struct Student
	{	long num;
		char name[20];
		char sex;
		float score;
	};
	struct Student stu_1;	//定义struct Student类型的变量stu_1 
	struct Student *p;		//定义指向struct Student 类型数据的指针变量p 
	p=&stu_1;			//p指向stu_1 
	stu_1.num=10101;		//对结构体变量的成员赋值 
	strcpy(stu_1.name,"Li Lin");	//用字符串复制函数给stu_1.name赋值
	stu_1.sex='M';
	stu_1.score=89.5;
	printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);	//输出结果 
	printf("\nNo.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",(*p).num,(*p).name,(*p).sex, (*p).score);	
	return 0;
}

4. Linked list

4.1what is "linked list"

        The linked list has a "head pointer" variable, represented by head in the figure, which stores an address that points to an element. Each element in the linked list is called a "node", and each node should include two parts:

 (1) Actual data needed by users;

 (2) The address of the next node.

         The head points to the first element, and the first element points to the second element... until the last element, which no longer points to other elements, is called the "tail", and a "NULL" is placed in its address part ( Represents "empty address"), the linked list ends here.

 

struct Student
{	int num;
	float score;
	struct Student *next; 	//next是指针变量,指向结构体变量
}; 

 

4.2 Create a simple static linked list

Build a static linked list——"p"

#include <stdio.h>
struct Student						//声明结构体类型struct Student
{	int num;
	float score;
	struct Student*next;
};
int main()
{	struct Student a,b,c,*head,*p;	//定义3个结构体变量a,b,c作为链表的结点
	a.num=10101; a.score=89.5;		//对结点a的num和score成员赋值
	b.num=10103; b.score=90;		//对结点b的num和score成员赋值
	c.num=10107; c.score=85;		//对结点c的num和score成员赋值
	head=&a;					//将结点a的起始地址赋给头指针head
	a.next=&b;					//将结点b的起始地址赋给a结点的next成员
	b.next=&c;					//将结点c的起始地址赋给a结点的next成员
	c.next=NULL;					//c结点的next成员不存放其他结点地址
	p=head;						//使p指向a结点
	do
	{	printf("%ld %5.1f\n",p->num,p->score);	//输出p指向的结点的数据
		p=p->next;				//使p指向下一结点
	}while(p!=NULL);				//输出完c结点后p的值为NULL,循环终止
	return 0;
}

 -> represents the pointer pointing to the node data

4.3 Create a simple dynamic linked list

 

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{	long num;
	float score;
	struct Student*next;
};
int n; 	//n为全局变量,本文件模块中各函数均可使用它
struct Student *creat(void)
//定义函数。此函数返回一个指向链表头的指针
{	struct Student *head;
	struct Student *p1,*p2;
	n=0;
	p1=p2=(struct Student*) malloc(LEN);  //开辟一个新单元
	scanf("%ld,%f",&p1->num,&p1->score);
	//输入第1个学生的学号和成绩
	head=NULL;
	while(p1->num!=0)
	{	n=n+1;
		if(n==1) head=p1;
		else p2->next=p1;
		p2=p1;
		p1=(struct Student*)malloc(LEN);
		//开辟动态存储区,把起始地址赋给p1
		scanf("%ld,%f",&p1->num,&p1->score);
		//输入其他学生的学号和成绩
	}
	p2->next=NULL;
	return(head);
}
int main()
{	struct Student *pt;
	pt=creat(); 	//函数返回链表第一个结点的地址 
	printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score);
	//输出第1个结点的成员值
	return 0;
};

4.4 Output linked list

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student					//声明结构体类型struct Student
{	long num;
	float score;
	struct Student *next;
};
int n;						//全局变量n
void print(struct Student*head)	//定义print函数 
{	struct Student*p;			//在函数中定义struct Student类型的变量p
	printf("\nNow,These %d records are:\n",n);
	p=head;					//使p指向第1个结点
	if(head!=NULL)			//若不是空表
		do
		{	printf("%ld %5.1f\n",p->num,p->score);	//输出一个结点中的学号与成绩
			p=p->next;		//p指向下一个结点
		}while(p!=NULL);		//当p不是"空地址"
}

Guess you like

Origin blog.csdn.net/weixin_60787500/article/details/128982601