链表建立,插入,删除,释放,输出

Description

编写一个函数creatlink,用来建立一个动态链表。(包含学号和成绩)
编写一个函数printlink,用来输出一个链表。
编写一个函数dellink,用来删除动态链表中一个指定的结点(由实参指定某一学号,表示要删除该学生结点)。
编写一个函数insertlink,用来向动态链表插入一个结点。
编写一个函数freelink,用来释放一个动态链表。

Input

输入多个学生的学号和成绩,建立动态链表,以0 0 结束
输入学号,删除链表中的对应结点
插入两个链表结点

Output

输出的链表

Sample Input

1001 1001002 951005 901008 760 010051006 981009 99

Sample Output

1001 100.001002 95.001006 98.001008 76.001009 99.00

HINT

#include <iostream>
#include <iomanip>
using namespace std;
struct student
{
     long num;
     float score;
     student *next;
};
student *creatlink( void )
{
     student *head;
     student *p1,*p2;
     p1=p2= new student;
     cin>>p1->num>>p1->score;
     head=NULL; //对head初始赋值
     while (p1->num!=0)
     {
         if (head==NULL) head=p1; //p1用于指向新开的节点
         else p2->next=p1; //p2指向链表最后一个节点
         p2=p1;
         p1= new student;
         cin>>p1->num>>p1->score;
     }
     p2->next=NULL;
     return head;
}
student *dellink(student *head, long del_num)
{
     student *p1,*p2;
     p1=head;
     while (p1->num!=del_num&&p1->next!=NULL)
     {
         p2=p1;
         p1=p1->next;
     }
     if (p1->num == del_num)//找到了这个数
     {
         if (p1==head) head=p1->next; //若是头结点,将头节点下一节点作为头结点
         else p2->next=p1->next;
     }
     return head;
}
student *insertlink(student *head,student *std)
{
     student *p2=head,*p1,*st= new student;
     st->num=std->num;
     st->score=std->score;
     st->next=std->next;
     while (p2->next!=NULL)
     {
        if (p2->num < st->num && st->num < p2->next->num) //如果插入的节点值介于 p2 和 p2->next 之间
         
         {
             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 printlink(student *head) //定义print函数
{
     student *p;
     p=head;
     do
     {
         cout<<p->num<< " " <<p->score<<endl;
         p=p->next;
     } while (p!=NULL);
}
void freelink(student *head) //释放一个动态链表
{
     student *p2,*p1;
     p1=head;
     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;
}
 
 
/**************************************************************
     Problem: 2430
     User: 201358501133
     Language: C++
     Result: Accepted
     Time:0 ms
     Memory:1268 kb
****************************************************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值