#结构体(struct)
#include<stdio.h>
struct student{ //学生信息结构体定义
int num; //定义学好
char name[10]; //定义姓名
int computer,english,math; //三门课程成绩
double average; //个人平均成绩
};
int main(){
int i,n;
struct student max,stu; //定义两个结构体变量
printf("input n: \n");
scanf("%d\n",&n);
printf("input the student s number name and sourse scores\n");
for(i=1;i<=n;i++){
printf("no.%d",i);
scanf("%d %s %d %d %d",&stu.num,&stu.name,&stu.math,&stu.english,&stu.computer);
stu.average=(stu.computer+stu.english+stu.math)/3.0;
if(i==1){
max=stu;
}else if(max.average<stu.average){
max=stu;
}
}
printf("num:%d,name:%s,average:%.2lf",max.num,max.name,max.average);
return 0;
}
使用结构来表示学生信息
struct student{ //学生信息结构体定义
int num; //定义学好
char name[10]; //定义姓名
int computer,english,math; //三门课程成绩
double average; //个人平均成绩
};
struct 结构名{
类型名 结构成员名1;
类型名 结构成员名2;
类型名 结构成员名3;
};
c语言中有三种方式定义结构变量:
1.单独定义:先定义一个结构类型,在定义这种结构类型的变量:
struct student{ //学生信息结构体定义
int num; //定义学好
char name[10]; //定义姓名
int computer,english,math; //三门课程成绩
double average; //个人平均成绩
};
struct student max,stu;
2.混合定义:在定义结构类型的同时定义结构变量
struct 结构名{
类型名 结构成员名1;
类型名 结构成员名2;
类型名 结构成员名3;
}结构变量名;
例如:
struct student{ //学生信息结构体定义
int num; //定义学好
char name[10]; //定义姓名
int computer,english,math; //三门课程成绩
double average; //个人平均成绩
} max,stu;
3.无类型定义:在定义结构变量时省略结构名
struct {
类型名 结构成员名1;
类型名 结构成员名2;
类型名 结构成员名3;
}结构变量名;
注意:由于省略了结构名,在定义后无法再定义这个类型的其他结构变量 ,一般情况下,除非变量不会再增加,否则建议采用前两种定义结构变量的方式!
##结构变量的使用
for(i=1;i<=n;i++){
printf("no.%d",i);
scanf("%d %s %d %d %d",&stu.num,&stu.name,&stu.math,&stu.english,&stu.computer);
stu.average=(stu.computer+stu.english+stu.math)/3.0;
if(i==1){
max=stu;
}else if(max.average<stu.average){
max=stu;
}
}
printf("num:%d,name:%s,average:%.2lf",max.num,max.name,max.average);
#自定义数据类型(typedef)
typedef用于声明一个已有数据类型的新名字
typedef int Length:让length成为int的别名,length就可以代替int出现在定义变量和参数声明的地方
例如:length a,b,len;
length number[10];
#全局变量
-func-表示当前函数的名称,输出%s字符串
#静态本地变量
注意:静态本地变量的根本是全局变量,其地址%p和全局变量的地址相邻,拥有本地变量的生存周期,但只在作用域里面才能起作用
#返回指针的函数
#宏定义
#define PI 3.14159
##带参数的宏
#多个源代码文件
#头文件
##标准头文件结构:防止在引用头文件是,有重复声明导致编译失败
#可变数组
数组一旦定义大小后就无法进行修改,那么我们如何实现一个可变数组呢
main.文件代码
#include "main.h"
#include<stdio.h>
#include<stdlib.h>
//自定义结构Array
//typedef struct{
// int *array;
// int size;
//}Array;
Array array_create(int init_size)//根据大小创建数组
{
Array a;
a.size=init_size;
a.array=(int*)malloc(sizeof(int)*a.size);
return a;
}
void array_free(Array *a)//使用完将申请的数组空间释放掉
{
free(a->array);
a->array=NULL;
a->size=0;
}
//封装
int array_size(const Array *a)//数组空间的大小
{
return a->size;
}
int* array_at(Array *a,int index)
{
return &(a->array[index]);
}
void array_inflate(Array *a,int more_size)//可变数组的自动增长
{
int *p=(int*)malloc(sizeof(int)*(a->size+more_size))//定义一个新指针p申请空间为原空间+more_size
int i;
for(i=0;i<a->size;i++){
p[i]=a->array[i]; //将原来a.array里面的内容复制到新指针p里面来
}
free(a->array);//释放原来申请的空间
a->array=p; //对原来的空间进行扩容
a->size+=more_size;
}
int main(){
Array a=array_create(100)//申请100int空间大小的数组
//array_free(&a);//使用后将申请的空间释放掉
*array_at(&a,0)=10;
}
[点击并拖拽以移动]
main.h文件代码
#ifndef _ARRAY_H_
#define _ARRAY_H_
//自定义结构Array
typedef struct{
int *array;
int size;
}Array;
Array array_create(int init_size)//根据大小创建数组
void array_free(Array *a);
int array_size(const Array *a);
int* array_at(Array *a,int index);
void array_inflate(Array *a,int more_size);
#endif
可变数组的缺陷:
由于每一次对数组进行扩容都要,对原来数组里面的内容进行复制,当数组扩容到一定程度的时候需要对上一次的数组进行复制,复制需要很多的时间,导致程序效率的低下
还有就是,当你不断扩容不断的申请空间的时候,都需要将原来的空间释放掉,但是你扩容后原来的空间不够你扩容后的大小,你会在你原来的空间后面申请更大的空间,不断的循环这个过程,当你申请n个内存的空间的时候,你会发现你前面有n-bs的空间还有但是由于不够你申请当前空间的大小,后面为申请的空间又不足以申请更大的空间,当你下一次进行扩容的时候,你就无法在申请空间内存,无法使用malloc进行内存的申请,但是实际上你当前空间的前面和后面还有很大一部分空间存在,但是你无法申请。
那么我们就需要使用链表来进行当前操作,链表实现可变数组,不需要对原来数组进行不断的复制,只需要将原来链表末尾使用指针指向下一个链表,告诉数据下一个空间在哪里,这样就不会造成内存空间的浪费出现无法申请空间的问题,就可以将内存空间充分利用起来,而且提高了程序的运行效率。
#链表
node.h 文件
#ifndef _NODE_H_
#define _NODE_H_
typedef dtruct _node{
int value;
struct _node *next;
}Node;
#endif
node.c文件
#include "node.h" #include<stdio.h> #include<stdlib.h> //typedef dtruct _node{ // int value; // struct _node *next; //}Node; int main(){ Node* head=NULL;//初始化头指针指向NUll int number; do{ scanf("%d",&number); if(number!=-1){ //add to linked-list Node *p=(Node*)malloc(sizeof(Node));//malloc one node exist p->value=number; p->next=NULL; //find the last Node* last=head; if(last){ while(last->next){ last=last->next; } //attach last->next=p; }else{ head=p; } } } while(number!=-1); return 0; }