#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node*next, *prior;
}node,*link;
void ListIni(link *list)
{
*list = (link)malloc(sizeof(node));
if(*list)
{
exit(-1);
}
(*list)->data = -9;
(*list)->next = *list;
(*list)->prior = *list;
}
void ListDestroy(link *list)
{
link p = (*list)->next;
link q;
while(p != *list)
{
q = p->next;
free(p);
p = q;
}
free(*list);
*list = NULL;
}
void ListClear(link list)
{
link p = list->next;
link q;
while(p != list)
{
q = p->next;
free(p);
p = q;
}
list->next = list;
list->prior = list;
}
int ListEmpty(link list)
{
if(list->next != list && list->prior != list)
return 0;
else
return 1;
}
int ListLength(link list)
{
int i = 0;
link p = list->next;
while(p != list)
{
i++;
p = p->next;
}
return i;
}
int GetElem(link list, int i, int *e)
{
link p = list->next;
int j = 1;
while(j < i)
{
p = p->next;
j++;
}
if(p == list || j>i)
{
return -1;
}
*e = p->data;
return 0;
}
int ListLocate(link list, int cur, int (*compare)(int a, int b))
{
int i = 0;
link p = list->next;
while(p != list)
{
i++;
if(compare(cur,p->data))
{
return i;
}
p = p->next;
}
return -1;
}
int ListPrior(link list, int cur, int *pre)
{
link p = list->next->next;
while(p != list)
{
if(p->data == cur)
{
*pre = p->prior->data;
return 0;
}
p = p->next;
}
return -1;
}
int ListNext(link list, int cur, int *next)
{
link p = list->next;
while(p->next != list)
{
if(p->data = cur)
{
*next = p->next->data;
return 0;
}
p = p->next;
}
return -1;
}
link GetElemP(link list, int i)
{
int j = 1;
link p = list;
if(i < 0 || i > ListLength(list))
{
return NULL;
}
while(j <= i)
{
j++;
p = p->next;
}
return p;
}
int ListInsert(link list, int i, int e)
{
link p, s;
if(i < 1 || i > ListLength(list)+1)
{
return -1;
}
p = GetElemP(list,i-1);
if(!p)
{
return -1;
}
s = (link)malloc(sizeof(node));
if(!s)
{
return -1;
}
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
return 0;
}
int ListDelete(link list, int i, int *e)
{
link p;
if(i < 1)
{
return -1;
}
p = GetElemP(list,i);
if(!p)
{
return -1;
}
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return 0;
}
void ListTraverse(link list, void(*vi)(int a))
{
link p = list->next;
while(p != list)
{
vi(list->data);
p = p->next;
}
printf("\n");
}
void ListTraverseBack(link list, void(*vi)(int a))
{
link p = list->prior;
while(p != list)
{
vi(list->data);
p = p->prior;
}
printf("\n");
}
int main()
{
return 0;
}
带头结点的双向循环链表
最新推荐文章于 2022-11-21 21:17:53 发布