数据结构——单循环链表的

循环链表:循环链表是一个首尾相接的链表。将单链表最后一个结点的指针域由NULL改为指向表头结点,就得到了单链形式的循环链表,并称为循环单链表。同样还可以有多重链的循环链表。

//定义结构体
typedef struct Node {
 int data;
 struct Node *next;
}Node,*LinkList;

	//初始化循环单链表:
    LinkList *InitCLinkList(LinkList *CL)//CL用来接收待初始化的循环单链表的头指针变量的地址
	{
 		*CL = (Node *)malloc(sizeof(Node));//建立头结点
 		(*CL)->next = *CL;//建立空的循环单链表CL
 		return CL;
	}

//尾插法建立单链表,并让最后一个结点的指针域指向头结点
void CreateFromTail(LinkList CL)//尾插法建立单链表
{
 Node *s, *rear;
 int i;
 rear = (Node *)CL;
 int flag = 1;
 while (flag)
 {
  scanf("%d", &i);
  if (i != -1)
  {
   s = (Node *)malloc(sizeof(Node));
   s->data = i;
   rear->next = s;
   rear = s;
  }
  else
  {
   flag = 0;
   
  }
 }
 rear->next = CL;
}

//循环单链表的合并算法,此算法的时间复杂度为:O(n)
LinkList merge_1(LinkList LA, LinkList LB)
{
 Node *p, *q;
 p = LA;
 q = LB;
 while (p->next != LA)
 {
  p = p->next;
 }
 while (q->next != LB)
 {
  q = q->next;
 }
 q->next = LA;
 p->next = LB->next;
 free(LB);
 return LA;
}
//循环单链表的的合并算法,此算法的时间复杂度为:O(1)
LinkList merge_2(LinkList LC, LinkList LD)
{
 Node *p;
 p = LC->next;
 LC->next = LD->next->next;
 free(LD->next);
 LD->next = p;
 return LD; 
}
//打印输出单链表
void print(LinkList CL)
{
 Node *p;
 p = CL->next;
 printf("单循环链表中的元素为:");
 while (p!=CL)
 {
  printf("%5d", p->data);
  p = p->next;
 }
 printf("\n");
}
//验证
int main()
{
 LinkList CL;
 InitCLinkList(&CL);
 printf("请输入数据,输入-1结束:\n");
 CreateFromTail(CL);
 print(CL);
 system("CLS");
 printf("请输入表A的数据,输入-1结束:\n");
 LinkList LA;
 InitCLinkList(&LA);
 CreateFromTail(LA);
 print(LA);
 printf("请输入表B的数据,输入-1结束:\n");
 LinkList LB;
 InitCLinkList(&LB);
 CreateFromTail(LB);
 print(LB);
 merge_1(LA, LB);
 print(LA);
 printf("merge_1的算法时间复杂度为:O(n)");
 //system("CLS");
 printf("\n请输入表C的数据,输入-1结束:\n");
 LinkList LC;
 InitCLinkList(&LC);
 CreateFromTail(LC);
 print(LC);
 printf("请输入表D的数据,输入-1结束:\n");
 LinkList LD;
 InitCLinkList(&LD);
 CreateFromTail(LD);
 print(LD);
 merge_2(LC, LD);
 print(LD);
    return 0;
}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值