完成数据结构实验作业:
7-2 双向循环链表应用
分数 20
作者 liudan
单位 石家庄铁道大学
已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,实现交换p所指向的结点和它的前缀结点的顺序。
输入格式:
第一行输入元素个数,第二行输入元素值,第三行输入要交换的元素值,第四行输出结果。
输出格式:
输出交换后的结果,中间不用空格分隔,若要交换的值:4,不在数组终,则输出“未找到4”
输入样例:
在这里给出一组输入。例如:
6
1 2 3 4 5 6
6
输出样例:
在这里给出相应的输出。例如:
123465
点击查看代码
#include<iostream>
using namespace std;
struct Node{
int data;
Node* pre;
Node* next;
Node(int value):data(value),pre(nullptr),next(nullptr){}
};
class List{
private:
Node* head;
public:
List():head(nullptr){}
void insert(int data){
Node* newNode = new Node(data);
if(!head){
head = newNode;
head->pre = head;
head->next = head;
}else{
Node* last = head->pre;
last->next = newNode;
newNode->pre = last;
newNode->next = head;
head->pre = newNode;
}
}
Node* select(int value){
if(!head) return nullptr;
Node* current = head;
do{
if(current->data == value) return current;
current = current->next;
}while (current != head);
return nullptr;
}
int swap(int value){
Node* p = select(value);
if(!p || p == head){
if(!p){
cout<<"未找到"<<value<<endl;
}
return 0;
}
Node* preNode = p->pre;
Node* nextNode = p->next;
preNode->next = nextNode;
nextNode->pre = preNode;
preNode=preNode->pre;
nextNode=nextNode->pre;
preNode->next=p;
p->pre=preNode;
p->next=nextNode;
nextNode->pre=p;
if(nextNode == head)
head = p;
return 1;
}
void display(){
if(!head) return;
Node* current = head;
do{
cout<<current->data;
current = current->next;
}while(current != head);
}
~List(){
if(!head) return;
Node* current = head;
Node* nextNode;
do{
nextNode = current->next;
delete current;
current = nextNode;
}while(current != head);
}
};
int main(){
int n;
cin>>n;
List list;
for(int i = 0;i < n;i++){
int value;
cin>>value;
list.insert(value);
}
int N;
cin>>N;
int flag = list.swap(N);
if(flag)
list.display();
return 0;
}