双向循环链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
DuLinkListMain.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"


/**//*简单测试程序*/
int main(int argc, char **argv)

...{
ElemType elem;
LinkList pDuList;

InitList(&pDuList);

ListInsert(&pDuList, 1, 2);

printf("%d %d ", pDuList->data, pDuList->next->data);

ListDelete(&pDuList, 1, &elem);
printf("The delete element is %d ", elem);

DestroyList(&pDuList);

return 0;
}
linklist.h
#ifndef _LINKLIST_H
#define _LINKLIST_H

typedef int ElemType;

typedef struct DuLinkNode...{
ElemType data;
struct DuLinkNode *prior;
struct DuLinkNode *next;
}LNode, *LinkList;

int InitList(LinkList *head);
int DestroyList(LinkList *head);
int ListInsert(LinkList *head, int i, ElemType e);
int ListDelete(LinkList *head, int i, ElemType *e);
int ListSearch(LinkList head, ElemType e);
int GetElem(LinkList head, int i, ElemType *e);

#endif
linklist.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"


/**//*产生头结点为head的空双向链表*/
int InitList(LinkList *head)

...{
*head = (LinkList)malloc(sizeof(LNode));
if(!(*head))
return 0;
(*head)->next = *head;
(*head)->prior = *head;

(*head)->data = 0; /**//*链表长度*/

return 1;
}


/**//*操作结果:销毁头结点为head双向链表*/
int DestroyList(LinkList *head)

...{
LinkList p, q;

p = (*head)->next;
while(p != *head)

...{
q = p->next;
free(p);
p = q;
}
free(*head);
*head = NULL;

return 1;
}


/**//*在头结点为head的双链线性表中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1*/
int ListInsert(LinkList *head, int i, ElemType e)

...{
int j;
LinkList p, s;

j = 1;
p = (*head)->next;
while(p && j < i)

...{
p = p->next;
j++;
}
if(!(s = (LinkList)malloc(sizeof(LNode))))
return 0;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;

return 1;
}


/**//*删除带头结点的双链线性表的第i个元素,i的合法值为1≤i≤表长*/
int ListDelete(LinkList *head, int i, ElemType *e)

...{
int j;
LinkList p;

j = 1;
p = (*head)->next;
while(p && j < i)

...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);

return 1;
}


/**//*带头结点的双链线性表中查找是否含有值为e的节点*/
int ListSearch(LinkList head, ElemType e)

...{
LinkList p;

p = head->next;
while(p != NULL && p->data != e)

...{
p = p->next;
}
if(p != NULL)
return 1;
else
return 0;
}


/**//*当第i个元素存在时,其值赋给e并返回1,否则返回0*/
int GetElem(LinkList head, int i, ElemType *e)

...{
int j;
LinkList p;

p = head->next;
j = 1;
while(p && j < i)

...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;

return 1;
}
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
DuLinkListMain.c

























linklist.h



















linklist.c






































































































































