目录
一、结构体
typedef struct looplinklist
{
union {
int len;
int data;
};
struct looplinklist *next;
} Loop, *loop;
二、创建头节点
loop looplinklist_create()
{
loop H = (loop)malloc(sizeof(Loop));
if (H == NULL)
{
printf("头节点内存空间创建失败\n");
return NULL;
}
H->len = 0;
H->next = H;
printf("头节点内存空间创建成功\n");
return H;
}
三、创建子节点
loop node_create(int data)
{
loop p = (loop)malloc(sizeof(Loop));
if (p == NULL)
{
printf("节点内存空间创建失败\n");
return NULL;
}
else
{
p->data = data;
return p;
}
}
四、插入
1.头插
void head_insert_looplinklist(loop H, int data)
{
if (H == NULL)
{
printf("入参为空\n");
return;
}
loop newnode = node_create(data);
newnode->next = H->next;
H->next = newnode;
H->len++;
}
2.尾插
void tail_insert_linklist(loop H, int data)
{
if (H == NULL)
{
printf("入参为空\n");
}
else
{
loop p = H;
while (p->next != H)
p = p->next;
loop newnode = node_create(data);
newnode->next = H;
p->next = newnode;
H->len++;
}
}
五、删除
1.尾删
void delete_tail_looplinklist(loop H)
{
if (H == NULL)
{
printf("入参为空\n");
return;
}
else if (H->next == H)
{
printf("链表为空,无法删除\n");
return;
}
else if (H->next->next == H)
{
H->next->next = NULL;
free(H->next);
H->next = H;
H->len--;
return;
}
loop p = H;
while (p->next->next != H)
p = p->next;
p->next->next = NULL;
free(p->next);
p->next = H;
H->len--;
}
2.删除头结点
loop delete_head_looplinklist(loop H)
{
if (H == NULL)
{
printf("入参为空\n");
return NULL;
}
else if (H->next == H)
{
H->next = NULL;
free(H);
return NULL;
}
loop p = H;
while (p->next != H)
p = p->next;
p->next = H->next;
H->next = NULL;
free(H);
return p->next;
}
六、打印
1.普通打印
void print_looplinklist(loop H)
{
if (H == NULL)
{
printf("入参为空\n");
return;
}
loop p = H->next;
while (p != H)
{
printf("p->data=%d\n", p->data);
p = p->next;
}
}
2.没有头节点的打印
//没有头节点的打印
//do while的原因:有头节点时,从头节点后一个开始打印,全程不打印头节点
//没有头节点时,需要打印开始指针所指向的元素,并不会从该节点后一个开始打印
//所以要先打印该节点,再循环
void unnode_print_looplinklist(loop S)
{
if (S == NULL)
{
printf("入参为空\n");
return;
}
loop p = S;
do
{
printf("p->data=%d\n", p->data);
p = p->next;
} while (p != S);
}