结构体的有关例题 ⒈结构体数组元素的输入和输出 #include<iostream.h> #define N 4 void main() { struct student {int no; char name[16]; float score;} ; struct student st[N]; int i; cout<<"请输入"<<N<<" 个学生的学号、姓名和成绩"<<endl; for (i=0;i<N;i++) cin>>st[i].no>>st[i].name>>st[i].score; cout<<"\n\t NO.\tName\tScroe\n"; cout<<"\t---------------------\n"; for (i=0;i<N;i++) cout<<'\t'<<st[i].no<<'\t'<<st[i].name<<'\t'<<st[i].score<<endl; } 当输入: 9911 LiMing 87 9912 liuLiang 78 9913 WangXing 90 9914 ZhaoQin 67 程序运行结果如下: NO. Name Score 9911 LiMing 87 9912 liuLiang 78 9913 WangXing 90 9914 ZhaoQin 67 2 将上例输出语句中结构体数组,改用结构体指针变量。 #include<iostream.h> #define N 4 void main() { struct student {int no; char name[16]; float score; } ; struct student st[N], *p; int i; cout<<"请输入"<<N<<" 个学生的学号、姓名和成绩"<<endl; for (i=0;i<N;i++) cin>>st[i].no>>st[i].name>>st[i].score; cout<<"\n\t NO.\tName\tScroe\n"; cout<<"\t---------------------\n"; p=st; //指针取结构数组首地址 for (i=0;i<N;i++) { cout<<'\t'<<p->no<<'\t'<<p->name<<'\t'<<p->score<<endl; p++; //指针移到下一个结构体元素 } } 3 结构体传递参数示例 #include<iostream.h> #define N 4 struct record { char name[16]; int math; int eng; float ave; } st[N]={{"Sun",78,91,0},{"Zhang",60,76,0},{"Qian",88,95,0},{"Fang",60,70,0}}; void show(record s) { s.ave=(s.math+s.eng)/2.0; cout<<s.name<<'\t'<<s.math<<'\t'<<s.eng<<'\t'<<s.ave<<endl; } void main() { int i; cout<<"姓名"<<'\t'<<"数学"<<'\t'<<"英语"<<'\t'<<"平均分"<<endl; cout<<"------------------------------\n"; for (i=0;i<N;i++) show(st[i]); } 4 返回结构体值的示例 #include<iostream.h> #define N 4 struct record { char name[16]; int math; int eng; float ave; } ; record student[N]; record getrecord() { record temp; cin>>temp.name>>temp.math>>temp.eng; temp.ave=(temp.math+temp.eng)/2.0; return temp; //返回结构体值 } void show(record s) { cout<<s.name<<'\t'<<s.math<<'\t'<<s.eng<<'\t'<<s.ave<<endl; } void main() { int i; cout<<"请输入姓名,数学成绩,英语成绩"<<endl; for (i=0;i<N;i++) student[i]=getrecord(); cout<<"姓名"<<'\t'<<"数学"<<'\t'<<"英语"<<'\t'<<"平均分"<<endl; for(i=0;i<N;i++) show(student[i]); } 运行时当你输入: Sun 78 91 Zhang 60 76 Qian 88 95 Fang 60 70 程序运行结果如下: 姓名 数学 英语 平均分 Sun 78 91 84.5 Zhang 60 76 68 Qian 88 95 91.5 Fang 60 70 65 5 生成有N学生记录的单链表 #include<iostream.h> #define N 4 struct student //定义链表结点类型 { int no; char name[16]; float score; student *next; } ; struct student *head,*s; void create() //生成单链表 { int i; struct student *rear; head=NULL; cout<<"请输入"<<N<<" 个学生的学号、姓名和成绩"<<endl; for (i=0;i<N;i++) { s=new student; //申请结构点空间 cin>>s->no>>s->name>>s->score; //读入学生数据 if(head==NULL) head=s; //将新插入结点为第一结点 else rear->next=s; //其余结点插入在表尾指针rear后 s->next=NULL; rear=s; //移动尾指针 } } void show() //显示单链表 { struct student *p; cout<<"\n\t学号\t姓名\t分数\n"; cout<<"\t---------------------\n"; p=head; //指针取链表首地址 while(p) { cout<<'\t'<<p->no<<'\t'<<p->name<<'\t'<<p->score<<endl; p=p->next; //指针移到下一个结构体元素 } } void main() { create(); //生成单表 show(); //显示单链表元素 } 6在单链表中插入一个结点 void inslink(student *st) //插入结点 { struct student *p,*q; if (head==NULL) //head是全局变量 { head=st; // 表示表头 st->next=NULL; //表尾为空指针 return; } p=head; if (p->score>st->score) //在第一个结点前插入 { st->next=p; p=st; return; } while(p && p->score<st->score) {q=p; p=p->next; //取下一个结点地址 } st->next=q->next; //插入结点 q->next=st; return; } void main() { struct student *st; create(); //调生成单表程序 show(); //调显示单链表程序 st=new student; cout<<"输入插入学号,姓名,分数"; cin>>st->no>>st->name>>st->score; inslink(st); //调插入程序 show(); } 注意:本插入函数是对学生成绩按由小到大插入,所以输入学生成绩必须的序。 当输入下数据时: 1 WU 60 3 CHEN 70 5 WANG 80 7 LI 90 插入值为 4 JIANG 76 程序输出为: 学号 姓名 分数 --------------------- 1 WU 60 3 CHEN 70 4 JIANG 76 5 WANG 80 7 LI 90 7 在单链表中删除一个结点。 void dellink(int n) { student *p,*q;int i=0; if(!head) { cout<<"此单链表为空表!"<<endl; return; } p=head; if(p->no==n) // 删除结点是第一个结点 { head=head->next; delete p; cout<<"学号是"<<n<<"结点已经删除"<<endl; return; } while(p && p->no!=n) //取下一个结点地址 { q=p; p=p->next; } if(p) //找到删除结点 { q->next=p->next; delete p; cout<<"学号是"<<n<<"结点已经删除"<<endl; } else cout<<"学号是"<<n<<"结点没有找到"<<endl; return; } void main() { create(); //生成单表 show(); //显示单链表 dellink(9901); show(); }