说明
与循环单链表一样,只是末尾除的指针指向头结点,形成一个环。
代码
/*
** cdlink create by yubo.wang 2018.9.12
*/
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *prior,*next;
}SLink;
SLink *MaxNode(SLink *L);
void InitList(SLink *&L) /*SLink *&L作为引用型参数或者用二级指针SLink **L*/
{
L=(SLink *)malloc(sizeof(SLink));
L->prior=L;
L->next=L;
}
int GetLength(SLink *L)
{
int i=0;
SLink *p=L->next;
while(p != L)
{
i++;
p=p->next;
}
return i;
}
int GetElem(SLink *L,int i,ElemType &e)
{
int j=1;
SLink *p=L->next;
if(i<1 || i>GetLength(L))
return 0;
while(j<i)
{
p=p->next;
j++;
}
e=p->data;
return 1;
}
int Locate(SLink *L,ElemType x)
{
int i=1;
SLink *p=L->next;
while(p!=L && p->data!=x)
{
p=p->next;
i++;
}
if(L == p)
return 0;
else
return i;
}
int InsElem(SLink *L,ElemType x,int i)//初始化是尾插,也可中途插入
{
int j=1;
SLink *p=L,*s;
s=(SLink *)malloc(sizeof(SLink));
s->data=x;
s->prior=NULL;
s->next=NULL;
if(i<1 || i>GetLength(L)+1)//防止i越界
return 0;
while(j<i)
{
p=p->next;
j++;
}
s->next = p->next;
s->prior = p;
s->next->prior=s;
p->next = s;
return 1;
}
int DelElem(SLink *L,int i)
{
int j=1;
SLink *p=L,*q;
if(i<1 || i>GetLength(L))
return 0;
while(j<i)
{
p=p->next;
j++;
}
q=p->next;
printf("%c\n", q->data);
p->next=q->next;
q->next->prior=p;
free(q);
return 1;
}
void DispList(SLink *L)
{
SLink *p=L->next;
while(p != L)
{
printf("%c ", p->data);
p=p->next;
}
printf("\n");
}
int main()
{
int i;
ElemType e;
SLink *L=NULL;
InitList(L);//initial head
InsElem(L,'a',1);
InsElem(L,'b',2);
InsElem(L,'c',3);
InsElem(L,'d',4);
InsElem(L,'e',5);
InsElem(L,'f',6);
printf("List:");
DispList(L);
printf("Length: %d\n", GetLength(L));
i=3;
GetElem(L,i,e);
printf("index %d data is:%c\n", i,e);
e='e';
printf("data %c index is: %d\n", e,Locate(L,e));
i=4;
printf("delete index %d data ", i);
DelElem(L,i);
i=2;
e='w';
printf("insert index %d data %c\n", i, e);
InsElem(L,e,2);
printf("List:");
DispList(L);
printf("MaxNode:%c\n", MaxNode(L)->data);
}
/*通过一趟遍历返回单链表元素最大值的结点*/
SLink *MaxNode(SLink *L)
{
SLink *p=L->next,*q=p;//p用来遍历,q用来记录最大的值结点
while(p != L)
{
if(p->data > q->data)
q=p;
p=p->next;
}
return q;
}
/*一个带头结点的循环双链表,把大于0的结点放在小于0的节后前面*/
int move(SLink *L)
{
ElemType temp;
SLink *p=L->next,*q=L->prior;
if(L->next == L)
return 0;
while(p!=q)
{
while(p->data>0 && p!=L)//从左向右找第1个data值小于0的结点
p=p->next;
while(q->data<0 && q!=L)//从右向左找第1个data值大于0的结点
q=q->prior;
if(p!=q)//交换p合q结点的值
{
temp=p->data;
p->data=q->data;
q->data=temp;
p=p->next;
q=q->prior;
}
}
return 1;
}