双向链表类模板
#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 // 新序列的逆序输出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步