一、双向循环链表的结点及数据定义
#define ERROR0
#define TRUE1
#define FALSE0
#define OK1
#define MAXSIZE20/* 存储空间初始分配量 */
typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */
//定义结点
typedef struct Node{
structNode*prior;//前驱
ElemTypedata;//数据
structNode*next;//后续
}Node;
typedefstructNode* LinkList;
二、双向循环链表初始化
Status CreateList(LinkList *L){
*L = (LinkList)malloc(sizeof(Node));
if(*L ==NULL) {
returnERROR;
}
(*L)->next= (*L);
(*L)->prior= (*L);
(*L)->data= -1;
//指向头结点
LinkListp = *L;
// LinkList temp;
for(inti=0; i<10; i++) {
//新增数据
LinkListtemp = (LinkList)malloc(sizeof(Node));
if(temp ==NULL) {
returnERROR;
}
temp->data= i;
//为新增的结点建立双向链表关系
//temp 是p的后继
p->next= temp;
//temp 的前驱是p
temp ->prior= p;
//
temp->next= *L;
//
(*L)->prior= temp;
//p 要记录最后的结点的位置,方便下一次插入
p = p->next;
}
// //最后一个结点的next指向头结点,头结点的prior指向最后一个结点
// p->next = *L;
// (*L)->prior = p;
returnOK;
}
三、打印循环链表的元素
void display(LinkList L){
if(L ==NULL) {
printf("打印的双向链表为空!\n");
return;
}
LinkListp = L->next;
while(p != L) {
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
四、双向循环链表插入元素
/*当插入位置超过链表长度则插入到链表末尾*/
Status LinkListInsert(LinkList *L,int index,ElemType data){
if(*L ==NULL|| index <1) {
returnERROR;
}
//指向头结点
LinkListp = *L;
//找到要插入的数据的前一个结点
inti =1;
while(inext!= *L) {
p = p->next;
i++;
}
if(i>index) {
returnERROR;
}
//
LinkList temp = (LinkList)malloc(sizeof(Node));
if(temp ==NULL) {
returnERROR;
}
temp->data= data;
//
temp->next= p->next;
//最后一个结点
if(temp->next== *L) {
(*L)->prior= temp;
}else{
p->next->prior= temp;
}
temp->prior= p;
//
p->next= temp;
// p->next->prior = temp;
returnOK;
}
五、双向循环链表删除结点
Status deleteList(LinkList *L,int index,ElemType *data){
if(*L ==NULL|| index <1) {
returnERROR;
}
LinkListtemp = (*L)->next;
if(*L == temp) {
returnERROR;
}
inti=1;
while(inext!= *L)) {
temp = temp->next;
// NSLog(@"temp data = %d",temp->data);
i++;
}
*data = temp->data;
temp->prior->next= temp->next;
temp->next->prior= temp->prior;
free(temp);
returnOK;
}
六、查询双向链表的数据
ElemType SelectList(LinkList L,int index){
if(L ==NULL|| index<1) {
return-1;
}
LinkListp = L->next;
inti=1;
while(inext!= L) {
p = p->next;
i++;
}
if(p == L) {
return-1;
}
returnp->data;
return-1;
}
七、修改双向链表的数据
Status ReplaceList(LinkList L,int index,ElemType data){
if(L ==NULL|| index<1) {
returnERROR;
}
LinkListp = L->next;
inti=1;
while(inext!=L) {
p = p->next;
i++;
}
if(p==L) {
returnERROR;
}
p->data= data;
returnOK;
}
八、调用
intmain(intargc,constchar* argv[]) {
LinkList L;
CreateList(&L);
display(L);
inttemp,item;
printf("输入要插入的位置和数据用空格隔开:");
scanf("%d %d",&temp,&item);
LinkListInsert(&L,temp,item);
display(L);
printf("输入要删除位置1:");
scanf("%d",&temp);
deleteList(&L, temp, &item);
display(L);
printf("输入要删除位置2:");
scanf("%d",&temp);
deleteList(&L, temp, &item);
display(L);
printf("输入要删除位置3:");
scanf("%d",&temp);
deleteList(&L, temp, &item);
display(L);
printf("输入要查询的位置1:");
scanf("%d",&temp);
ElemTypedata =SelectList(L, temp);
printf("查询到的数据是:%d\n",data);
printf("输入要查询的位置2:");
scanf("%d",&temp);
data =SelectList(L, temp);
printf("查询到的数据是:%d\n",data);
printf("输入要查询的位置3:");
scanf("%d",&temp);
data =SelectList(L, temp);
printf("查询到的数据是:%d\n",data);
//
printf("输入要修改的位置和数据1:");
scanf("%d %d",&temp,&item);
ReplaceList(L,temp,item);
display(L);
printf("输入要修改的位置和数据2:");
scanf("%d %d",&temp,&item);
ReplaceList(L,temp,item);
display(L);
printf("输入要修改的位置和数据3:");
scanf("%d %d",&temp,&item);
ReplaceList(L,temp,item);
display(L);
return0;
}