单向循环链表与单链表的区别是:单向循环链表的尾结点的next指针指向了头结点head
初始化
创建循环列表
插入
删除
#include<bits/stdc++.h>
using namespace std;
#define OK 1;
#define ERROR 0;
typedef int ElemType;
typedef int status;
typedef struct LNode{
ElemType data;
struct LNode * next;
} *LinkList;
status CreateList_L(LinkList &L,int n){
LinkList p,q;
L = new LNode;
L->next = L;
q = L;
cout<<"输入"<<n<<"个数据" <<endl;
for(int i =0;i<n;i++){
p = new LNode;
cin>> p->data;
q->next = p;
q = q->next;
}
q->next =L; //关键点
return OK;
}
void Outptlist_L(LinkList L){
LinkList p,q;
p=L->next;
if(p==NULL){
cout<<"该链表为空"<<endl;
}
else {
cout<<"该链表为:"<<endl;
while(p!=NULL&&p->next!=L->next){ //控制不出现死循环
cout<<p->data<<" ";
p=p->next;
}
}
}
int Listlength(LinkList L){
LinkList p;
p=L->next;
int cnt=0;
while(p!=NULL&&p!=L){
p=p->next;
cnt++;
}
return cnt;
}
status ListInsert_L(LinkList &L,int n,ElemType e){
if(n<1||n>Listlength(L)+1)return ERROR;
LinkList s = new LNode ;
s->data = e;
LinkList p;
p=L; //当在第一个元素插入时p指向头指针
for(int i =0;i<n-1;i++){
p=p->next;
}
s->next=p->next;
p->next = s;
return OK;
}
int ListDelete_L(LinkList&L,int n,ElemType &e) {
if (n<1||n> Listlength(L)) //判断选择的合理性
return ERROR;
LinkList p,q;
p=L;
for(int i=0;i<n-1;i++){
p=p->next;
}
q = p->next;
e= q->data;
p->next = q->next;
return e;
//1 2 3 4 5
}
int main(){
cout<<"创建测试 :——————————————"<<endl;
LinkList L1;
int n ;
cout<<"请输入链表数据个数"<<endl;
cin>>n;
CreateList_L(L1, n);
cout<<"输出测试 :——————————————"<<endl;
Outptlist_L(L1);
cout<<endl;
cout<<"链表长度为:"<<endl;
cout<< Listlength(L1) <<endl;
cout<<"链表第4个位置插入0" <<endl;
ListInsert_L(L1,4,0);
Outptlist_L(L1);
cout<<endl;
cout<<"删除第4位数据,并返回数据" <<endl;
int e;
cout<<ListDelete_L(L1,4,e)<<endl;
cout<<"输出链表"<<endl;
Outptlist_L(L1);
return 0;
}