(优选)结构体与链表
C语言结构体使用之链表

C语⾔结构体使⽤之链表⽬录⼀、结构体的概念⼆、结构体的⽤法三、结构体数组和指针四、结构体指针五、包含结构体的结构体六、链表七、静态链表⼋、动态链表⼀、结构体的概念⽐如说学⽣的信息,包含了学⽣名称、学号、性别、年龄等信息,这些参数可能有些是数组型、字符型、整型、甚⾄是结构体类型的数据。
虽然这些都是不同类型的数据,但是这些都是⽤来表达学⽣信息的数据。
⼆、结构体的⽤法1、struct 结构体名称访问⽅法:结构体变量名.成员{undefined成员1;成员2;};2、 typedef struct{undefined成员1;成员2;}结构体名称;在中⼤型产品中⼀般⽤第2种,因为结构体多了以后通过别名的⽅式定义结构体变量能够⼤⼤提⾼代码可读性。
三、结构体数组和指针1、直接⽤struct声明⼀个结构体,然后在定义结构体数组,struct 结构体名称数组名[数组⼤⼩]2、⽤typedef struct声明⼀个结构体,并且为结构体重命名,通过重命名的⽅法定义结构体数组。
结构体重命名数组名[数组⼤⼩]四、结构体指针只要是存储在内存中的变量或者数组或函数编译器都会为他们分配⼀个地址,我们可以通过指针变量指向这个地址来访问地址⾥⾯的数,只要把指针变量定义成同数据类型就可以指向了,⽐如说要指向字符型变量就定义字符型指针变量,所以我们也可以定义结构体类型指针来指向它。
1、直接⽤struct声明⼀个结构体,然后在定义结构体指针,struct 结构体名称 *结构体指针变量名2、⽤typedef struct声明⼀个结构体,并且为结构体重命名,通过别名的⽅式定义结构体指针。
结构体别名 *结构体指针变量名结构体指针访问成员⽅法结构体指针变量名->成员名五、包含结构体的结构体学⽣信息包含姓名,学号,性别,出⼊⽇期等数据,⽽出⽣⽇期⼜包含年⽉⽇这3个成员,所以把出⽣⽇期单独声明⼀个结构体,那么学⽣这个结构体就包含出⽣⽇期这个结构体,这种就是包含结构体的结构体。
C语言程序设计教程CJ_07结构体类型概述_潭浩强第3版

例:
27
辽宁师范大学
蔡静
用于动态存储分配的函数(续)
stdlib.h
Free 函数 Void *free( void *ptr ){ …… }
功能:将ptr指向的内存空间释放,交还给系统,无返 回值。 说明:ptr值不能是任意地址,只能是由于在程序中最 近一次调用过的malloc或calloc函数所返回的地址。 例: p=(char *)malloc(80);
17
辽宁师范大学
蔡静
11.6
11.6.1
指向结构体的指针
指向结构体变量的指针
指针变量的值为结构体变量的起始地址。 说明:
结构体变量.成员名 (*结构体指针).成员名 结构体指针->成员名 三者等价 ->优先于++。 p->num++ 即 (p->num)++ ++p->num 即 ++(p->num)
7
struct stud { long num; char name[20]; struct date { int month; int day; int year; }birth; char sex; }; struct stud s1, st[50];
辽宁师范大学 蔡静
11.2 结构体类型变量的定义和引用 1. 结构体变量的定义
数据类型概述
整型 基本 数据类型 Short int long float double
系统预定义的标准数据类型
实型(浮点型) 字符类型char Void类型
指针类型T* 结构体类型struct 位段 bit field 共用体类型union 枚举类型enum typedef 数组类型T[……] 文件类型FILE 函数类型
第7章 结构体和联合体数据类型

结构体数组
结构体数组元素的使用
通过操作数组的每一个元素达到操作数组的目的。结构体 数组元素需要用下标变量的形式表示。 结构体数组元素就相当于一个结构体变量,将引用数组元 素的方法和引用结构体变量的方法结合起来就形成了引用 结构体数组元素成员分量的方法,其一般形式为: 数组名[下标].成员名 不能将结构体数组元素作为一个整体直接进行输入输出, 也需要通过输入输出数组元素的每一个成员分量达到输入 输出结构体数组元素的目的。 可以将结构体数组元素作为一个整体赋给同类型数组的另 外一个元素,或赋给一个同类型的结构体变量。
Ex0707 结构体数组操作(数组元素引用、数组元素的输入输出)示例。
结构体数组
结构体数组作函数的参数
在函数调用期间实参结构体数组将它的全部存储区域或者 部分存储区域提供给形参结构体数组共享。 如果需要把整个实参结构体数组传递给被调函数中的形参 结构体数组,可以使用实参结构体数组的名字或者实参结 构体数组第一个元素(0号元素)的地址。 如果需要把实参结构体数组中从某个元素值后的部分传递 给被调函数中的形参结构体数组,则使用实参结构体数组 某个元素的地址。
Ex0704 结构体变量的输入/输出示例。
结构体类型的定义和使用
结构体变量的使用——做函数参数
结构体类型变量和结构体类型变量的成员都可以作为函数 的参数在函数间进行传递,数据的传递仍然是“值传递方 式”。 使用结构体类型变量作为函数参数时,被调函数的形参和 主调函数的实参都是结构体类型的变量,而且属于同一个 结构体类型。 使用结构体类型变量的成员作为函数参数时,其中被调函 数中的形参是普通变量,而主调函数中的实参是结构体类 型变量中的一个成员,并且形参和实参的数据类型应该对 应一致。
C++课件(南航皮德常)6

【6.1简略版】在main函数中输入一个学生的学号、姓名、性别、出生日期和3门课程的成绩,在另一函数print中输出这个学生的信息,采用结构体变函数参数。
void print( student );void main ( ){student John;// 定义一个结构体变量cin>> John.ID>> >> John.gender;cin>> John.birthday.year>> John.score[2];print(John);// 调用函数完成输出}void print( student s)// 输出参数s成员的值{cout<<"学号: " << setw(5) << s.ID<< endl;cout<< setw(5) << s.birthday.month<< endl;}使用结构体变量作函数参数效率较低,why? 可采用指向结构体变量的指针或引用作参数,例如:student *ps;student John;并且如下赋值:ps= &John;则:<=> ps->name <=> (*ps).name思考:如何将程序【例6.1】中的函数print改为传指针。
【例6.2】假设一个班级有5个学生,从键盘输入5个学生的学号、姓名、性别、出生日期和三门功课的成绩,编程输出个人平均分小于全班总均分的那些学生的信息。
struct date{int year, month, day;};struct student{int ID;char name[20];char gender;date birthday;double score[3];};void input( student*, int);double average( student *, int n); //求总的平均分void print( student*,int);const int studentNumber=5;int main ( ){student stud[5];input(stud,studentNumber);print(stud,studentNumber);return 0;}void input( student *ps, int n)// 输入函数{cout<<"请输入如下学生信息" << endl;for(int i=0;i<n; i++){cin>> ps->ID;cin>> ps->name;cin>> ps->gender;cin>> ps->birthday.year>> ps->birthday.month>> ps->birthday.day;cin>> ps->score[0] >> ps->score[1]>> ps->score[2];ps++;}}void print( student *ps, int n){ student *pStart;double averAll, averPerson;averAll=average(ps,n);cout<< "总均分: "<< averAll<<endl;for(pStart=ps;pStart<ps+n;pStart++){averPerson= (pStart->score[0]+pStart->score[1]+pStart->score[2])/3 ;if( averPerson< averAll){cout<<"\n个人均分:"<< averPerson<<endl;cout<<"学号: " << setw(5) << pStart->ID;cout<<“出生年: " << pStart->birthday.year;cout<<" 成绩: " << setw(4) << pStart->score[0];}}}double average( student stud[], int n) // 求总均分{double aver=0;for(int i=0; i<n; i++)for(int j=0;j<3;j++)aver += stud[i].score[j];aver /= n*3;return aver;}NODE *create( ) // 创建无序链表{ NODE *p1, *p2, *head;int a;cout<< "Creating a list...\n";p2 = head = initlist( );cout<< "Please input a number(if(-1) stop): ";cin>> a; // 输入第1个数据while( a != -1 ) // 循环输入数据,建立链表{ p1 = (NODE *) malloc(sizeof(NODE));p1->data = a;p2->next = p1;p2 = p1;cout<< "Please input a number(if(-1) stop): ";cin>> a; // 输入下一个数据}p2->next=NULL;return(head); // 返回创建链表的首指针}// 输出链表各结点值,也称为对链表的遍历void print( NODE *head ){NODE *p;让p指向第一个数据结点p=head->next; //if( p!=NULL ){cout<< "Output list: ";while( p!=NULL ){cout<< setw(5) << p->data;p=p->next;}cout<< "\n";}}// 查询结点数据为x的结点,返回指向该结点指针NODE * search( NODE *head, int x ){ NODE *p;p=head->next;while( p!=NULL ){if(p->data == x)return p; // 返回该结点指针p = p->next;}return NULL; // 找不到返回空指针}// 删除链表中值为num的结点,返回值: 链表的首指针NODE * delete_one_node( NODE *head, int num ) {NODE *p, *temp;p=head;while(p->next !=NULL && p->next->data != num) p=p->next;temp=p->next;if(p->next!=NULL){p->next=temp->next;free(temp);cout<< "Delete successfully";}else cout<< "Not found!";return head;}// 释放链表void free_list( NODE *head ) {NODE *p;while(head){p=head;head=head->next;free(p);}}// 插入结点,将s指向的结点插入链表,结果链表保持有序NODE * insert(NODE*head, NODE *s){NODE *p;p=head;while(p->next!=NULL && p->next->data < s->data) p=p->next;s->next=p->next;p->next=s;return head;}// 创建有序链表。
408数据结构算法题的结构体定义

408数据结构算法题的结构体定义408数据结构算法题的结构体定义【导言】在考研中,数据结构与算法是一个重要的科目。
其中,408考试是中国计算机科学与技术学科专业硕士研究生全国联考的一部分,因其考察的题型广泛而知名。
在408数据结构算法题中,掌握合适的结构体定义是解题的基础。
本文将综合讨论和总结408算法题中常见的结构体定义,以助于考生全面、深入地理解问题,为未来的408算法题做好准备。
【1. 结构体的定义与应用】结构体是C语言中一种自定义的数据类型,将不同类型的数据成员组合在一起,形成一个新的数据类型。
在数据结构与算法题中,结构体定义常用于构建复杂的数据结构,如链表、树等。
在408算法题中,结构体的定义要灵活、具体,并能满足问题的需求。
【2. 链表的结构体定义】链表是一种基本的数据结构,由节点组成,每个节点包含一个数据元素和指向下一个节点的指针。
在408算法题中,常见的链表结构体定义如下:```ctypedef struct ListNode {int val; // 数据元素struct ListNode* next; // 指向下一个节点的指针} ListNode;```上述代码中,定义了一个名为ListNode的结构体,包含一个整型数据元素val和一个指向下一个节点的指针next。
该结构体可以用于构建单链表,每个节点存储了一个整数值和指向下一个节点的指针。
【3. 树的结构体定义】树是一种重要的数据结构,由节点组成,每个节点可以有零个或多个子节点。
在408算法题中,常见的树结构体定义如下:```ctypedef struct TreeNode {int val; // 数据元素struct TreeNode* left; // 左子节点struct TreeNode* right; // 右子节点} TreeNode;```上述代码中,定义了一个名为TreeNode的结构体,包含一个整型数据元素val和左右子节点的指针left和right。
919149-C语言程序设计教程——面向计算思维和问题求解-第9章-新

9.2.2 嵌套结构体的定义
结构体成员的类型也可以是结构体,这时形成了 结构体的嵌套。
例如,若将引例中学生的年龄“age”改为出生 日期“birthday”,则由于birthday本身含有“年、 月、日”信息,应该为结构体型date的变量,故结 构体stu的定义如下:
9.2.2 嵌套结构体的定义
语言程序设计教程
面向计算思维和问题求解
第9章 复杂结构数据处理
结构体 结构体变量 结构体数组 结构体指针 结构体与函数 结构体与链表 枚举
9.1.1 问题描述
学生信息中包括学号、姓名、性别、年龄(或者 出生日期)和成绩。其中学号和年龄为整型数据、姓 名为字符串、性别为字符型数据、成绩则是浮点型数 据。各数据项的类型不尽相同,它们的组合才能描述 一个学生的信息。若要管理一批学生的相关信息,要 求实现以下操作应如何实现?
#include <stdio.h> struct stu
{
int num;
char name[20];
char sex;
int age;
/*用年龄描述学生的信息*/
float score;
};
例9-3 源代码(续1)
void main( ) {
struct stu student[5]={ {101,"Li ping",'M', 18,45}, {102,"Zhang ping",'M',18,62.5}, {103,"He fang",'F',18,92.5}, {104,"Cheng ling",'F',18,87}, {105,"Wang ming",'M',18,58} };
C11_结构体

{
char name[9]; char sex[3];
…… } 结构体变量表;
struct date birthday;
} student;
• 结构体类型与结构体变量是两个不同的概念,其区别如 同int类型与int型变量的区别一样。
• 结构体类型中的成员名,可以与程序中的变量同名,它 们代表不同的对象,互不干扰。
{{“000102”,“张三”,“男”,{1980,9,20}}, {“000105”,“李四”,“男”,{1980,8,15}}, {“000112”,“王五”,“女”,{1980,3,10}} };
wangd@
网络工程专业实训中心
示例
main() { int i;
程序运行结果:
wangd@
网络工程专业实训中心
间接定义法
• 间接定义法:先定义结构类型、再定义结构变量
struct std_info { char no[11];
struct 结构类型名 结构变量表;
char name[9];
char sex[3];
struct date birthday;
• 如果定义时没有提供初始值,系统对结构变量的 处理方式与其它变量一样:外部和全局变量,用 0初始化,自动变量不进行初始化,各成员的状 态不确定。
wangd@
网络工程专业实训中心
③结构体变量操作
• 整体赋值: • 同样类型的结构体变量,可整体进行相互赋值
• 结构体成员引用: • 成员运算符: • 两个运算符“.”和“->”; • 点号“.”优先级:与圆括号、下标运算符相 同,在C的运算符中优先级最高 • 结合方式:自左向右
wangd@
网络工程专业实训中心
数据封装—结构体

student1
no name chinese math english
结构体变量的初始化
studentT student1= {“00001”,“张三” ,87,90,77};
定义结构体类型的同时定义变量
struct 结构体类型名{ 字段声明;
} 结构体变量;
struct { 字段声明;
} 结构体变量;
结构体类型的变量
❖ 结构体变量的定义 ❖ 结构体类型的引用 ❖ 指向结构体的指针 ❖ 动态分配结构体的空间
指向记录的指针
❖ 直接定义指针变量 studentT *sp;
❖ 也可以在定义结构体类型的同时定义指向 结构体的指针
struct 结构体类型名{ 字段声明;
} *结构体指针;
通过指针操作记录
❖ 给结构体指针赋值,如: sp = &student1;
❖ 结构体指针的引用:
(*指针).成员 如:(*sp).name 指针->成员 如:sp->name
student1.成员
• ->是所有运算符中优先级最高的
通常程序员习惯使用第二种方法
结构体类型的变量
❖ 结构体变量的定义 ❖ 结构体类型的引用 ❖ 指向结构体的指针 ❖ 动态分配结构体的空间
struct dateT { int month;
int day; int year; };
struct studentT { ...
dateT birthday; };
第8章 数据封装—结构体
❖ 结构体的概述 ❖ 结构体类型的定义 ❖ 结构体类型的变量 ❖ 结构体数组 ❖ 结构体作为函数的参数 ❖ 链表
区别:前者可以继续用结构体类型名定义变量
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
i{ntidnat yn; um;
int cyehaarr;name[20];
};
struct date
struct {stuidnet nmtonth; { int numi;nt day;
char naminet [y2e0a];r;
num num
name namme onth
birthday dbairythdyaeyar
float score[10]; /*10门课程成绩*/
float tcj, acj; /*总成绩, 平均成绩*/
};
• 定义结构体类型,描述下列数据
–(2)个人数据: 包含姓名、性别、年龄、身高、体重、 住址:
struct person
{char name[20]; /*姓名*/
char sex;
(4)如职工信息结构体类型:
struct person{Biblioteka char name[20];
/*姓名*/
char address[40]; /*地址*/
float salary;
/*工资*/
float cost;
/*扣款*/
struct date hiredate; /*聘任日期*/
};
结构体类型可以嵌套定义即一个结 构体类型中的某些成员又是其他结 构体类型
/*C成绩*/
}; /*注:‘;’不能省*/
结构体类型定义描述结构 的组织形式,不分配内存
如考虑10门课程成绩, 加上总成绩与平均成绩, 可作如下定义:
struct student
{int no;
/*学号*/
char name[10]; /*姓名*/
char sex;
/*性别*/
int age;
/*年龄*/
int age;
{ int nusmtr;uct 结构体名 变量名表列;
float score;
char name[20];
char addr[30]; char sex;
};
int age;
struct student stu1,stu2fl;oat score;
char addr[30];
};
STUDENT stu1,stu2;
……………. }变量名表列;
用无名结构体直接定义 变量只能一次
结构体类型声明的说明
• 说明
结构体类型与结构体变量概念不同
• 类型:不分配内存;
变量:分配内存
• 类型:不能赋值、存取、运算; 变量:可以
结构体可嵌套
结构体成员名与程序中变量名可相同,不会混淆
例 {str结例uinc构tstmt体rduo类acnttet型hs;及tu变de量nt的作用域与生存期
结构体嵌套例时逐s级tru引ct用student
stu1.num=10;
例 struct student { int num; { int num; 例 strcuhcatr sntaumde[n2t0];
例
}s{strtuu例1c{,itccifcccisnnslnhhho{hhtitttcstnusaaaraaanahtuatt2rrrtrrruguaicgu;issansnndnermtneccedteu;tean;taxod;sxmmnmdam;rrt;dtaemuo[;eea3y;dn[e[t0;2e2te[]h0}2n0;s];0]t;t;]u;{}1s,cifctsnluhhott1uaaaias,ccifc2nrrtsnlgthhho;ttsasuteuaaaanced1a;2rrrtxospud=g;sas;trr{mrneuei1c[dn;a31;;0xodtm0.1;rfrb](e[,e;“i“3;r[%W0t2h]0da;d],n;a%yLs.im,n%”ossc,nt‘st,uMt%uth1u1’d.,=1s.1a,1.ci…9%sgf2bo,(c8e;fs…iro,r7+t%etur..+h+5e.s1;d==,\=“nsa8D=ty”5usa,.st52Lut;.(ius2a1c))n)o”;r}e; ;(())
(优选)结构体与链表
• 定义结构体类型,描述下列数据
–(1) 学生情况: 包含学生的学号、 姓名、 性别、 年 龄、C语言课程成绩:
struct student
{int no;
/*学号*/
char name[10]; /*姓名*/
char sex;
/*性别*/
int age;
/*年龄*/
float score;
month day year
struc}bt irdtahtdeayb;irthday;
}stu; }stu;
结构体变量的使用
• 由结构体变量名引用其成员
成员(分量)运算符
结构体变量不能整体引用,只能引用变量成员
优先级: 1 结合性:从左向右
引用方式: 结构体变量名.成员名
可以将一个结构体变量赋值给另一个结构体变量
……………. }变量名表列;
• 直接定义结构体变量
一般形式:
例 struct { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
struct {
类型标识符 成员名; 类型标识符 成员名;
/*性别*/
int age;
/*年龄*/
float height;
/*身高*/
float weight;
/*体重*/
char addr[50]; /*住址*/
};
(3)日期结构体类型包括 年、月、日:
struct date {int year; /*年*/ month; /*月*/ day; /*日*/ };
• 定义结构体类型的同时定义结构体变量
一般形式:
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
struct 结构体名 {
类型标识符 成员名; 类型标识符 成员名;
结构体类型变量的定义
• 先定义结构体类型,再定义结构体变量
一般形式:
struct 结构体名
例 struct student
{ 类型标识符 成员名;
{ int num;
类型标识符 成员名;
char nam例e[2#0d];efine STUDE…N…T …s…tr…u.ct student
char sex; STUDENT };