双向链表的优点,可以很方便的访问前驱结点和后驱结点,且一般构造成循环链表
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct DuLNode
{
datatype data;
struct DuLNode *prior,*next;
}*DuLinkList,DuLNode;
int flag = -1;
//创建双向链表
DuLinkList Create_List()
{
int data;
DuLinkList L,s,p;
L = (DuLinkList)malloc(sizeof(DuLNode));
if(L)
{
L->next = L->prior = L;
}
else
return NULL;
p = L;
scanf("%d",&data);
while(data != flag)
{
s = (DuLinkList)malloc(sizeof(DuLNode));
s->data = data;
s->prior = p;
s->next = L;
p->next = s;
p = s;
scanf("%d",&data);
}
return L;
}
//计算长度
int ListLength(DuLinkList L)
{
DuLinkList p = L->next;
int i = 0;
while(p != L)
{
i++;
p = p->next;
}
return i;
}
//查找元素地址
DuLinkList GetDataPos(DuLinkList L,int i)
{
int j;
DuLinkList p = L;
if(i < 0 || i > ListLength(L))
{
return NULL;
}
for(j = 0; j <= i; j++)
{
p = p->next;
}
return p;
}
//在位置i之前插入元素data
int Insert_List(DuLinkList L,int i,datatype data)
{
DuLinkList p,s;
if(i < 1 || i > ListLength(L) + 1)
{
return 0;
}
p = GetDataPos(L,i-1);
if(!p)
return 0;
s = (DuLinkList)malloc(sizeof(DuLNode));
if(!s)
{
return 0;
}
s->data = data;
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
return 1;
}
void print(DuLinkList L)
{
DuLinkList p = L->next;
while(p != L)
{
printf("%d ",p->data);
p = p->next;
}
int len = ListLength(L);
printf("\nLength = %d\n",len);
}
void main()
{
DuLinkList L = Create_List();
print(L);
int pos,data;
printf("要插入的位置和数据");
scanf("%d %d",&pos,&data);
Insert_List(L,pos,data);
print(L);
}