01.C语言关于结构体的学习笔记
我对于学习的C语言的结构体做一个小的学习总结,总结如下:
结构体:structure
结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构。在其他高级语言中称为记录(record)。
声明一个结构体类型的一般形式为:
struct 结构体名{
类型名 成员名1;
类型名 成员名2;
……};
注意: 结构体类型的名字是由一个关键字struct 和结构体名组合而成的如struct Student.
结构体名是由用户指定的,又称“结构体标记”以区别于其他结构体类型。
花括号内是该结构体所包括的子项,称为结构体的成员。对各成员都应进行类型声明。
在定义结构体变量时可以对它的成员变量初始化。是对结构体变量的初始化,而不是对结构体类型。
struct Student b={.name="Zhang Fang"}; //在成员名前有成员运算符“.”
可以引用结构体变量中成员的值,引用方式为
结构体变量名.成员名.如: student1.num=10010;
结构体数组的举例:
例: 有n个学生的信息(包括学号、姓名、成绩),要求按成绩的高低顺序输出各学生的信息。
思路分析:用结构体数组存放n个学生信息,采用选择法择各元素进行排序。
#include
struct Student //声明结构体类型stuct Student
{int num;
char name[];
float score;
};
int main()
{
struct Student stu[]={{,"Zhang",},{,"Wang"98.5},{,"Li",},{,"Ling",73.5},{,"Sun",}}; //定义结构体数组并初始化
struct Strudent temp; //定义结构体变量temp用作交换时报的临时变量
const int n=; //定义常变量n。这里也可以用符号常量 #define N 5
int i,j,k;
printf("The order is :\n");
for(i=;i
{k=i;
for(j=i+;j
{
if(stu[j].score>stu[k].score) //进行成绩比较。
k=j;
}
temp=stu[k]; stu[k]=stu[i]; stu[i]=temp;//互换stu[k]和stu[i]元素
}
for(i=;i
printf("m %8s %6.2f\n",stu[i].num,stu[i].name,stu[i].score);
printf("\n");
return ;
}
结构体指针举例:
1. 指向结构体变量的指针:
#include
#include
int main()
{
struct Student
{
long num;
char name[];
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=; //对结构体变量的成员赋值
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("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f'\n", (*p).num,(*p).name,(*p).sex,(*p).score);
return ;
}
如果p指向一个结构体变量stu,以下三种用法等价:
.stu.num;
.(*p).num;
.p->num;
链表:
链表是动态地进行存储分配的一种结构。
链表有一个头指针变量,它在放一个地址,该地址指向一个元素。链表中每一个元素称为结点,第个结点都应包括两个部分:1.用户需要用的实际数据;2.下一个结点的地址。该元素不再指向其他元素在,它称为表尾,它的地址部分放一个NULL表示空地址,链表到此结束。
建立简单的静态链表:
例:建立一个简链表,它由3个学生数据的结点组成,要求输出各结点为中的数据。
#include
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=;a.score=; //对结点a的num和score成员赋值
b.num=;b.score=;
c.num=;c.score=;
head=&a; //将结点a的起始地址赋给头指针head
a.next=&b; //将结点b的起始地址赋给a结点的next成员
b.next=&c; //将c结点的起始地址赋给b的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 ;
}
这种所有结点都 是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表。
建立动态链表:
例:写一个函数建立一个有3名学生数据的单向动态链表。
#include
#include
#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=;
p1=p2=(struct Student*)malloc(LEN); //开辟一个新单元
scanf("%ld,%f",&p1->num,&p1->score);//输入第一个学生的学号和成绩
head=NULL;
while(p1->num!=)
{n=n+;
if(n==)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(); //调用creat函数,返回链表第一个结点地址。
printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score);//输出第一个结点的成员值
return ;
}
好啦!今天的学习笔记先写到这里。
01.C语言关于结构体的学习笔记的更多相关文章
- C语言链表结构体(学习笔记)
#include <stdio.h> #define LENTEST 100 // 采取逐步删除的方法求的素数 //先假设1-100都是素数,然后剔除2的倍数, //3的倍数,直到剔除所有 ...
- C语言 ---- 函数 结构体 iOS学习-----细碎知识点总结
函数的定义 返回值类型 函数名(形式参数列表) { 函数的实现 } 函数不允许嵌套定义 如果函数的定义在主调函数之后,那么要进行提前声明才能使用. // 匿名结构体,结构 ...
- Go语言 6 结构体、方法和接口
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...
- C语言中结构体赋值问题的讨论
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- C语言的结构体和C++结构体的区别
关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式
逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...
- C语言中结构体赋值问题的讨论(转载)
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct
https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...
随机推荐
- 函数式 CSS (FCSS)
在Wealthfront我们是一个函数式编程的超级粉丝.强调不变性和函数式风格意味着更少的“意外”(surprises),因为副作用是有限的或不存在的.我们能将独立的组件迅速构建出大型系统,通过组合的 ...
- HDU 2671 Can't be easier(数学题,点关于直线对称)
题目 //数学题//直线 y = k * x + b//直线 ax+by+c=0; 点 (x0,y0); 点到直线距离 d = (ax0+by0+c)/sqrt(a^2+b^2) /********* ...
- (转)約瑟夫問題的兩個O(log n)解法
約瑟夫問題的兩個O(log n)解法 這個是學習編程時的一個耳熟能詳的問題了: n個人(編號爲0,1,...,n-1)圍成一個圈子,從0號開始依次報數,每數到第m個人,這個人就得自殺, 之後從下個人開 ...
- 理解Flight框架核心
http://blog.csdn.net/sky_zhe/article/details/38906689 Flight 框架 Flight类 1.加载 autoload.php ,启动框架的自动加载 ...
- iOS学习资料链接
http://www.cocoachina.com/ios/20150111/10894.html
- POJ 2001
#include<iostream> using namespace std; ; struct trienode { trienode * next[kind]; int branch; ...
- 历代诗词咏宁夏注释1----常星景:< 六盘>
六盘 常星景 关中形势甲天下,四岳分峙西太华.[1] 中有汭泾经纬之,六盘嵚崎历历落.[2] □□□□其流亚,终年峰头雪不消. 弟畜太白兒美高,眼底培缕纷纷何足数,呼吸想通天尺五.[3] 西北堆镇一切 ...
- Codeigniter整合Tank Auth权限类库的教程
Codeigniter整合Tank Auth权限类库的教程一开始找了很多CodeIgniter的类库,觉得都不怎么样,后来干脆自己通过CI的钩子系统写了权限管理.但是还是不怎么满意,后来有人推荐tan ...
- (转)android ListView详解
转自: http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html 在android开发中ListView是比较常用的组件,它以列表的形 ...
- UVA 11133 - Eigensequence DP
Given an increasing sequence of integers a1, a2, a3, . . . , ak, the E-transform produces a sequence ...