目录
1. 循环链表类型定义
1.1单向循环链表
typedef struct LNode{
int elem;
struct LNode *next;
}LNode,*CirLinkList;
1.2双向循环链表
typedef struct DLNode{
int elem;
struct DLNode *next,*prior;
}DLNode,*DCirLinkList;
2.初始化循环链表
2.1单向循环链表
void InitList(CirLinkList &CL){//初始化
CL=(CirLinkList)malloc(sizeof(LNode));
CL->next=CL;
}
2.2双向循环链表
void InitDList(DCirLinkList &DL){//初始化双向
DL=(DCirLinkList)malloc(sizeof(DLNode));
DL->prior=DL;
DL->next=DL;
}
3.头插法在循环链表中插入元素
3.1单向循环链表
bool HeadInsertList(CirLinkList &CL){//头插法
LNode *s;
int x;
for(;;){
scanf("%d",&x);
if(x==-1)
break;
s=(LNode*)malloc(sizeof(LNode));
s->elem=x;
s->next=CL->next;
CL->next=s;
}
}
3.2双向循环链表
bool HeadInsertDList(DCirLinkList &DL){//头插双向
DLNode *s;
int x;
for(;;){
scanf("%d",&x);
if(x==-1)
break;
s=(DLNode*)malloc(sizeof(DLNode));
s->elem=x;
s->next=DL->next;
DL->next=s;
s->prior=DL;
s->next->prior=s;
}
}
4.尾插法在双向循环链表中插入元素
bool TailInsertDList(DCirLinkList &DL){//尾插双向
DLNode *s;
int x;
for(;;){
scanf("%3d",&x);
if(x==-1)
break;
s=(DLNode*)malloc(sizeof(DLNode));
s->elem=x;
s->next=DL;
s->prior=DL->prior;
DL->prior=s;
s->prior->next=s;
}
}
5.在双向循环链表中指定位置插入元素
bool MidInsertDList(DCirLinkList &DL,int a,int x){//按位插入双向
DLNode *s,*p=DL->next;
for(int i=1;i<a-1;i++)
p=p->next;
s=(DLNode*)malloc(sizeof(DLNode));
s->elem=x;
s->next=p->next;
s->prior=p;
p->next=s;
s->next->prior=s;
}
6.删除双向循环链表中指定位置元素
int DelDList(DCirLinkList &L,int a){//删除双向指定节点
DLNode *p=L->next;
int i;
for(i=1;i<a;i++)
p=p->next;
p->prior->next=p->next;
p->next->prior=p->prior->prior;
int x=p->elem;
free(p);
return x;
}
7.遍历输出循环链表内容
7.1单向循环链表
void PrintList(CirLinkList CL){//打印
LNode *p=CL->next;
do{
printf("%3d",p->elem);
p=p->next;
}while(p!=CL);
printf("\n");
}
7.2双向循环链表
void PrintDList(DCirLinkList DL){//打印双向
DLNode *p=DL->next;
while(p!=DL){
printf("%3d",p->elem);
p=p->next;
}
printf("\n");
}
8.完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int elem;
struct LNode *next;
}LNode,*CirLinkList;
typedef struct DLNode{
int elem;
struct DLNode *next,*prior;
}DLNode,*DCirLinkList;
void InitList(CirLinkList &CL){//初始化
CL=(CirLinkList)malloc(sizeof(LNode));
CL->next=CL;
}
void InitDList(DCirLinkList &DL){//初始化双向
DL=(DCirLinkList)malloc(sizeof(DLNode));
DL->prior=DL;
DL->next=DL;
}
bool HeadInsertList(CirLinkList &CL){//头插法
LNode *s;
int x;
for(;;){
scanf("%d",&x);
if(x==-1)
break;
s=(LNode*)malloc(sizeof(LNode));
s->elem=x;
s->next=CL->next;
CL->next=s;
}
}
bool HeadInsertDList(DCirLinkList &DL){//头插双向
DLNode *s;
int x;
for(;;){
scanf("%d",&x);
if(x==-1)
break;
s=(DLNode*)malloc(sizeof(DLNode));
s->elem=x;
s->next=DL->next;
DL->next=s;
s->prior=DL;
s->next->prior=s;
}
}
bool TailInsertDList(DCirLinkList &DL){//尾插双向
DLNode *s;
int x;
for(;;){
scanf("%3d",&x);
if(x==-1)
break;
s=(DLNode*)malloc(sizeof(DLNode));
s->elem=x;
s->next=DL;
s->prior=DL->prior;
DL->prior=s;
s->prior->next=s;
}
}
bool MidInsertDList(DCirLinkList &DL,int a,int x){//按位插入双向
DLNode *s,*p=DL->next;
for(int i=1;i<a-1;i++)
p=p->next;
s=(DLNode*)malloc(sizeof(DLNode));
s->elem=x;
s->next=p->next;
s->prior=p;
p->next=s;
s->next->prior=s;
}
int DelDList(DCirLinkList &L,int a){//删除双向指定节点
DLNode *p=L->next;
int i;
for(i=1;i<a;i++)
p=p->next;
p->prior->next=p->next;
p->next->prior=p->prior->prior;
int x=p->elem;
free(p);
return x;
}
void PrintList(CirLinkList CL){//打印
LNode *p=CL->next;
do{
printf("%3d",p->elem);
p=p->next;
}while(p!=CL);
printf("\n");
}
void PrintDList(DCirLinkList DL){//打印双向
DLNode *p=DL->next;
while(p!=DL){
printf("%3d",p->elem);
p=p->next;
}
printf("\n");
}
int main(){
printf("单向循环列表:");
CirLinkList CL;
InitList(CL);
/****************/
HeadInsertList(CL);
PrintList(CL);
/****************/
/****************/
printf("双向循环列表:");
DCirLinkList DL;
InitDList(DL);
/****************/
HeadInsertDList(DL);
PrintDList(DL);
/****************/
TailInsertDList(DL);
PrintDList(DL);
/****************/
MidInsertDList(DL,2,99);
PrintDList(DL);
/****************/
int res=DelDList(DL,3);
printf("%d\n",res);
PrintDList(DL);
return 0;
}