结构体定义和使用实验目的(VC++结构体的定义和使用)
本文目录
- VC++结构体的定义和使用
- 实验二:线性表的链式存储结构定义及基本操作 一、实验目的: 掌握线性表的逻辑结构及其链式存储结构的特点
- 实验三 自定义数据类型应用 一、实验目的 1.掌握结构体、共用体、枚举数据类型的定义和初始化;
VC++结构体的定义和使用
1、定义方法
view plain copy typedef struct my1 { int a; float b; }MOD1;
2、使用方法
view plain copy MOD1 mystruct;//或者:my1 mystruct; mystruct.a = 10; mystruct.b = 3.14f;
3、结构体与vector的结合使用
view plain copy #include 《vector》 using namespace std; vector《MOD1》 vec;//或者:vector《 my1 》 vec; vector《MOD1》::iterator vecIter;//或者:vector《 my1 》::iterator vecIter; for (int i=1;i《=10;i++) { mystruct.a = i; mystruct.b = (float)(3.14*i); vec.push_back(mystruct); } CString str; vecIter = vec.begin(); while(vecIter != vec.end()) { str.AppendFormat("a=%d,b=3.14*a=%0.2f\n",(*vecIter).a,(*vecIter).b); vecIter++; } MessageBox(str); vec.clear();
实验二:线性表的链式存储结构定义及基本操作 一、实验目的: 掌握线性表的逻辑结构及其链式存储结构的特点
/********************** 声明部分 **********************/#include《stdio.h》 //输入输出函数头文件#include《stdlib.h》 //内存申请函数头文件#include 《string.h》 //compare#define LIST_INIT_SIZE 10 //定义最初申请的内存的大小#define LIST_INCREMENT 2 //每一次申请内存不足的时候扩展的大小#define OVERFLOW false //异常抛出返回值#define ERROR false //异常抛出返回值#define FALSE false //异常抛出返回值#define TRUE true //程序正确执行抛出返回值 #define INFEASIBLE false //异常抛出返回值#define OK true //程序正确执行抛出返回值 typedef int ElemType; //别名声明,其实int可以用任意的名字代入typedef bool Status; //别名声明/********************** 结构体定义部分 **********************/struct LNode{ElemType data; //数据域LNode *next; //指针域};typedef LNode *LinkList;/********************** 函数块部分 **********************//********************** 构造一个空的线性表 **********************/void InitList(LinkList &L){//初始条件:无L=(LinkList)malloc(sizeof(LNode)); //产生头结点,并使L指向此头结点if(!L) //储存分配失败exit(OVERFLOW);L-》next=NULL; //指针域为空}/***************销毁线性表*****************/void DestroyList(LinkList &L){LinkList q;while(L){q=L-》next;free(L);L=q;}}/**************清空线性表**************/void ClearList(LinkList &L){LinkList q,p;p=L-》next;while(p){q=p-》next;free(p);p=q;}L-》next=NULL;}/*******判断线性表是否空*******/int ListEmpty(LinkList &L){if(L-》next)return 0;elsereturn 1;}/************返回线性表的长度************/int ListLength(LinkList &L){int i=0;LinkList p=L-》next;while(p){i++;p=p-》next;}return i;}/********************** 用e返回L中第i个元素的值 **********************/Status GetElem(LinkList &L,int i,ElemType &e){//初始条件:线性表已经存在,L为带头结点的单链表的头指针int j=1;LinkList p=L-》next;while(p&&j《i){p=p-》next;j++;}if(!p||j》i)return ERROR;e=p-》data;return OK;}/**************查找元素的位置**************/int LocateElem(LinkList &L, ElemType e, int (*compare)(ElemType, ElemType)) { int i=0; LinkList p=L-》next;while(p){ if(compare(p-》data,e))i++;p=p-》next;}if(i《=ListLength(L)) return i;else return 0;} /********************** 在L中第i个位置之前插入新的数据元素e,L的长度加1 **********************/Status ListInsert(LinkList &L,int i,ElemType e)//不改变L{//初始条件:线性表已经存在,1《=i《=ListLength(L)+1int j=0;LinkList p=L,s;while(p&&j《i-1) //寻找第i个节点{p=p-》next;j++;}if(!p||j》i-1) //i小于1或者大于表长return ERROR;s=(LinkList)malloc(sizeof(LNode)); //生成新节点s-》data=e; //插入L中s-》next=p-》next;p-》next=s;return OK;}/********************** 删除L的第i个元素,并用e返回其值,L的长度减1 **********************/Status ListDelete(LinkList &L,int i,ElemType &e){//初始条件:线性表已经存在,1《=i《=ListLength(L)+1int j=0;LinkList p=L,q;while(p-》next&&j《i-1) //寻找第i个结点,并令P指向其前驱{p=p-》next;j++;}if(!p-》next||j》i-1) //删除位置不合理return ERROR;q=p-》next; //删除并释放结点p-》next=q-》next;e=q-》data;free(q);return OK;}/***********用pre_e返回cur_e的前驱************/int PriorElem(LinkList &L,ElemType cur_e,ElemType ⪯_e)//{LinkList q,p=L-》next;while(p-》next){q=p-》next;if(q-》data==cur_e){pre_e=p-》data;return OK;}p=q;}return INFEASIBLE;}/************next_e返回cur_e的后继*************/int NextElem(LinkList &L,ElemType cur_e,ElemType &next_e){LinkList p=L-》next;while(p-》next){if(p-》data==cur_e){next_e=p-》next-》data;return OK;}p=p-》next;} return INFEASIBLE;}/********************************以此对L的每个数据元素调用函数vi()*****************************/void ListTraverse(LinkList L,void (*vi)(ElemType &)){LinkList p=L-》next;while(p!=NULL){vi(p-》data);p=p-》next;}printf("\n");}/*********************输出格式(%d)*********************/ void print(ElemType &c){printf("%d ",c); }/************比较功能函数***************/Status equal(ElemType c1,ElemType c2){if(c1==c2)return TRUE;elsereturn FALSE;}/**************主函数********************/void main(){int i,j,e,k;LinkList La;InitList(La);printf("输入单链表La中的五个元素:");for(i=1;i《=5;i++){scanf("%d",&e);ListInsert(La,i,e);} printf("单链表的长度:%d\n",ListLength(La)); i=ListEmpty(La); printf("La是否空:i=%d (1:是 0:否)\n",i);ClearList(La);printf("清空La后:La=");ListTraverse(La,print); printf("L是否空:i=%d (1:是 0:否)\n",i=ListEmpty(La)); printf("请再次输入单链表La中的五个元素:");for(i=1;i《=5;i++){scanf("%d",&e);ListInsert(La,i,e);}printf("输入要查找的第几个元素:");scanf("%d",&i);printf("查找的元素为:"); GetElem(La,i,e);printf("%d\n",e);printf("La:");ListTraverse(La,print);printf("输入要删除元素的位置:");scanf("%d",&i);ListDelete(La,i,e);printf("La:");ListTraverse(La,print);printf("删除的元素为:%d\n",e); while(1){printf("输入一个链表中的元素:"); scanf("%d",&j); if((k=PriorElem(La,j,e))==INFEASIBLE) printf("此元素无前驱!\n");elsebreak;} printf("此元素的前驱为%d\n",e); while(1){printf("输入一个链表中的元素:"); scanf("%d",&j); if((k=NextElem(La,j,e))==INFEASIBLE) printf("此元素无后继!\n");elsebreak;} printf("此元素的后继为%d\n",e); DestroyList(La); printf("销毁La后: La=%u\n",La);}直接给你十二种操作源码了,采纳呀
实验三 自定义数据类型应用 一、实验目的 1.掌握结构体、共用体、枚举数据类型的定义和初始化;
#include《stdio.h》#include《string.h》#include《stdlib.h》int N; //学生个数enum grade{A,B,C,D,E};//等级枚举union userscore//成绩共用体{float scorevalue;//数值成绩enum grade scale;//等级成绩};struct student//学生结构体{int num;char name;char classn;union userscore English,Maths,Chinese,average;};void Interface(){ printf("* * * 主界面 * * *\n");printf("* 0: 退出系统 *\n");printf("* 1:输入学生成绩 *\n");printf("* 2:计算平均成绩 *\n");printf("* 3:增加学生成绩 *\n");printf("* 4:删除学生成绩 *\n");printf("* 5:修改学生成绩 *\n");printf("* 6:查找学生成绩 *\n");printf("* 7:输出学生成绩 *\n");printf("* * * * * * * * * *\n");}void Input(student stu)//输入{printf("请输入学生个数:");scanf("%d",&N);printf("请输入学号,姓名,班级,英语,数学,语文:\n");for(int i=0;i《N;i++){scanf("%d %s %s %c %f %f",&stu.classn,&stu.Chinese.scorevalue);}}void Output(student stu)//输出{printf("学号\t姓名\t班级\t英语\t数学\t语文\t平均值\n");for(int i=0;i《N;i++){printf("%d\t %s\t %s\t %c\t %5.2f\t %5.2f\t %5.2f\n",stu.classn,stu.average.scorevalue);}}void Average(student stu)//平均值{for(int i=0;i《N;i++){char a=stu.English.scale; switch(a){case ’A’: stu.Chinese.scorevalue)/3.0;break;case ’B’: stu.Chinese.scorevalue)/3.0;break; case ’C’: stu.Chinese.scorevalue)/3.0;break;case ’D’: stu.Chinese.scorevalue)/3.0;break;default: stu.Chinese.scorevalue)/3.0;break;}}} void Insert(student stu)//插入{printf("请输入要插入学生的学号,姓名,班级,英语,数学,语文:\n");scanf("%d %s %s %c %f %f",&stu.classn,&stu.Chinese.scorevalue);N++;//学生个数+1}void Delete(student stu)//删除{int num,t,i=0,j;printf("请输入要删除学生的学号: ");scanf("%d",#);for(i=0;i《N;i++){if(stu.num==num){printf("确定删除该同学吗?");printf(" 1: 是\t 2: 否\n");printf("请输入:");scanf("%d",&t);if(t==1){for(j=i;j《N-1;j++) stu; i--; N--;//学生个数-1 printf("删除成功!\n"); break;}else{ printf("删除失败!\n");break;}}}if(i》=N) printf("该学生不存在!\n");}void Revise(student stu)//修改{int num,i=0;char name;char classn;union userscore English,Maths,Chinese,average;printf("请输入要修改学生的学号:\n");scanf("%d",#);printf("请输入修改后的姓名,班级,英语,数学,语文:\n");for(i=0;i《N;i++){if(stu.num==num){scanf("%s %s %c %f %f",&name,&classn,&English.scale,&Maths.scorevalue,&Chinese.scorevalue);//stu.num=num;strcpy(stu.name,name);strcpy(stu.classn,classn);stu.English.scale=English.scale;stu.Maths.scorevalue=Maths.scorevalue;stu.Chinese.scorevalue=Chinese.scorevalue;printf("修改成功!\n");break;}}if(i》=N)printf("该学生不存在!\n");} void Search(student stu)//查找{int num,i=0,j;printf("请输入要查找学生的学号:\n");scanf("%d",#);for(j=0;j《N;j++){if(stu.num!=num){ i++;}else{ printf("查找成功!\n");printf("学号\t姓名\t班级\t英语\t数学\t语文\n"); printf("%d\t %s\t %s\t %c\t %5.2f\t %5.2f\n",stu.classn, stu.Chinese.scorevalue);break;}} if(i》=N)printf("该学生不存在!\n");}int main(){ struct student stu; int flag;//flag用于接收用户输入的数字; while(1) { Interface();//显示系统的菜单界面; printf("请选择数字0~7: "); scanf("%d",&flag); switch(flag) //switch根据flag的值来调用相应的函数; { case 0: printf("退出系统!\n");exit(0); break;//输入0,则退出系统; case 1: Input(stu); printf("输入成功!\n"); break; case 2: printf("计算成功!\n"); Average(stu); Output(stu); break; case 3: Insert(stu); printf("插入后:\n"); Output(stu); break; case 4: Delete(stu); break; case 5: Revise(stu); break; case 6: Search(stu); break; case 7: printf("输出成功:\n"); Average(stu); Output(stu); break; default: printf("输入有误!\n");//输入错误,输入数值必须为0~7 } }return 0;}