/*doublecyclelinklist.h*/#pragma once#include<stdio.h>#include<stdlib.h>typedefint ElemType;//定义数据元素类型为inttypedefstruct DCLNode {//双向循环链表存储结构定义
ElemType data;struct DCLNode* prior;struct DCLNode* next;}DCLNode,*DCLinkList;//建立带头节点的双向循环链表L,输入n个元素的值
DCLinkList createLinkList(int n){
DCLNode *L,*q,*p;
L =(DCLNode*)malloc(sizeof(DCLNode));
L->next =NULL;//链表L的头的数据是空的,只有一个指针,方便后面的插入/删除
L->prior =NULL;
q = L;for(int i =0; i < n; i++){
p =(DCLNode*)malloc(sizeof(DCLNode));printf("请输入第%d个值:", i +1);scanf("%d",&p->data);
p->next =NULL;
p->prior = q;
q->next = p;//将当前结点的next指针指向p
q = p;//将当前结点更新为p}
q->next = L;
L->prior = q;return L;}//打印表中各元素的值voidprintLinkList(DCLinkList L){
DCLNode* p;
p = L->next;printf("\n双向循环链表中元素为(正向):");while(p != L){//头与尾重合printf("%d ", p->data);
p = p->next;}printf("\n");
DCLNode* q;
q = L->prior;printf("双向循环链表中元素为(反向):");while(q != L){//头与尾重合printf("%d ", q->data);
q = q->prior;}printf("\n\n");}//在带头节点的双向循环链表L中的i位置插入元素e,成功返回1,不成功返回0intinsertLinkList(DCLinkList L,int i, ElemType e){
DCLNode *p,*q;
p = L;int j =0;while(p->next != L&&j < i -1){//不断移动游标p,直到指向要插入的前一个位置(当游标p到达尾节点会直接跳出循环)
p = p->next;//由于L的数据是空的,所以这里直接略掉了头节点
j++;}if(j != i -1){//若游标p没有在待插入位置的前一个位置,说明已经越界printf("插入元素越界!\n");return0;}
q =(DCLNode*)malloc(sizeof(DCLNode));
q->data = e;
q->next = p->next;//将新增元素的指针指向游标p的下一个元素
p->next->prior = q;
q->prior = p;
p->next = q;//将游标p的指针指向新增元素return1;}//在带头节点的双向循环链表L中删除第i个元素,并由e返回其值,成功则返回1,失败返回0intdeletLinkList(DCLinkList L,int i, ElemType* e){
DCLNode *p,*q;int j =0;
p = L;while(p->next != L&&j < i -1){//不断移动游标p,直到指向要删除的前一个位置
p = p->next;
j++;}if(p->next == L||j != i -1){printf("删除元素越界!\n");return0;}
q = p->next;//q表示要删除的元素*e = q->data;//获取要删除的元素的值
p->next = q->next;//游标p指向要删除元素的下一个位置
q->next->prior = p;free(q);//释放已删除元素的空间return1;}//在带头节点的双向循环链表L中查找与给定元素e相同的位序intlocateLinkList(DCLinkList L, ElemType e){int i =0;
DCLNode* p;
p = L->next;while(p->next != L&&p->data != e){
p = p->next;
i++;}if(p->data != e)return0;return++i;}
/*main.cpp*/#include"doublecyclelinklist.h"intmain(){
DCLinkList L;int n, i, e, state;printf("请输入创建链表的长度:");scanf("%d",&n);
L =createLinkList(n);printLinkList(L);printf("请输入插入元素在链表的位置:");scanf("%d",&i);printf("请输入插入链表的元素:");scanf("%d",&n);insertLinkList(L,i,n);printLinkList(L);printf("请输入删除链表的位置:");scanf("%d",&i);deletLinkList(L, i,&e);printf("删除的元素为:%d\n", e);printLinkList(L);printf("请输入查找的元素:");scanf("%d",&e);
state =locateLinkList(L, e);if(state){printf("链表中元素%d的位置为%d:\n", e, state);}elseprintf("查无此数!\n");return1;}