#include <stdio.h>
#include <stdlib.h>
#define FLAG -1
typedef struct Node
{
struct Node * prior;
int data;
struct Node * next;
}LNode,*LinkList;
void CreateDoubleLinkedList(LinkList L);
void CreateDoubleCircularLinkedList(LinkList L);
void ShowDoubleLinkedList(LinkList L);
void InsertDoubleLinkedList(LinkList L,int num,int local);
void DeleteDoubleLinkedList(LinkList L,int local);
LinkList GetLinkList(LinkList L,int local);
void CreateDoubleCircularLinkedList(L);
void ShowDoubleCircularLinkedList(LinkList L);
void InsertDoubleCircularLinkedList(LinkList L,int num,int local);
void DeleteDoubleCircularLinkedList(LinkList L,int local);
void main()
{
LinkList L = (LinkList)malloc(sizeof(LNode));
printf("创建双向循环链表:\n");
CreateDoubleCircularLinkedList(L);
printf("遍历双向链表:\n");
ShowDoubleCircularLinkedList(L);
printf("插入元素后的链表:\n");
InsertDoubleCircularLinkedList(L,100,3);
ShowDoubleCircularLinkedList(L);
printf("删除元素后的链表:\n");
DeleteDoubleCircularLinkedList(L,3);
ShowDoubleCircularLinkedList(L);
}
void CreateDoubleLinkedList(LinkList L)
{
LinkList r,s;
int x = 0;
r = L;
scanf("%d",&x);
while(x != FLAG)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
s->prior = r;
r = r->next;
scanf("%d",&x);
}
r->next = NULL;
}
void ShowDoubleLinkedList(LinkList L)
{
LinkList p = L->next;
printf("%d",p->data);
p = p ->next;
while(p != NULL)
{
printf("->%d",p->data);
p = p->next;
}
printf("\n");
}
void InsertDoubleLinkedList(LinkList L,int num,int local)
{
LinkList p;
int i;
i = local - 1;
p = GetLinkList(L,local - 1);
if(p == NULL)
{
printf("插入位置不合法!\n");
exit(1);
}
else
{
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = num;
s->next = p->next;
if(p->next)p->next->prior = s;
p->next = s;
s->prior = p;
}
}
void DeleteDoubleLinkedList(LinkList L,int local)
{
LinkList p,q;
p = GetLinkList(L,local - 1);
if(p == NULL)
{
printf("删除位置不合法!");
exit(1);
}
else
{
if(p->next == NULL)
{
printf("删除位置不合法!");
exit(1);
}
else
{
q = p->next;
p->next = q->next;
if(q->next)
q->next->prior = p;
free(q);
}
}
}
LinkList GetLinkList(LinkList L,int local)
{
LinkList p = L;
int j = 0;
while(p != NULL && j < local)
{
p = p->next;
j++;
}
return p;
}
void CreateDoubleCircularLinkedList(LinkList L)
{
LinkList r,s;
int x = 0;
r = L;
scanf("%d",&x);
while(x != FLAG)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
s->prior = r;
r = r->next;
scanf("%d",&x);
}
r->next = L;
L->prior = r;
}
void ShowDoubleCircularLinkedList(LinkList L)
{
LinkList p = L->next;
printf("%d",p->data);
p = p->next;
while(p != L)
{
printf("->%d",p->data);
p = p->next;
}
printf("\n");
}
void InsertDoubleCircularLinkedList(LinkList L,int num,int local)
{
LinkList p;
int i;
i = local - 1;
p = GetLinkList(L,local - 1);
if(p == L)
{
printf("插入位置不合法!\n");
exit(1);
}
else
{
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = num;
s->next = p->next;
p->next = s;
s->prior = p;
}
}
void DeleteDoubleCircularLinkedList(LinkList L,int local)
{
LinkList p,q;
p = GetLinkList(L,local - 1);
if(p == L)
{
printf("删除位置不合法!");
exit(1);
}
else
{
if(p->next == L)
{
printf("删除位置不合法!");
exit(1);
}
else
{
q = p->next;
p->next = q->next;
free(q);
}
}
}