带尾指针循环单链表基本操作
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a7c4142a9610525a50321871f1efcf02.png)
定义存储结构类型
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*LinkList;
尾插法创建带尾指针循环单链表
void CreateList_R(LinkList *L,int n)
{
LNode *p,*q;
int i;
p = q = (LinkList)malloc(sizeof(LNode));
printf("为单链表输入%d个元素:",n);
for(i=0;i<n;i++)
{
q->next = (LinkList)malloc(sizeof(LNode));
q = q->next;
scanf("%d",&q->data);
q->next = p;
*L = q;
}
}
头插法创建带尾指针循环单链表
void CreateList_H(LinkList *LTail,int n)
{
int i;
*LTail = (LinkList)malloc(sizeof(LNode));
LNode *LHead = (LinkList)malloc(sizeof(LNode));
(*LTail)->next = LHead;
LHead->next = *LTail;
printf("为单链表输入%d个元素:",n);
scanf("%d",&((*LTail)->data));
for(i=0;i<n-1;i++)
{
LNode *tmp_node = (LinkList)malloc(sizeof(LNode));
tmp_node->next = LHead->next;
scanf("%d",&tmp_node->data);
LHead->next = tmp_node;
}
}
将两个带尾指针循环单链表合并
void Union(LinkList La,LinkList Lb)
{
LNode *tmp_node = La->next;
La->next = Lb->next->next;
free(Lb->next);
Lb->next = tmp_node;
}
遍历尾指针循环单链表
Status print(LinkList L)
{
LNode *head;
head = L->next;
if(head == L) return ERROR;
while(head != L)
{
head = head->next;
printf("%d ",head->data);
}
return OK;
}
测试代码
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*LinkList;
void CreateList_R(LinkList *L,int n)
{
LNode *p,*q;
int i;
p = q = (LinkList)malloc(sizeof(LNode));
printf("为单链表输入%d个元素:",n);
for(i=0;i<n;i++)
{
q->next = (LinkList)malloc(sizeof(LNode));
q = q->next;
scanf("%d",&q->data);
q->next = p;
*L = q;
}
}
void CreateList_H(LinkList *LTail,int n)
{
int i;
*LTail = (LinkList)malloc(sizeof(LNode));
LNode *LHead = (LinkList)malloc(sizeof(LNode));
(*LTail)->next = LHead;
LHead->next = *LTail;
printf("为单链表输入%d个元素:",n);
scanf("%d",&((*LTail)->data));
for(i=0;i<n-1;i++)
{
LNode *tmp_node = (LinkList)malloc(sizeof(LNode));
tmp_node->next = LHead->next;
scanf("%d",&tmp_node->data);
LHead->next = tmp_node;
}
}
Status print(LinkList L)
{
LNode *head;
head = L->next;
if(head == L) return ERROR;
while(head != L)
{
head = head->next;
printf("%d ",head->data);
}
return OK;
}
void Union(LinkList La,LinkList Lb)
{
LNode *tmp_node = La->next;
La->next = Lb->next->next;
free(Lb->next);
Lb->next = tmp_node;
}
int main()
{
LinkList La,Lb;
printf("------尾插法录入数据-------\n");
CreateList_R(&La,3);
printf("当前La链: ");
print(La);
printf("\n");
printf("------头插法录入数据-------\n");
CreateList_H(&Lb,4);
printf("当前Lb链: ");
print(Lb);
printf("\n");
printf("----带尾指针循环链表合并-----\n");
Union(La,Lb);
printf("当前合链: ");
print(Lb);
}