#include <stdio.h>
#include <stdlib.h>
typedef struct DNode {
int data;
struct DNode *prior,*next;
} DNode,*DListLink;
DListLink initListLink(DListLink &L) {
L = (DNode *)malloc(sizeof(DNode));
if(!L) return false;
L->next = L;
L->prior = L;
return L;
}
bool isEmpty(DListLink &L) {
if(L->next == L) {
return true;
}
return false;
}
bool isTail(DListLink &L,DNode *p) {
if(p->next == L) return true;
return false;
}
DNode *getElem(DListLink &L,int i) {
DNode *p = L->next;
int j = 1;
while(p != L && j < i) {
p = p->next;
j ++;
}
if(p->next == L) return NULL;
return p;
}
DNode *locateElem(DListLink &L,int e) {
DNode *p = L->next;
if(!p) return NULL;
while(p != L && p->data != e) {
p = p->next;
}
return p;
}
bool insertNextNode(DNode *p,DNode *s) {
if(!p || !s) return false;
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
bool insertNextNodeE(DNode *p,int e) {
if(!p) return false;
DNode *s;
s = (DNode *)malloc(sizeof(DNode));
if(!s) return false;
s->data = e;
return insertNextNode(p,s);
}
bool insertBeforeNode(DNode *p,DNode *s) {
if(!p || !s) return false;
return insertNextNode(p->prior,s);
}
bool insertPosition(DListLink &L,int i,int e) {
DNode *p = getElem(L,i - 1);
if(!p) return false;
return insertNextNodeE(p,e);
}
bool deleteNextNode(DNode *p) {
DNode *q = p->next;
p->next = q->next;
q->next->prior = p;
free(q);
return true;
}
bool deleteNode(DListLink &L,DNode *s) {
if(!s) return false;
return deleteNextNode(s->prior);
}
bool deletePositionNode(DListLink &L,int i,int &e) {
DNode *p;
p = getElem(L,i - 1);
DNode *q = p->next;
e = q->data;
return deleteNode(L,q);
}
int length(DListLink &L) {
int len = 0;
DNode *p = L->next;
while(p != L) {
p = p->next;
len ++;
}
return len;
}
DListLink tailCreateListLink(DListLink &L) {
initListLink(L);
DNode *s,*p = L;
int x;
while(scanf("%d",&x) != EOF) {
if(x == -1) break;
insertNextNodeE(p,x);
p = p->next;
}
return L;
}
DListLink headCreateListLink(DListLink &L) {
initListLink(L);
DNode *s;
int x;
while(scanf("%d",&x) != EOF) {
if(x == -1) break;
s = (DNode *)malloc(sizeof(DNode));
insertNextNodeE(L,x);
}
return L;
}
void print(DListLink &L ) {
DNode *p = L->next;
while(p != L) {
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return ;
}
int main() {
DListLink L;
printf("------------尾插法建立循环双链表:-----------------\n");
tailCreateListLink(L);
print(L);
printf("--------------循环单链表的长度-------------\n");
int len = length(L);
printf("循环单链表的长度是: %d\n",len);
printf("--------------按位查找 : 查找位序是 3 的循环单链表节点-------------\n");
DNode *p = getElem(L,3);
printf("按位查找 : 查找位序是 3 的循环单链表节点 %d\n",p->data);
printf("--------------按值查找 : 返回数据域是 999 的节点-------------\n");
DNode *q = locateElem(L,999);
if(q->data == 999) printf("已找到节点\n");
else printf("未找到节点!\n");
printf("--------------后插 : 在节点 p(3) 后面插入数据是 1000 的节点-------------\n");
print(L);
insertNextNodeE(p,1000);
printf("--------------后插 : 在节点 p(3) 后面插入数据是 1000 的节点 后的链表 : -------------\n");
print(L);
printf("--------------插入 : 在第 2 个位置插入节点 666-------------\n");
print(L);
insertPosition(L,2,666);
printf("--------------插入 : 在第 2 个位置插入节点 666 的节点后的链表 :-------------\n");
print(L);
printf("--------------前插操作 : 在 p 节点前插入节点 u(333)-------------\n");
DNode *u;
u = (DNode *)malloc(sizeof(DNode));
u->data = 333;
insertBeforeNode(p,u);
printf("--------------前插操作 : 在 p 节点前插入节点 u(333) 的节点后的链表:-------------\n");
print(L);
printf("--------------删除 : 删除指定节点 p-------------\n");
print(L);
deleteNode(L,p);
printf("--------------删除 : 删除指定节点 p 后的链表:-------------\n");
print(L);
return 0;
}
|