实验七 结构体与链表

  • 格式: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; //返回链表头指针