- 实验作业
1.调试分析课本每一个例题,有可能的话更改成2-3个方法的新程序;
2.编程实现课本每一个编程习题。
3. 建立一个链表,每一个学号包括学号、姓名、性别、成绩,输入一个成绩,如果在链表中节点成绩等入输入的成绩,则将其删除。
4.有两个链表,结点数据信息相同。将其合并成一个链表,节点数据不能重复。
一、课本例题
1
/** 结构体赋值输出 **/
#include<iostream>
using namespace std;
struct date
{
int month;
int day;
int year;
};
struct student
{
int num;
char name[20];
struct date birthday;
char addr[30];
};
int main()
{
student stu[2]={{1002,"Mike",11,18,2012,"地址1"},{1003,"Piter",1,28,2013,"地址2"}};
student *s=stu;
for(int i=0;i<2;i++)
cout<<stu[i].num<<" "<<stu[i].name<<" "<<stu[i].addr<<endl;
for(;s<stu+2;s++)
cout<<(&stu[i])<<s->num<<"\t"<<s->name<<"\t"<<s->addr<<endl;
return 0;
}
2
/** 链表综合应用 **/
#include <iostream>
using namespace std;
int n=0;
struct student
{
int num;
float score;
student *next;
};
student *creat()
{
student *head,*p1,*p2;
head=NULL;
p1=new(student);
p2=p1;
cout<<"请输入学生学号和成绩,当学号为0时,停止输入"<<endl;
cin>>p1->num>>p1->score;
while(p1->num!=0)
{
n++;
if(n==1)
head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=new(student);
cin>>p1->num>>p1->score;
}
delete p1;
p2->next=NULL;
return head;
}
void print(student *head)
{
student *p;
p=head;
if(p==NULL) return;
do
{
cout<<p->num<<" "<<p->score<<endl;
p=p->next;
}while(p!=NULL);
}
student *del(student *head,int num)
{
student *p1,*p2;
if(head==NULL)
{
cout<<"list null"<<endl;
return head;
}
p1=head;
while(num!=p1->num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->num)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
cout<<"delete:"<<num<<endl;
n--;
}
else
cout<<num<<"not been found!"<<endl;
return head;
}
student *insert(student *head,student *stud)
{
student *p0,*p1,*p2;
p1=head;
p0=stud;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
while((p0->num>p1->num)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->num<=p1->num)
{
if(head==p1)
head=p0;
else
p2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
n++;
return head;
}
int main()
{
student *head=creat();
cout<<"新建的链表为:"<<endl
<<"学号\t成绩"<<endl;
print(head);
int num;
cout<<"请输入要删除的学号:";
cin>>num;
head=del(head,num);
cout<<"目前链表为:"<<endl;
print(head);
student *pt=new student;
cout<<"请输入要插入学生的学号和成绩:";
cin>>pt->num>>pt->score;
head= insert(head,pt);
cout<<"目前链表为:"<<endl;
print(head);
return 0;
}
二、课后习题
<p>/** 1和2 **/
#include<iostream>
using namespace std;</p><p>struct ts
{
int chinese;
int english;
int math;
};</p><p>struct student
{
int num;
char name[10];
struct ts score;
};</p><p>void print(student *s)
{
cout<<s->num<<"\t"<<s->name<<"\t"
<<s->score.chinese<<"\t"
<<s->score.english<<"\t"
<<s->score.math<<"\t"<<endl;</p><p>}</p><p>int main()
{
student stu[3]={{20121163,"Mike",87,84,83},{20121164,"Piter",83,85,93},{20121163,"Jack",75,84,63}};
cout<<" "<<"学号"<<"\t\t"<<"姓名"<<"\t"<<"科目1"<<"\t"<<"科目2"<<"\t"<<"科目3"<<endl;
for(int j=0;j<3;j++)
{
print(&stu[j]);
}</p><p> return 0;
}
</p>
<p>/** 4 **/
#include<iostream>
using namespace std;</p><p>struct ts
{
float basic;
float post;
};</p><p>struct employee
{
int num;
char name[10];
struct ts salary;
};</p><p>void print(employee *s)
{
cout<<s->num<<"\t"<<s->name<<"\t"
<<s->salary.basic<<"\t\t"
<<s->salary.post<<endl;
}</p><p>int main()
{
employee emp[10]={{0,"Mike",0,0},{0,"Jake",0,0},{0,"Hellen",0,0},{0,"Gate",0,0},
{0,"Carry",0,0},{0,"Auto",0,0},{0,"Dave",0,0},{0,"Col",0,0},{0,"Dike",0,0},{0,"Marry",0,0},};
for(int i=0;i<10;i++)
{ emp[i].num=i+1000;
emp[i].salary.basic=8000+(i*20)/29+49*i;
emp[i].salary.post=1900-(i*70);
};
cout<<"编号"<<"\t"<<"姓名"<<"\t"<<"基本工资"<<"\t"<<"职务工资"<<endl;
for(i=0;i<10;i++)
{
print(&emp[i]);
};
return 0;
}</p>
/** 8 **/
#include <iostream>
using namespace std;
int n=0;
struct student
{
int num;
char name[20];
float score;
int age;
student *next;
};
student *creat()
{
student *head,*p1,*p2;
head=NULL;
p1=new(student);
p2=p1;
cout<<"请输入学生学号,姓名,成绩和年龄,当学号为0时,停止输入"<<endl;
cin>>p1->num>>p1->name>>p1->score>>p1->age;
while(p1->num!=0)
{
n++;
if(n==1)
head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=new(student);
cin>>p1->num>>p1->name>>p1->score>>p1->age;
}
delete p1;
p2->next=NULL;
return head;
}
void print(student *head)
{
student *p;
p=head;
if(p==NULL) return;
do
{
cout<<p->num<<" "<<p->name<<" "
<<p->score<<" "<<p->age<<endl;
p=p->next;
}while(p!=NULL);
}
student *del(student *head,int a)
{
student *p1,*p2;
if(head==NULL)
{
cout<<"list null"<<endl;
return head;
}
p1=head;
while(a!=p1->age&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(a==p1->age)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
cout<<"delete:"<<a<<endl;
n--;
}
else
cout<<a<<"not been found!"<<endl;
return head;
}
int main()
{
student *head=creat();
cout<<"新建的链表为:"<<endl
<<"学号\t\t年龄"<<endl;
print(head);
float a;
cout<<"请输入要删除的年龄:";
cin>>a;
head=del(head,a);
cout<<"目前链表为:"<<endl
<<"学号\t\t年龄"<<endl;
print(head);
return 0;
}
/** 10 **/
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
struct Grade
{
int s1,s2,s3;
float aver;
};
struct StudentRec
{
int num;
string name;
Grade s;
};
typedef struct StudentRec STUDENT;
void inputstu(STUDENT stu[],int);
void sort(STUDENT stu[],int);
int main()
{
STUDENT stu[10];
int i;
inputstu(stu,10);
sort(stu,10);
cout<<"成绩按照平均值排序:"<<endl;
cout<<"学号 姓名 科目1 科目2 科目3 平均分"<<endl;
for(i=0;i<10;i++)
{
cout<<stu[i].num<<'\t'<<stu[i].name<<'\t'
<<stu[i].s.s1<<'\t'<<stu[i].s.s2<<'\t'
<<stu[i].s.s3<<'\t'<<'\t'<<stu[i].s.aver<<endl;
}
return 0;
}
void inputstu(STUDENT stu[],int n)
{
cout<<"请输入"<<n
<<"个学生的学号、姓名以及科目1、科目2、科目3三门课程的成绩"<<endl;
cout<<"学号 姓名 科目1 科目2 科目3"<<endl;
for(int i=0;i<n;i++)
{
cin>>stu[i].num>>stu[i].name
>>stu[i].s.s1>>stu[i].s.s2>>stu[i].s.s3;
stu[i].s.aver=(stu[i].s.s1+stu[i].s.s2+stu[i].s.s3)/3;
}
}
void sort(STUDENT stu[],int n)
{
STUDENT newstu;
for(int i=0;i<n-1;i++)
for(int j=0;j<n-1-i;j++)
{
if(stu[j].s.aver>stu[j+1].s.aver)
{
newstu=stu[j];
stu[j]=stu[j+1];
stu[j+1]=newstu;
}
}
}
三、链表
/** 删除成绩 **/
#include <iostream>
using namespace std;
int n=0;
struct student
{
int num;
char name[20];
char sex;
float score;
student *next;
};
student *creat()
{
student *head,*p1,*p2;
head=NULL;
p1=new(student);
p2=p1;
cout<<"请输入学生学号,姓名,性别和成绩,当学号为0时,停止输入"<<endl;
cin>>p1->num>>p1->name>>p1->sex>>p1->score;
while(p1->num!=0)
{
n++;
if(n==1)
head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=new(student);
cin>>p1->num>>p1->name>>p1->sex>>p1->score;
}
delete p1;
p2->next=NULL;
return head;
}
void print(student *head)
{
student *p;
p=head;
if(p==NULL) return;
do
{
cout<<p->num<<" "<<p->name<<" "
<<p->sex<<" "<<p->score<<endl;
p=p->next;
}while(p!=NULL);
}
student *del(student *head,float s)
{
student *p1,*p2;
if(head==NULL)
{
cout<<"list null"<<endl;
return head;
}
p1=head;
while(s!=p1->score&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(s==p1->score)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
cout<<"delete:"<<s<<endl;
n--;
}
else
cout<<s<<"not been found!"<<endl;
return head;
}
int main()
{
student *head=creat();
cout<<"新建的链表为:"<<endl
<<"学号\t成绩"<<endl;
print(head);
float s;
cout<<"请输入要删除的成绩:";
cin>>s;
head=del(head,s);
cout<<"目前链表为:"<<endl;
print(head);
return 0;
}
四、合并相同结构链表
<p>#include <iostream>
using namespace std;</p><p>int n=0;</p><p>
struct student
{
int num;
float score;
student *next;
};</p><p>
student *creat(int &t)
{
student *head,*p1,*p2;
head=NULL;
p1=new(student);
p2=p1;
cout<<"请输入学生学号和成绩,当学号为0时,停止输入"<<endl;
cin>>p1->num>>p1->score;
while(p1->num!=0)
{
t++;
if(t==1)
head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=new(student);
cin>>p1->num>>p1->score;
}
delete p1;
p2->next=NULL;</p><p> return head;
}</p><p> </p><p>void print(student *head)
{
student *p;
p=head;
if(p==NULL) return;
do
{
cout<<p->num<<" "<<p->score<<endl;
p=p->next;
}while(p!=NULL);
}</p><p>student *link(student *head1,student *head2)
{
student *p1;
if(head1==NULL||head2==NULL)
return NULL;
p1=head1;
do
{
p1=p1->next;
}while(p1->next!=NULL);
p1->next=head2;
return head1;</p><p>}</p><p>
int main()
{
int t1=0,t2=0;
student *head1=creat(t1);
cout<<"新建的链表1为:"<<endl
<<"学号\t成绩"<<endl;
print(head1);</p><p> student *head2=creat(t2);
cout<<"新建的链表2为:"<<endl
<<"学号\t成绩"<<endl;
print(head2);
student *newhead=link(head1,head2);
cout<<"新合成的链表为:"<<endl;
print(newhead);
</p><p> return 0;
}
</p>