数据结构——双向链表实现(c语言)
代码:
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *prior;
struct LNode *rear;
}LNode, *LinkList;
LinkList InitList()
{
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
if (!L)
{
return 0;
}
L->data = 0;
L->prior = NULL;
L->rear = NULL;
return L;
}
int GetElem(LinkList L, int i, ElemType *e)
{
if (!L)
{
return 0;
}
LinkList p = L->rear;
int j = 1;
while (p && j < i)
{
p = p->rear;
++j;
}
if (!p || j > i)
{
return 0;
}
*e = p->data;
return 1;
}
int GetPriorElem(LinkList L, int i, ElemType *e)
{
if (!L)
{
return 0;
}
LinkList p = L->rear;
int j = 1;
while (p && j < i)
{
p = p->rear;
++j;
}
if (!p || !p->prior || j > i)
{
return 0;
}
*e = p->prior->data;
return 1;
}
int GetRearElem(LinkList L, int i, ElemType *e)
{
if (!L)
{
return 0;
}
LinkList p = L->rear;
int j = 1;
while (p && j < i)
{
p = p->rear;
++j;
}
if (!p || !p->rear || j > i)
{
return 0;
}
*e = p->rear->data;
return 1;
}
int InsertElem(LinkList L, int i, ElemType e)
{
if (!L)
{
return 0;
}
LinkList p = L;
LinkList s;
int j = 1;
while (p && j < i)
{
p = p->rear;
++j;
}
if (!p || j > i)
{
return 0;
}
s = (LinkList)malloc(sizeof(LNode));
if (!s)
{
return 0;
}
s->data = e;
s->prior = p;
s->rear = p->rear;
p->rear = s;
return 1;
}
int PrintList(LinkList L)
{
if (!L)
{
return 0;
}
LinkList p = L->rear;
while(p)
{
printf("%c ",p->data);
p = p->rear;
}
return 1;
}
int DestoryList(LinkList L)
{
if (!L)
{
return 0;
}
LinkList p;
while(L)
{
p = L->rear;
free(L);
L = p;
}
return 1;
}
int main(int argc, char *argv[])
{
ElemType e;
LinkList L = InitList();
InsertElem(L, 1, 'a');
InsertElem(L, 2, 'b');
InsertElem(L, 3, 'c');
InsertElem(L, 4, 'd');
GetElem(L, 2, &e);
printf("%c ", e);
GetPriorElem(L, 2, &e);
printf("%c ", e);
GetRearElem(L, 2, &e);
printf("%c ", e);
PrintList(L);
DestoryList(L);
return 1;
}