循环链表可以当做链表来用,插入删除都可以超出本身节点数。节点用的是模板类,display函数输出的是节点的值。main函数开头请输入你的节点数。初始化有个头节点,也就是第0个节点。
#include<iostream>
#include<iomanip>
#include<malloc.h>
using namespace std;
template <class T> //类模板
class node //节点
{
public:
T date;
node* next;
node(T a) //构造函数
{
date=a;
next=0;
}
};
class list //链表
{
public:
node<int>* first;
list()
{
first=NULL;
}
node<int>* insert() //循环实现
{ int a; //节点值
node<int>* p=first;//节点数
int n;
cin>>n;
int i=0;
while(n--)
{
i++;
cout<<"你的节点第"<<i<<setw(10)
<<setiosflags(ios::left)<<endl;
cin>>a;
if(first->date==0)
first->date=a;
else
{
node<int>* n=new node<int>(a);
p->next=n;
n->next=first;
p=p->next; //尾节点指向0节点
}
}
return first;
}
int delete1() { //消除下一个节点
if(this==NULL) //this指针指向类本身
cout<<"error";
else {
this->first->next=this->first->next->next;
return 1;
}
return 0;
}
void deleteone(int);
void insertone(int,int);
void display();
};
void list::deleteone(int a) { //消除第k个节点
node<int>*pointer=this->first;
for(int i=1; i<a; i++)
pointer=pointer->next;
pointer->next=pointer->next->next;
}
void list::insertone(int a,int value) {
//向第i个位置插入节点
node<int>*pointer=this->first;
for(int i=1; i<a-1; i++)
pointer=pointer->next;
node<int> *temp=new node<int>(value);
temp->next=pointer->next;
pointer->next=temp;
}
void list::display() {
node<int>*temp=this->first;
int value=temp->date;
for(temp; temp->next->date!=value; temp=temp->next)
cout<<setiosflags(ios::left)<<setw(3)<<temp->date<<"->";
cout<<temp->date<<endl;
}
int main() {
list* p=new list();
p->first=new node<int>(3); //第0个节点
p->insert();
try { //检查消除是否成功
int z=p->delete1();//消除第一个节点
if(z==0)
throw 1; //抛出异常
}
catch(int) {
cout<<"你没有成功消除节点";
}
//insertone,deleteone不能为0节点
cout << p->first->date<< endl;
cout << p->first->next->date<< endl;
cout << p->first->next->next->date<< endl;
return 0;
}