实验七 结构体与链表
- 格式:docx
- 大小:34.45 KB
- 文档页数:10
实验七结构体与链表
一、目的和要求
1. 掌握结构体类型、结构体变量的基本概念;
2. 掌握结构体指针、结构体数组的应用;
3. 掌握链表的基本概念;
4. 掌握链表的基本操作与应用,包括建立链表、遍历链表、插入结点、删除结点、查找结点等。
二、实验设备及分组
1. Windows XP操作系统;
2. Visual C++6.0语言环境;
3. 每人一台PC机。
三、内容和步骤
(一)验证实验程序
1.用三种方式定义职工、学生、日期等结构体变量。
解:
# include
# include
struct employee //定义职工结构体数据类型
{
int no ; //职工编号
char name[8]; //职工姓名
char addr[40]; //家庭地址
};
struct student //定义学生结构体数据类型
{
int no; //学号
float eng,phy,math,ave; //英语、数学、物理成绩、平均成绩
} stu1,stu2; //定义结构体同时定义结构体变量stu1、stu2
void main ()
{
employee emp1,emp2; //定义employ 类型的结构体变量emp1、emp2。
struct
{
intyear,month,day;
} date1,date2; //直接定义日期结构体类型变量。
emp1.no=100; //赋职工号
strcpy ( , "zhangsa"); //赋职工姓名
strcpy( emp1.addr, "Nanging"); //赋家庭地址
emp2=emp1; //将职工emp1的信息赋给emp2
cout<<"no="<< emp2.no<<'\t' //输出职工信息
<<"name="<< <<'\t'
<< "addr="<< emp2.addr<
stu1.no=101; //输入学号与成绩
stu1.eng=90; //输入成绩 stu1.phy=95;
stu1.math=100;
cout<<"eng="<
<<"phy="<
<<"math="<
date1.year=1999; //输入入学日期
date1.month=09;
date1.day=01;
cout<<"year="<
<<"month="<
<<"day="<
}
2.编写程序完成一名职工的姓名、出生年月、奖惩、基本工资的初始化。从键盘输入奖金金额,输出对应职工的姓名、工龄、奖惩、领取金额等信息。
分析:姓名、出生年月、奖惩、基本工资为不同的数据类型,组成一个有机整体,可以用结构体进行处理,其中出生年月也用结构体来定义。
解:
一个完整的参考程序如下:
#include
struct Date
{
int year;
int month;
}; //A
struct Person
{
char name[20];
Date birth;
char award[20];
float money;
float salary;
}p={"南苯",{1966,10},"五一劳动奖章",896,0};
void main()
{
floatnum;
cout<<<<","<
cout<<",基本工资:"<
cin>>num;
p.salary= p. money+num;
cout<< <<",年龄"<<2003- p. birth.year;
cout<<",应领"<
}
思考:
删去A行的“;”号,运行程序,观察结果,分析原因;
修改程序,将结构体变量的定义放在main()函数内,再运行程序,观察结果,分析原因; 修改程序,将结构体类型定义保存为头文件Person.h,采用#include命令实现本程序的功能。
修改程序输出三名职工的姓名、工龄、奖惩、领取金额等信息。
3.设链表结点数据结构为:
struct node
{
char name[8];
int score;
node *next;
};
编写程序,实现下列链表的基本操作。
(1)建立无序链表。
(2)输出链表上各结点数据。
(3)删除整个链表
(4)删除链表中某个结点数据。
(5)将结点插入到链表指定位置。
(6)建立有序链表
解:
建立链表:
node * Create(void )
{
int score; //定义输入学生成绩的临时变量score
node *head,*pn,*pt; //定义链表头指针、新结点指针、尾指针head、pn、pt。
head=0; //链表头指针赋0,表示链表为空。
cout<<"产生链表,请输入学生成绩与姓名,以-1为结束:"<
cin>>score; //输入学生成绩
while (score!= -1) //成绩为-1时结束输入
{
pn= new node; //动态分配新结点内存空间,并将结点地址赋给pn。
pn->score=score; //将学生成绩输入新结点
cin>>pn->name ; //学生姓名输入新结点
if (head==0) //若链表为空
{
head=pn; //则将新结点地址由pn赋给头指针head与尾指针pt
pt=pn; //使新结点加入到链首
}
else //否则链表非空
{
pt->next=pn; //将新结点地址由pn赋给链尾的next指针与尾指针pt
pt=pn; //使新结点加入到链尾
}
cin>>score; //输入学生成绩
}
pt->next=0; //链尾指针变量赋0
return (head); //返回链表的头指针
}
输出链表:
void Print(const node *head)
{
const node *p;
p=head;
cout<<”输出链表中各结点值:”<
{
cout p=p->next; } } 删除链表: voidDelchain(node * head) { node * p; p=head; //链表头指针赋给p while (head) //当链表非空时删除结点 { head=p->next; //将链表下一个结点指针赋给head delete p; //删除链表第一个结点 p=head; //再将头指针赋给p } } 删除链表上指定值的结点: node * Delete( node *head, char name[]) { node *pc,*pa,*headtemp; headtemp=pc=pa=head; if (head==NULL) //链表为空的情况 { cout<< "链表为空,无结点可删!\t"; return NULL; } if (strcmp(pc->name,name)==0) // 第一个结点为要删除结点的情况 { head=pc->next; //将第二个结点的地址赋给head, //使首结点从链表中分离出来 delete pc; //删除首结点 cout<<"删除了一个结点!\n"; } else //第一个结点不是要删除的结点 { while (strcmp(pc->name,name)) //查找要删除的结点 { pa=pc; //当前结点地址由pc赋给pa pc=pc->next; //pc指向下一个结点 } if (pc==NULL) //若pc为空表示链表中无要删除的结点 cout<< "链表中没有要删除的结点!\n"; else { pa->next=pc->next; //将下结点地址赋给上结点, //使删除结点从链表分离出来 delete pc; //删除指定结点 cout<<"删除一个结点!\n"; } head=headtemp; } return head; //返回链表头指针