C语言循环链表(尾指针),含链表的头插,尾插,合并
#include#include #include //带头节点的循环链表 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个元素是%dn", 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"); }



