C++實驗15

一、順序插入鏈表

#include<iostream>
using namespace std;
class node
{
public:
    float data;
    node *link;
};
node *insert(node *head,float n)
{
    node *ptem=new node;
    ptem->data=n;
    if(n==-1)      //最後-1作爲結束符也申請了堆空間,釋放掉
    {
        delete ptem;
        return head;
    }
    if(!head)       //鏈表未存在時
    {
        head=ptem;
        head->link=0;
        return head;
    }
    node *p1,*p2;    //定義p1=head用來while(p1),p2用於斷開鏈表中間時保存。

    p1=head;

    if(n<head->data)     //插入元素在列表頭的情況,因head一直指向鏈頭,故可以在循環外直接比較
    {
        ptem->link=head;
        return ptem;
    }

    while(p1)      //循環在表中找到位置
    {
        if(p1->link==0&&p1->data<=n)   //插入元素在列表尾的情況
        {
                p1->link=ptem;
                ptem->link=0;
                return head;
        }           
        if(n<=p1->link->data&&n>=p1->data)  //置於表中
        {
            p2=p1->link;                   //斷開鏈表前用p2保存斷開位置後面的指針
            p1->link=ptem;
            ptem->link=p2;
            return head;
        }
        p1=p1->link;
    }

}
void print(node *head)   //輸出鏈表
{
    while(head)
    {
        cout<<head->data<<'\t';
        head=head->link;
    }
}
void del(node *head)    //釋放鏈表空間
{
    node *p;
    while(head)
    {
        p=head->link;
        delete head;
        head=p;
    }

}
void main()
{
    node *head=0;
    int len;
    float n;
    cout<<"請輸入要穿件鏈表的值,以-1結束\n";
    while(true)
    {
        cin>>n;
        if(n==-1)
            break;
        head=insert(head,n);
    }
    print(head);
    del(head);
}

二、輸入數據並處理

#include<iostream>
using namespace std;
struct stunode
{
    int num;
    float score;
    stunode *link;
};
stunode *insert(stunode *head,int id,float n)//按score從大到小排列
{
    stunode *ptem=new stunode;
    ptem->num=id;
    ptem->score=n;
    if(n==-1)      //最後-1作爲結束符也申請了堆空間,釋放掉
    {
        delete ptem;
        return head;
    }
    if(!head)       //鏈表未存在時
    {
        head=ptem;
        head->link=0;
        return head;
    }
    stunode *p1,*p2;    //定義p1=head用來while(p1),p2用於斷開鏈表中間時保存。

    p1=head;

    if(n>head->score)     //插入元素在列表頭的情況,因head一直指向鏈頭,故可以在循環外直接比較
    {
        ptem->link=head;
        return ptem;
    }

    while(p1)      //循環在表中找到位置
    {
        if(p1->link==0&&p1->score>=n)   //插入元素在列表尾的情況
        {
            p1->link=ptem;
            ptem->link=0;
            return head;
        }           
        if(n>=p1->link->score&&n<=p1->score)  //置於表中
        {
            p2=p1->link;                   //斷開鏈表前用p2保存斷開位置後面的指針
            p1->link=ptem;
            ptem->link=p2;
            return head;
        }
        p1=p1->link;
    }

}
void print(stunode *head)   //輸出鏈表
{
    cout<<"ID\t"<<"Score"<<endl;
    while(head)
    {
        cout<<head->num<<'\t'<<head->score<<endl;
        head=head->link;
    }
}
void del(stunode *head);
void del_fail(stunode *head,float n)   //按照輸入的達標線刪除達標線以下的鏈表數據
{
    while(head)
    {
        if(head->score>=n&&head->link->score<n)
        {
            head->link=0;
            del(head->link);
            break;
        }
        head=head->link;
    }
}
void del(stunode *head)    //釋放鏈表空間
{
    stunode *p;
    while(head)
    {
        p=head->link;
        delete head;
        head=p;
    }

}
void main()
{
    stunode *head=0;
    int num;
    float n;
    cout<<"請輸入編號、總分,以-1 -1結束\n";
    while(true)
    {
        cin>>num;
        cin>>n;
        if(n==-1)
            break;
        head=insert(head,num,n);
    }
    print(head);
    float fail_n;
    cout<<"請輸入達標線:\n";
    cin>>fail_n;
    del_fail(head,fail_n);
    cout<<"刪除不達標的數據後爲:\n";
    print(head);
    del(head);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章