c++链表 建立 输入 输出 删除结点 插入结点 释放链表 的函数

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
*/


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值