循环单链表的基本操作:初始化,创建,合并两个循环单链表,删除前驱,查找元素,打印链表

此代码可以正常运行

#include<stdio.h>
#include<stdlib.h>

typedef struct LNode
{
	int data;
    struct LNode *next;

}LNode,*LinkList;
enum Status{ERROR,OK};

//创建一个循环链表
Status CreateList(LinkList &L,int n)
{
	LinkList p,q,head,rear;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	head=L;
    p=head;
	for(int i=0;i<n;i++)
	{
		q=(LinkList)malloc(sizeof(LNode));
		scanf("%d",&q->data);
		q->next=NULL;
		p->next=q;
		p=q;
	}
	while(!p->next)
	{
		rear=p;
		rear->next=head;
	}
	printf("\n");
	return OK;
}


LinkList Connect(LinkList Ta,LinkList Tb)  //  为非空单循环链表的合并
{
  LinkList p=Ta->next,rear,k;
  while(p->next!=Ta)
	  p=p->next;
  p->next=Tb->next;
  while(p->next!=Tb)
  p=p->next;
  p->next=Ta;
  return Ta;
}

//找第m个元素
LinkList Element(LinkList L,int m)
{
	LinkList pm=L;
	while(m--)
	{
		pm=pm->next;
	}
	return pm;
}

//删除第m个结点的前驱
Status Delete(LinkList pm)
{
	LinkList s=pm,r=s;
	while(s->next!=pm)
	{
		r=s;
		s=s->next;
	}
	r->next=pm;
	free(s);
	return OK;
}

Status show(LinkList L)   //展示单链表
{
  LinkList q=L;
  printf("now ,look the list\n");
  while(q->next!=L)
  {
   q=q->next;
   printf("%d ",q->data);
  }
  printf("\n");
  return OK;
}

main()
{
  LinkList Ta,Tb,T,p;
  int n,m;
  printf("enter the length of list1 and list2\n");
  scanf("%d %d",&n,&m);
  printf("enter datas\n");
  CreateList(Ta,n); 
  show(Ta);
  printf("enter datas\n");
  CreateList(Tb,m);
  show(Tb);

  T=Connect(Ta,Tb);
  show(T);
  printf("enter m\n");
  scanf("%d",&m);
  p=Element(T,m);
  printf("now,delete the node before m\n");
  Delete(p);
  show(T);

return 0;
}

发布了57 篇原创文章 · 获赞 54 · 访问量 2334

猜你喜欢

转载自blog.csdn.net/September_C/article/details/105544580
今日推荐