#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node,*link;
void ListIni(link *list)
{
*list = (link)malloc(sizeof(node));
if(!(*list))
{
exit(-1);
}
(*list)->data = -9;
(*list)->next = *list;
}
int ListLength(link list)
{
int i = 0;
link p = list->next;
while(p != list)
{
i++;
p = p->next;
}
return i;
}
void ListDestroy(link *list)
{
//*list原指向尾节点
*list = (*list)->next;//头结点
link p = (*list)->next;//第一个节点
link q;
while(p->next != *list)
{
q = p->next;
free(p);
p = q;
}
free(*list);
*list = NULL;
}
int ListInsert(link *list, int i, int e)
{
int j = 0;
//*list = (*list)->next;//*list尾结点,(*list)->next头节点
link p = (*list)->next;//第一个节点;
if(i < 0 || i > ListLength(*list) + 1)
{
return -1;
}
while(j < i)
{
p = p->next;
j++;
}
link tmp = (link)malloc(sizeof(node));
tmp->data = e;
tmp->next = p->next;
p->next = tmp;
if(p == *list)
{
*list = p;
}
return 0;
}
int ListDelete(link *list, int i, int *e)
{
//link p = (*list)->next;//第一个节点;
link p = *list;
int j = 0;
if(i <= 0 || i > ListLength(*list))
{
return -1;
}
link q;
while(j < i-1)
{
p = p->next;
j++;
}
q = p->next;
p->next = q->next;
*e = q->data;
if(q == *list)
{
*list = p;
}
free(q);
return 0;
}
void ListPrint(link list)
{
if(list != NULL)
{
link p = list->next;
while(p != list)
{
printf("%d\n",p->data);
p = p->next;
}
}
else
{
printf("list does not exist.\n");
}
}
void ListTraverse(link list, int(*vi)(int a))
{
link p = list->next;
while(p != list)
{
vi(p->data);
p = p->next;
}
printf("\n");
}
int GetElem(link list, int i, int *e)
{
int j = 1;
link p = list->next->next;
if(i <= 0 || i > ListLength(list) + 1)
{
return -1;
}
while(j < i)
{
j++;
p = p->next;
}
*e = p->data;
return 0;
}
int LocateElem(link list, int e, int(*compare)(int a, int b))
{
link p = list->next->next;
int i;
while(p != list->next)
{
i++;
if(compare(e,p->data))
{
return i;
}
p = p->next;
}
return -1;
}
int PriorElem(link list, int cur, int *pre)
{
link p = list->next->next;//第一个节点
link q = p->next;
while(q != list->next)
{
if(q->data == cur)
{
*pre = p->data;
return 0;
}
p = q;
q = q->next;
}
return -1;
}
int NextElem(link list, int cur, int *next)
{
link p = list->next->next;
while(p != list)
{
if(p->data == cur)
{
*next = p->next->data;
return 0;
}
p = p->next;
}
return -1;
}
int main()
{
link head;
ListIni(&head);
ListInsert(&head,1,1);
ListInsert(&head,1,2);
ListInsert(&head,3,3);
ListPrint(head);
int e = 0;
ListDelete(&head,1,&e);
printf("\n");
ListPrint(head);
return 0;
}
带尾节点的循环链表基本操作
最新推荐文章于 2023-01-10 22:42:27 发布