Description
编写一个函数creatlink,用来建立一个动态链表。(包含学号和成绩)
编写一个函数printlink,用来输出一个链表。
编写一个函数dellink,用来删除动态链表中一个指定的结点(由实参指定某一学号,表示要删除该学生结点)。
编写一个函数insertlink,用来向动态链表插入一个结点。
编写一个函数freelink,用来释放一个动态链表。
Input
输入多个学生的学号和成绩,建立动态链表,以0 0 结束
输入学号,删除链表中的对应结点
插入两个链表结点
Output
输出的链表
#include<iostream>
#include<iomanip>
using namespace std;
/********************************************************/
struct student
{
long num;
float score;
student *next;
};
/********************************************************/
student *creatlink(void)//建立链表
{
student *st=new student,*pend,*head;//申请内存空间
cin>>st->num>>st->score;//输入学生信息
head=NULL;
while(st->num!=0)//当输入0 0时结束
{
if(head==NULL)
head=st;//head起个头
else
pend->next=st;//指向下一个结点的地址
pend=st;
st=new student;//重新申请内存地址
cin>>st->num>>st->score;
}
pend->next=NULL;
delete st;//把多申请的那个释放
return head;//返回首地址,千万别改
}
/********************************************************/
void printlink(student *head)//链表输出
{
while(head!=NULL)
{
cout<<head->num<<" "<<head->score<<endl;
head=head->next;
}
}
/********************************************************/
student *dellink(student *head,long del)//删除
{
student *p1,*p2=head;
while(p2!=NULL)
{
if(del==p2->num)
{
p1->next=p2->next;
//上一个的next指向被删除结点的下一个地址
//也就是上一个的next的值换成下一个next的值
break;
}
else
{
p1=p2;
p2=p2->next;
}
}
return head;
}
/********************************************************/
student *insertlink(student *head,student *std)//插入
{
student *p2=head,*p1,*st=new student;//一定要申请新的内存地址
st->num=std->num;//把值赋给st就可以了,别赋地址
st->score=std->score;
st->next=std->next;
while(p2->next!=NULL)
{
if(p2->num<st->num&&st->num<p2->next->num)
//简单的排一下序
{
p1=p2->next;
p2->next=st;
st->next=p1;
return head;
//插进去了就退出吧
}
else
p2=p2->next;
}
if(p2->next==NULL)//当在最后插入结点时
{
p2->next=st;
st->next=NULL;//别忘了
}
return head;
}
/********************************************************/
void freelink(student *head)//释放链表
{
student *p1=head,*p2;
while(p1!=NULL)//排着释放
{
p2=p1->next;
delete p1;
p1=p2;
}
}
/********************************************************/
int main()
{
student *creatlink(void);
student *dellink(student *,long);
student *insertlink(student *,student *);
void printlink(student *);
void freelink(student *);
student *head,stu;
long del_num;
head=creatlink();
cin>>del_num;
head=dellink(head,del_num);
cin>>stu.num>>stu.score;
head=insertlink(head,&stu);
cin>>stu.num>>stu.score;
head=insertlink(head,&stu);
cout<<setiosflags(ios::fixed);
cout<<setprecision(2);
printlink(head);
freelink(head);
return 0;
}
/*
Sample Input
1001 100
1002 95
1005 90
1008 76
0 0
1005
1006 98
1009 99
Sample Output
1001 100.00
1002 95.00
1006 98.00
1008 76.00
1009 99.00
*/