双向链表类模板

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
struct Node
{
    int entry;
    Node *next,*pre;
};
class MyList{
    public:
        MyList();//chushihua
        ~MyList();//xiaohui
        int size() const;
        bool full() const;
        bool empty() const;
        bool retrieve(int x);
        void printMyList();
        void unprintMyList();
        void createMylist();
        void insert(int pos,int x);
        void remove(int pos);
         void replace(int pos,int x);
        void traverse();
    private:
        Node *head;
        int length;
};

MyList::MyList(){
    head = new Node();
    head->next = NULL;
    head->pre = NULL;
    length = 0 ;
}
MyList::~MyList(){
    while( head!=NULL)
    {
        Node *p = head;
        head=head->next;
        delete p;
    }
}
void MyList::createMylist(){
    Node *cur,*newPtr,*p;
    cur = head;
    while(1)
     {
         int x;
         scanf("%d",&x);
         if(x==-1) break;
         newPtr = new Node();
         newPtr->entry = x;
         cur->next = newPtr;
         p = cur;
         cur = newPtr;
         newPtr->pre = p ;
         length++;
    }
    cur->next = NULL;
}
void MyList::printMyList(){
    Node *cur;
    cur = head->next;
    while(cur!=NULL){
        cout<<cur->entry<<" ";
        cur=cur->next;
    }
    cout<<endl;
}
void MyList::unprintMyList()
{
    Node *cur;
    cur = head->next;
    while(cur->next!=NULL){
        cur=cur->next;
    }
    while(cur->pre!=NULL)
    {
        cout<<cur->entry<<" ";
        cur=cur->pre;
    }
    cout<<endl;
}
int MyList::size() const{
    return length;
}
bool MyList::empty() const{
    if(length) return false;
    return true;
}
void MyList::insert(int pos,int x){
    Node *cur = head,*newPtr,*p;
    int cnt=0;
    while(cur!=NULL)
    {
        if(cnt == pos)
        {
            if(cur->next == NULL)
            {
                newPtr = new Node();
                newPtr->entry = x;
                newPtr->next = cur->next;
                newPtr->pre = cur;
                cur->next = newPtr;
            }
            else
            {
                newPtr = new Node();
                newPtr->entry = x;
                p = cur->next;    
                newPtr->next = p;
                newPtr->pre = cur;
                p->pre=newPtr;
                cur->next = newPtr;
            }
        }
        cnt++;
        cur=cur->next;
    }
}
void MyList::remove(int pos){
    Node *cur = head,*p;
    int cnt=0;
    while(cur!=NULL)
    {
        if(cnt == pos)
        {
            p = cur->next;
            cur->next=p->next;
            if(p->next!=NULL)p->next->pre=cur;
            delete p;
        }
        cnt++;
        cur=cur->next;
    }
}
void MyList::replace(int pos,int x)
{
    Node *cur = head,*newPtr,*p;
    int cnt=0;
    while(cur!=NULL)
    {
        if(cnt == pos)
        {
            newPtr = new Node();
            newPtr->entry = x;
            p = cur->next;
            if(p->next!=NULL) p->next->pre=newPtr;
            newPtr->next = p->next;
            newPtr->pre = p->pre;
            cur->next = newPtr;
            delete p;
        }
        cnt++;
        cur=cur->next;
    }
}
int main()
{
    MyList q;
    q.createMylist();
    while(1)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        if(x==-1 && y==-1) break;
        q.insert(x,y);
    }
    while(1)
    {
        int x;
        scanf("%d",&x);
         if(x==-1) break;
         q.remove(x);         
    }
    while(1)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        if(x==-1 && y==-1) break;
        q.replace(x,y);
    }
    q.printMyList();
    q.unprintMyList();
    return 0;
}

(List的双链表实现)请用双链表(需要记录最后一次访问的位置)实现通用线性表的数据结构MyList。你所实现的List应包括:Insert,Remove,Retrieve,Replace, Traverse,Size,Full等功能。利用你实现的MyList实现输入序列的增删、修改及正逆序输出。
【输入】输入数据共4行,操作过程中序列长度始终小于100;
第1行为输入的整数序列,以-1结束;
第2行为N(N>=0)对数a b(0<=a<=length),表示在第a个位置前插入数b,以-1 -1结束;
第3行为M(M>=0)个数c(0<=c<=length-1),表示删除第c个位置的元素,以-1结束;
第4行为P(P>=0)对数d e(0<=d<=length-1),表示修改第d个位置的元素,以-1 -1结束。
**注意:插入,删除,修改操作均按照顺序在同一个序列中进行。
【输出】操作后新序列的正逆序输出,第1行为正序,第2行为逆序。
例如:
【输入】
3 7 8 4 6 -1
1 2 -1 -1// 在第1个位置的元素7前插入数2,此时序列为3 2 7 8 4 6
3 -1// 删除序列3 2 7 8 4 6第3个位置的元素8,此时序列为3 2 7 4 6
4 9 -1 -1//将现有序列第4个位置的元素6修改为9,此时序列为3 2 7 4 9
【输出】
3 2 7 4 9 // 新序列的正序输出
9 4 7 2 3 // 新序列的逆序输出

posted @ 2022-04-12 21:43  寒方  阅读(44)  评论(0编辑  收藏  举报