循环单链表
循环单链表终端结点的next结点指针指向表头结点
循环单链表结点定义
typedef struct LNode {
int data;
struct LNode* next;
}LNode;
尾插法建立循环单链表
void createlistR(LNode *&L,int n) {
LNode* r;
LNode* s;
L = new LNode;
L->next=NULL;
r = L;
for (int i = 0; i < n; i++) {
s = new LNode;
cin >> s->data;
r->next = s;
r = s; //让r跟踪着最后的结点
}
r->next = L;//单链表之前这个位置是r->next=NULL,由于是循环单链表所以就指向头结点了
}
头插法建立循环单链表
void createlistF(LNode*& L, int n) {
LNode* s;
LNode* r;
int flag = 1;
L = new LNode;
L->next = NULL;
r = L;
for (int i = 0; i < n; i++) {
s = new LNode;
cin >> s->data;
s->next = L->next;
L->next = s; //单链表头插的话到这步就结束了
//这个判断,是为了能让r指向最后一个结点
if (flag) {
r = s;
flag = 0;
}
}
r->next = L; //将尾结点连上头结点
}
查找并删除
int DeleteData(LNode*& L,int x) {
LNode* p = L->next; //指向开始结点
LNode* q; //用来指向p的下一个结点的
while (p != L) { //注意此时退出循环的判定不是NULL了而是头结点
if (p->next->data == x)
{ //如果发现p的下一个结点里的值符合要求,跳出循环
break;
}
p = p->next;
}
if(p==L)
{
return 0;
}
else
{
q = p->next; //就将p的下一个结点的值给q
p->next = q->next; //让p指向q的下一个结点地址
delete q;
return 1;
}
}
循环双链表
循环双链表终端结点的next指针指向表头结点,头结点的prior指针指向表尾结点
循环双链表结点定义
typedef struct DLNode{
int data;
struct DLNode* prior;
struct DLNode* next;
}DLNode;
尾插法建立循环双链表
void createDlistR(DLNode*& L, int n) {
DLNode* s,*r;
int i;
L = new DLNode;
L->next = NULL;
L->prior = NULL;
r = L;
for (i = 0; i < n; i++) {
s = new DLNode;
cin >> s->data;
s->prior = r;
r->next = s;
r = s;
}
//跟双链表就是下面这两句不一样,之前是r->next=NULL就行了的
r->next = L;
L->prior = r;
}
查找结点
DLNode* findNode(DLNode* L, int x) {
DLNode* p = L->next;
while (p != L) {//跟双链表比下就是就判断条件不一样
if (p->data == x) {
return p;
}
p = p->next;
}
return NULL;
}
插入结点
void InsertData(DLNode *&L,int s) {
DLNode* p = L->next;
DLNode* x;
while (p != L) {//也是一样的,就判定不一样
if (p->data == s) {
x = new DLNode;
cin >> x->data;
//下面这四行才是核心
x->next = p->next;
p->next = x;
x->prior = p;
x->next->prior = x;
}
p = p->next;
}
}
删除结点
void DeleteData(DLNode*& L, int x) {
DLNode* p = L->next;
DLNode* q;
while (p != L) { //判断不一样
if (p->data == x) {
q = p->next;
p->next = q->next;
q->next->prior = p;
delete q;
}
p = p->next;
}
}
总结
循环单链表和循环双链表是由对应的单链表和双链表改造而来的,只需在终端结点和头结点间建立联系即可,需要注意的是,如果p指针沿着循环链表走,则判定p走到尾结点的条件也就不同了呦------至此链表就结束啦!!!
就当是对前面所学的一个复习吧.