C语言循环链表(尾指针),含链表的头插,尾插,合并
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//带头节点的循环链表
typedef struct Lnode {
struct Lnode* next;
int data;
} Lnode, *linkList;
//循环链表的初始化
void initLink(linkList* tail) {
*tail = (linkList)malloc(sizeof(Lnode)); //创建一个头节点
(*tail)->data = NULL;
(*tail)->next = *tail;
}
//循环链表的插入(头插)
void insertLinkhHead(linkList* tail, int e) {
Lnode* node = (Lnode*)malloc(sizeof(Lnode));
node->data = e;
if ((*tail)->next == (*tail))
{
//没有节点
node->next = *tail;
(*tail)->next = node;
*tail = node;
}
else
{
//已经有了节点
node->next = (*tail)->next->next;
(*tail)->next->next = node;
}
}
//循环链表的插入(尾插)
void insertLinkTail(linkList* tail, int e) {
Lnode* node = (Lnode*)malloc(sizeof(Lnode));
node->data = e;
node->next = (*tail)->next;
(*tail)->next = node;
*tail = node;
}
//循环链表的遍历
void show(Lnode* tail) {
if (tail->next == tail)
{
printf("链表中没有元素\n");
}
else
{
Lnode* p = tail->next->next;
int i = 0;
while (p != tail->next)
{
printf("链表中的第%d个元素是%d\n", i++, p->data);
p = p->next;
}
}
}
//循环链表的合并
void merage(linkList* tail1, linkList* tail2) {
linkList* p = (*tail1)->next;
(*tail1)->next = (*tail2)->next->next;
free((*tail2)->next);
(*tail2)->next = p;
}
void main() {
linkList tail;
initLink(&tail);
for (int i = 0; i < 5; i++)
{
insertLinkhHead(&tail, i);
}
show(tail);
for (int i = 5; i < 10; i++)
{
insertLinkTail(&tail, i);
}
show(tail);
printf("测试循环链表的合并\n");
linkList tail02;
initLink(&tail02);
for (int i = 20; i < 25; i++)
{
insertLinkhHead(&tail02, i);
}
show(tail02);
printf("合并==start==\n");
merage(&tail, &tail02);
show(tail02);
printf("合并==end==\n");
}
5115

被折叠的 条评论
为什么被折叠?



