OJ:整数顺序表的基本运算

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


题目叙述

总时间限制: 

10000ms

内存限制: 

655350kB

描述

定义单链表类,创建带头结点的单链表(节点类型为整型数据),要求包含以下成员函数:

头插法创建单链表(利用构造函数实现)

尾插法创建单链表(重载构造函数实现)

链表的遍历

按值删除一个节点

按位置删除一个节点

判断该链表是否递增有序

链表的析构

输入

输入一组数据,以尾插法的形式创建单链表(0表示输入结束)(构造第一个链表)
输入一组数据,以头插法的形式创建单链表(0表示输入结束)(构造第二个链表)
输入要删除元素的值(在尾插法创建的链表中进行该操作)
输入要删除元素的位置(在尾插法创建的链表中进行该操作)

输出

输出尾插法创建链表的结果
输出头插法插法创建链表的结果
输出按值删除之后链表中剩余的元素(在尾插法创建的链表中进行该操作.若删除的元素不存在,输出Error)
输出按位置删除之后链表中剩余的元素(在尾插法创建的链表中进行该操作.若删除的元素不存在,输出Error
输出链表是否递增有序(在尾插法创建的链表中进行该操作.递增有序,输出Yes.否则输出No。)

样例输入

1 2 3 4 5 0 
1 2 3 4 5 0
2
0

样例输出

1 2 3 4 5
5 4 3 2 1
1 3 4 5
Error
Yes

代码:

#include <iostream>
#include <cstdlib>
using namespace std;
//cout<<l.head2是显示l.head2的地址
//cout<<l.head2->data是显示head2->data的值
//cout<<l.head2->next是显示head2->next的地址
class Node {//节点定义
public:
    int data;//数据域
    class Node* next;//指针域
};
class LinkList {
public:
    LinkList() {//初始化
        head = new Node;//new(新建)一个头节点
        head->data = 0;//因为定义head时用的是Node自定义类型,
        //因此有数据域,有指针域,data先定义为0,后面插入数据时更改,next同理
        head->next = nullptr;

        head1 = new Node;//new(新建)一个头节点
        head1->data = 0;//因为定义head时用的是Node自定义类型,
        //因此有数据域,有指针域,data先定义为0,后面插入数据时更改,next同理
        head1->next = nullptr;

        head2 = new Node;//new(新建)一个头节点
        head2->data = 0;//因为定义head时用的是Node自定义类型,
        //因此有数据域,有指针域,data先定义为0,后面插入数据时更改,next同理
        head2->next = nullptr;
        int data1 = 1;
        while (data1 != 0) {
            cin >> data1;
            if (data1 != 0) {
                Node* newNode = new Node;//先定义一个Node节点指针newNode,头节点
                newNode->data = data1;//将data赋值给新定义的节点的数据域中
                Node* p = head1;//定义指针p指向头节点
                if (head1 == nullptr) {//当头节点为空时,设置newNode为新节点
                    head1 = newNode;
                }
                newNode->next = p->next;//将新节点插入指定位置
                p->next = newNode;//新节点的next指针指向之前的头节
            }
        }
        /*if (head1 == nullptr && head1->next == nullptr) {
            cout << "空" << endl;
        }*/

        Node* p1 = head1;
        while (p1->next != nullptr)
        {
            p1 = p1->next;
            cout << p1->data << " ";
        }

        cout << endl;

    }
    LinkList(int n) {
        head = new Node;//new(新建)一个头节点
        head->data = 0;//因为定义head时用的是Node自定义类型,
        //因此有数据域,有指针域,data先定义为0,后面插入数据时更改,next同理
        head->next = nullptr;

        head1 = new Node;//new(新建)一个头节点
        head1->data = 0;//因为定义head时用的是Node自定义类型,
        //因此有数据域,有指针域,data先定义为0,后面插入数据时更改,next同理
        head1->next = nullptr;

        head2 = new Node;//new(新建)一个头节点
        head2->data = 0;//因为定义head时用的是Node自定义类型,
        //因此有数据域,有指针域,data先定义为0,后面插入数据时更改,next同理
        head2->next = nullptr;
        int data1 = 1;
        while (data1 != 0) {
            cin >> data1;
            if (data1 != 0) {
                Node* newNode = new Node;//先定义一个Node节点指针newNode
                newNode->next = nullptr;//定义newNode的数据域和指针域
                newNode->data = data1;
                Node* p = head2;
                if (head2 == nullptr) {
                    head2 = newNode;
                }
                while (p->next != nullptr)
                {
                    p = p->next;//次循环结束后,p即为插入前的最后一个节点
                }
                p->next = newNode;
            }
        }

        Node* p1 = head2;

        do {
            p1 = p1->next;
            cout << p1->data << " ";
        } while (p1->next != nullptr);
        cout << endl;

    }
    ~LinkList() {//析构
        delete head;
        delete head1;
        delete head2;
    }
    int CreatLinkList(int size);
    int GetLen();
    int GetlenForweicha();
    void JudgeZeng();
    void showLinkList();
    Node* Find(int data);
    Node* FindForweicha(int data1);
    void touchaList();
    void weichaList();
    void anyList(int data, int n);
    void DeleteAnyList(int data);
    void DeleteHeadList();
    bool isEmpty();
    void DeleteAll();
    void DeleteAnyListForweicha(int data1);
    void DeleteHeadListForweicha();
    void DeleteZhiListForweicha(int data1);
    void CreatFLink();
    void DisfloatLink();
private:
    Node* head;//头指针
    Node* head1;
    Node* head2;
    Node* temp;
};

int LinkList::GetlenForweicha() {
    int size = 0;
    Node* p = head2->next;//定义一个新指针,指向头节点的next
    //(next是第一个,头节点不算)
    //*p =的是next的值,head是=&next,(head->next==Node.next)
    while (p != nullptr) {
        size++;
        p = p->next;
    }
    return size;

}
//共三种创建链表方法
void LinkList::DeleteAnyListForweicha(int data1) {//删除任意位置元素,data1为位置
    Node* ptemp;
    if (data1 > GetlenForweicha() || data1 < 1) {
        cout << "Error" << endl;
    }
    else if (data1 == 1) {
        ptemp == head2->next;
        LinkList Link;
        Link.DeleteHeadListForweicha();
        Node* p1 = head2;

        do {
            p1 = p1->next;
            cout << p1->data << " ";
        } while (p1->next != nullptr);
        cout << endl;
    }
    else {
        Node* p = head2;
        for (int i = 1; i < data1; i++) {
            p = p->next;
        }
        ptemp = p;
        p = p->next;
        ptemp->next = p->next;
        delete p;
        p = nullptr;
        Node* p1 = head2;

        do {
            p1 = p1->next;
            cout << p1->data << " ";
        } while (p1->next != nullptr);
        cout << endl;
    }


}
void LinkList::DeleteHeadListForweicha() {//删除头部节点
    Node* p = head2;
    if (p == nullptr || p->next == nullptr) {
        cout << "该链表为空" << endl;
    }
    else {
        Node* ptemp = nullptr;
        p = p->next;
        ptemp = p->next;
        delete p;
        p = nullptr;
        head2->next = ptemp;
    }

}
Node* LinkList::FindForweicha(int data1) {//查找函数

    Node* p = head2;//p指向head2的地址
    if (p == nullptr)
    {

        cout << "空" << endl;
        return nullptr;
    }
    else
    {

        while (p->next != nullptr) {
            if (p->data == data1)
            {

                return p;
            }
            p = p->next;
        }
    }
    if (p->data == data1) {

        return p;
    }
    /*else {
        return nullptr;
    }*/
}
void LinkList::DeleteZhiListForweicha(int data1) {
    Node* ptemp = FindForweicha(data1);
    if (ptemp == nullptr) {
        cout << "Error" << endl;

    }
    else if (ptemp == head2->next) {
        LinkList Link;
        Link.DeleteHeadListForweicha();
        Node* p1 = head2;
        do {
            p1 = p1->next;
            cout << p1->data << " ";
        } while (p1->next != nullptr);
        cout << endl;
    }
    else {
        Node* p = head2;

        while (p->next != ptemp) {
            p = p->next;
        }
        p->next = ptemp->next;
        delete ptemp;
        ptemp = nullptr;
        Node* p1 = head2;
        do {
            p1 = p1->next;
            cout << p1->data << " ";
        } while (p1->next != nullptr);
        cout << endl;

    }

}

void LinkList::JudgeZeng()
{
    Node* p = head2->next, * q;
    if (p)
    {
        while (p->next)
        {
            q = p->next;
            if (q->data > p->data)
                p = q;
            else
                cout << "No";
        }

    }
    cout << "Yes";
}

void diaoyong();
int main() {
    int i;
    int zhi, place;

    LinkList l1(9);//weicha
    LinkList l;


    cin >> zhi;

    l1.DeleteZhiListForweicha(zhi);
    cin >> place;
    l1.DeleteAnyListForweicha(place);
    l1.JudgeZeng();
    return 0;

}
void diaoyong()
{

    LinkList l1(9);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值