结构体与指针
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指向结构体的指针
struct Student { char name[20]; int age; int sex; }; 编写一个函数change(),实现两个Student类型的变量的 内容交换
指向结构体的指针
此题中,函数的形参若定义为: void change(struct Student s1, struct Student s2) 则形参s1和s2将接收Student类型的实参,是实参的拷贝, 对s1和s2进行内容交换,对实参,不会产生任何影响。 因此,该函的形参应该定义为: void change(struct Student *p1, struct Student *p2) 形参p1和p2是Student类型的指针,将接收Student类型 变量的地址,能够通过p1和p2对实参所指向的Student类 型变量进行修改。
指向结构体的指针
void addStudent(struct Student *head,struct Student s) { s.next=null; if(head==null) { head=&s; return; } if(s.age>head->age){ s.next=head; head=&s; return; } struct Student *p=head; while(p->next!=null) { if(s.age>p->next->age){ s.next=p->next; p->next=&s; return; } p=p->next; } p->next=&s;
int main() { int n,i,mini; float x,y,mint,t; struct student student1={"wangyan",23,0}; struct student student2={"zhangsan",24,1};
printf("交换前的信息:\n"); printf("%s %d %d\n",student1.name,student1.age,student1.sex); printf("%s %d %d\n",student2.name,student2.age,student2.sex); printf("交换后的信息:\n"); change(&student1,&student2); printf("%s %d %d\n",student1.name,student1.age,student1.sex); printf("%s %d %d\n",student2.name,student2.age,student2.sex); return 0; }
void change(struct student *s1,struct student *s2) { struct student temp; strcpy(temp.name,s1->name); strcpy(s1->name,s2->name); strcpy(s2->name,temp.name); temp.age=s1->age; s1->age=s2->age; s2->age=temp.age;
链表输出函数
void print(strBiblioteka Baiduct student*head) { struct student *p; p=head; if(head!=NULL) do { printf("%s %d\n",p->name,p->age); p=p->next; }while(p!=NULL); }
指向结构体的指针
定义结构体的指针
struct 结构体名 *指针名; 如: struct Student { 用指针访问结构体的成员 char name[10]; (*p).name int age; (*p).age }; struct Student s; struct Student *p; p=&s;
一群冒险者,他们的名字分别为(a,b,c,d……)。他们步 入了一片被迷雾覆盖的山谷,为了防止走失,他们按名字 顺序手拉手围成一个圈,在原地等待太阳升起照射进山谷 驱散迷雾。然而森林中的恶魔却已经盯上了他们。恶魔按 照字母的顺序,从a开始数数,数到固定的数,就杀死对 应的人,然后被杀死的人旁边的人,再次拉起手,围成一 个圈,恶魔从下一个人开始继续数数,继续杀人。直到只 剩下一个人的时候,恶魔才放唯一幸存的人,离开森林。 请编写一个程序根据冒险者的人数(人数小于26), 和恶魔数的数,输出最后幸存的那个人的名字
指向结构体的指针
//访问每一个节点,若出现节点应该排在s的后面,则插入s。结束 struct Student *p; p=head; while(p->next!=null) { if(s.age>p->next->age) { s.next=p->next; p->next=&s; return; } p=p->next; } //最终将s放在链表末尾 p->next=&s;
指向结构体的指针
建立链表(向链表中添加节点)的函数: void addStudent(struct Student *head,struct Student s) { s.next=null; //先将s的next初始化一下 //判断链表头节点是否为空,若为空,链表头指向s,即s作 为头结点,结束 //判断链表头结点是否应该排在s的后面,是,则s插入到头 结点之前,结束 //访问每一个节点,若出现节点应该排在s的后面,则插入s。 结束 //最终将s放在链表末尾 }
Name: Jake Age: 13 Next:
Name: Rose Age: 10 Next:
指向结构体的指针
建立链表所需的东西: •定义链表中每个节点所属的结构体类型,此结构体类型中应 当有指向下一节点的指针 struct Student { char name[20]; int age; struct Student *next; }; •记录链表头节点的指针 struct Student *head;
void main() {struct student a,b,c,* head,d; strcpy(a.name,"zhangsan1"); strcpy(b.name,"zhangsan2"); strcpy(c.name,"zhangsan3"); a.age=19; b.age=18; c.age=16; head=&a; a.next=&b; b.next=&c; c.next=NULL; print(head); removestudent(head,18); scanf("%s%d",d.name,&d.age); addstudent(head,d); }
输入数据格式: 输入数据有多行,其中第一行包含一个正整数n,代表 接下来有n组的数据输入。每组的数据只有一行,其中 包含两个正整数,分别为冒险者的人数,和恶魔要数的 数。 输出数据格式: 对应每一组数据的输入,输出幸存的人的名字。每个结 果输出在一行中。 输入范例: 2 5 4 6 8 输出范例: a c
struct Student { char name[20]; int age; struct Student *next; //Student类型的指针,指向下一个学生 };
指向结构体的指针
建立链表的结构:
Name: Jom Age: 20 Next:
Name: Lily Age: 14 Next:
运行结果:
指向结构体的指针
将一些有序的数据放在数组中时,当发生数据增加和删除 时,数组需要大量的移动操作,代价很高。
单项链表: 一个节点通过指针连接着下一个节点。节点的插入和删除 只需要修改若干指针就可以,代价比数组小得多。 如:定义结构体用于建立一个学生数据的链表,链表中的学生按 照年龄顺序存放。
指向结构体的指针
//判断链表头节点是否为空,若为空,链表头指向s,即s作为 头结点,结束 if(head==null) {
head=&s; return;
}
指向结构体的指针
//判断链表头结点是否应该排在s的后面,是,则s插入到头结 点之前,结束 if(s.age>head->age) { s.next=head; head=&s; return; }
temp.sex=s1->sex; s1->sex=s2->sex; s2->sex=temp.sex; }
指向结构体的指针
具体函数实现2,直接交换 void change(struct student *s1, struct student *s2) { struct student temp; temp=*s1; *s1=*s2; *s2=temp; }
void addstudent(struct student *head,struct student s) { s.next=NULL; if(head==NULL) { head=&s; print(head); return; } if(s.age>head->age) { s.next=head; head=&s; print(head);
void removestudent(struct student * head ,int age) { struct student * p=head; if(head->age==age) { head=p->next; return; } while(p->next!=NULL) { if(p->age==age) { p->next =p->next->next; return; } p=p->next; }
指向结构体的指针
用指针直接访问结构体的成员可以用“->”符号 如上题中可以这样访问: p->name p->age 以下三条语句是等价的: s.age=1; (*p).age=1; p->age=1; 以下是错误的: p.name=“Jom”; p.age=5; s->name=“Jake”; s->age=10; p是一个指针,不是结构体变量,没有“.”操作 S是一个结构体变量,不是指针,没有“->”操作