140 likes | 345 Views
第 10 章、结构体. 主讲教师:陈荣钦 QQ : 241881888. 为何需要结构体. 一个变量可能有很多的属性,如一个“人”变量,可能有姓名、性别、年龄等属性。 将不同的属性封装成一个新的复杂的类型!. 如定义学生信息: struct Person { char name[12]; // 姓名 char gender; // 性别 int age; // 年龄 }; struct Person p1;. 结构体类型的定义. struct [ 结构体类型名 ] { 数据类型名 1 成员名 1 ;
E N D
第10章、结构体 主讲教师:陈荣钦 QQ:241881888
为何需要结构体 • 一个变量可能有很多的属性,如一个“人”变量,可能有姓名、性别、年龄等属性。 • 将不同的属性封装成一个新的复杂的类型! 如定义学生信息: struct Person { char name[12]; //姓名 char gender; //性别 int age; //年龄 }; struct Person p1;
结构体类型的定义 struct [结构体类型名] { 数据类型名1 成员名1; 数据类型名2 成员名2; … … 数据类型名n 成员名n; }; struct是关键字, 不能省略 struct Student_Info { char no[9]; //学号 char name[20]; //姓名 char sex; //性别 unsigned int age; //年龄 unsigned int classno; //班级 float grade; //成绩 }; 以分号;结尾 struct Date { int year; //年 int month; //月 int day; //日 };
结构体变量的定义 • 直接定义法:定义结构体类型的同时定义结构体变量 • 间接定义法:先定义结构类型,再定义结构变量 struct Student_Info { char no[9]; char name[20]; char sex; unsigned int age; unsigned int classno; float grade; } student; struct Student_Info { char no[9]; char name[20]; char sex; unsigned int age; unsigned int classno; float grade; }; struct Student_Info student; 可省略 类型 变量
struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; } stu, *pstu = &stu; strcpy (stu.name, "zhangMing"); stu.score = 80; pstu->score += 10; printf ("%s %f", stu.name, (*pstu).score); 结构体变量的引用 结构体变量名.成员名 结构体指针->成员名 或(*结构体指针).成员名
逐一赋值 利用已赋值的结构体变量赋值 结构体变量的赋值 struct Student_Info stu; strcpy (stu.no, "20020306"); strcpy (stu.name, "ZhangMing"); stu.sex = 'M'; stu.age = 18; stu.classno = 1; stu.grade = 90; struct Student_Info stu1; stu1 = stu;
结构体数组 • 结构体数组的定义 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; Struct student stu[100]; 结构体数组的每一个元素都是一个结构体类型的变量。
引用结构体数组中的元素 引用格式为: 结构体数组名[下标].成员名; struct Student_Info { char no[9]; char name[20]; char sex; unsigned int age; unsigned int classno; float grade; } stu[10]; strcpy (stu[0].name, "WangFei"); stu[1].grade++; printf ("%s", stu[0].name);
tail head … ^ 数据1 数据2 数据n 线性链表 • 当一组数据元素形成“前后”关系时,称之为线性表 • 顺序表:数组形式在内存中连续存放 特点:插入或删除元素时,需要移动其它数据元素 • 线性链表:数据元素在内存中不需要连续存放,而是通过指针将各数据单元链接起来 特点:插入或删除元素时,不需要移动其它元素 节点 NULL 指针域 头节点 数据域 实际数据链表
链表节点定义 线性链表中的节点可以用一个结构体类型来定义 struct 节点结构体类型名 { 数据成员定义; struct 节点结构体类型名 *指针变量名; }; struct Node { int data; struct Node *next; }; typedef struct Node NODE;//定义别名
tail head 链表的创建操作 创建一个头节点,让头指针head和尾指针tail都指向该节点,并设置该节点的指针域为NULL(链尾标志); ∧ NODE *Create_LinkList ( ) //创建链表 { NODE *head, *tail, *pnew; head = (NODE *)malloc (sizeof(NODE));//创建头节点 if (head == NULL) //创建失败,则返回 { printf (“内存分配失败!\n"); return NULL; } head->next = NULL; //头节点的指针域置NULL tail = head; //开始时尾指针指向头节点 }
head ∧ 90 p p 78 65 70 65 pnew p 插入元素 void Insert_LinkList(NODE *p, NODE *pnew) { //p指向的节点后添加一个新节点pnew pnew->next = p->next ; p->next = pnew; } 不断调用该函数插入新的节点就可以创建一个完整的链表
head p p 删除链表节点 void Delete_LinkList(NODE *p) { //删除p的后面一个节点 if(p->Next==NULL)//不存在则返回 return; NODE *q = p->next; } q = p->next; //q指向待删除的节点i p->next = q->next ; //删除节点i free(q); //释放节点i的内存单元 ∧ q 90 78 65 70 2 3 4 1 0
链表的其他操作 void Display_LinkList(NODE *head) { for (NODE *p = head->next; p != NULL; p = p->next) printf ("%d ", p->score); printf ("\n"); } 遍历输出:从头节点开始不断next • void Free_LinkList(NODE *head){ • NODE *p; • while (head!=NULL) { • p= head; • head = head->next; • free (p); • } • } 删除列表:不断删除头节点,直到为空