c语言学习笔记

#结构体(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;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值