1 / 14

第 10 章、结构体

第 10 章、结构体. 主讲教师:陈荣钦 QQ : 241881888. 为何需要结构体. 一个变量可能有很多的属性,如一个“人”变量,可能有姓名、性别、年龄等属性。 将不同的属性封装成一个新的复杂的类型!. 如定义学生信息: struct Person { char name[12]; // 姓名 char gender; // 性别 int age; // 年龄 }; struct Person p1;. 结构体类型的定义. struct [ 结构体类型名 ] { 数据类型名 1 成员名 1 ;

kelton
Download Presentation

第 10 章、结构体

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第10章、结构体 主讲教师:陈荣钦 QQ:241881888

  2. 为何需要结构体 • 一个变量可能有很多的属性,如一个“人”变量,可能有姓名、性别、年龄等属性。 • 将不同的属性封装成一个新的复杂的类型! 如定义学生信息: struct Person { char name[12]; //姓名 char gender; //性别 int age; //年龄 }; struct Person p1;

  3. 结构体类型的定义 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; //日 };

  4. 结构体变量的定义 • 直接定义法:定义结构体类型的同时定义结构体变量 • 间接定义法:先定义结构类型,再定义结构变量 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; 可省略 类型 变量

  5. 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); 结构体变量的引用 结构体变量名.成员名 结构体指针->成员名 或(*结构体指针).成员名

  6. 逐一赋值 利用已赋值的结构体变量赋值 结构体变量的赋值 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;

  7. 结构体数组 • 结构体数组的定义 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; Struct student stu[100]; 结构体数组的每一个元素都是一个结构体类型的变量。

  8. 引用结构体数组中的元素 引用格式为: 结构体数组名[下标].成员名; 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);

  9. tail head … ^ 数据1 数据2 数据n 线性链表 • 当一组数据元素形成“前后”关系时,称之为线性表 • 顺序表:数组形式在内存中连续存放 特点:插入或删除元素时,需要移动其它数据元素 • 线性链表:数据元素在内存中不需要连续存放,而是通过指针将各数据单元链接起来 特点:插入或删除元素时,不需要移动其它元素 节点 NULL 指针域 头节点 数据域 实际数据链表

  10. 链表节点定义 线性链表中的节点可以用一个结构体类型来定义 struct 节点结构体类型名 { 数据成员定义; struct 节点结构体类型名 *指针变量名; }; struct Node { int data; struct Node *next; }; typedef struct Node NODE;//定义别名

  11. 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; //开始时尾指针指向头节点 }

  12. 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; } 不断调用该函数插入新的节点就可以创建一个完整的链表

  13. 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

  14. 链表的其他操作 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); • } • } 删除列表:不断删除头节点,直到为空

More Related