循环链表的建立(尾指针)

一、基本思路

1.如果要遍历到最后一个元素,使用头指针的时间复杂度是O(n),若使用尾指针,查找最后一个和第一个的时间复杂度都是O(1);

2.利用函数返回尾指针,通过传递尾指针来完成函数操作;

二、代码如下:


/*
          项目名称:循环链表的建立与基本操作

		  编译环境:VC++ 2008
		  
		  作者相关:。。。
		  
		  最后修改:2019.6.3


          学习目标:1.掌握循环链表的基本操作
		   
		            2.利用尾指针实现的循环链表

          注意事项:1.测试所有功能是否正常

		            2.判断返回的指针值是否有效合法,要看指针所指对象的存储位置在哪,不是看指针是否为局部变量

                    3.使用随机数创建链表时,如果没有延时或延时太短,则建立的链表相同


*/

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

#define OK    1
#define ERROR 0
#define TRUE  1
#define FALSE 0

typedef int   ElemType;
typedef bool  Status;



//定义链表结点结构体
typedef struct Node
{
    ElemType data;
	struct Node *next;

}Node,*LinkList;


//函数声明
Status     ListEmpty( LinkList L );

LinkList   CreateListTail( LinkList *L, int n );//返回尾指针

Status     Match_List(LinkList rear1,LinkList rear2);

Status     OutList_Tail(LinkList rear);//输出尾指针建立的链表

Status     DestroyList( LinkList *L );


int main()
{
    LinkList L1,L2;
   
    LinkList rear1 = CreateListTail(&L1,10);

	printf("使用尾指针建立的循环链表L1为: ");
	OutList_Tail(rear1);

	for(int i=0;i<200000000;i++)//这个地方如果不延时,两个链表的数据会相同
	{
	
	}
	LinkList rear2 = CreateListTail(&L2,10);
  
	printf("使用尾指针建立的循环链表L2为: ");
	OutList_Tail(rear2);

	Match_List(rear1,rear2);
	printf("将L1、L2合并,以L2为头指针,rear1为尾指针得到循环链表为:\n\n");
    OutList_Tail(rear1);

	printf("\n");

    if(DestroyList(&L2))
	{
	    printf("循环链表已被销毁\n\n");
	}
	return 0;
}

Status DestroyList( LinkList *L )
{
    LinkList p,q;

	p = (*L)->next;//p指向第一个结点
    while(p!=*L)
	{
	    q = p->next;
		free(p);//释放p所指向结点的内存
		p = q;//p再指向下一个结点
	}

	free(*L);

	return OK;
}

Status ListEmpty( LinkList L )
{
    if(L->next != L)
		return FALSE;
    else
		return TRUE;
}

//随机产生n个数,利用尾插法完成链表的''整表创建''
LinkList CreateListTail( LinkList *L, int n )
{
	*L = (LinkList)malloc(sizeof(Node));
   
	LinkList rear = *L,s;
	
	srand(time(0));

	for(int i=0;i<n;i++)
	{
	    s = (LinkList)malloc(sizeof(Node));
		s->data = rand()%100+1;
		rear->next = s;
		rear = s;//更新rear的位置到尾结点
	}
	rear->next = *L;

	return rear;
}
//把L2接到L1上
Status     Match_List(LinkList rear1,LinkList rear2)
{
	if(!ListEmpty(rear1->next)&&!ListEmpty(rear2->next))
	{
		LinkList p  = rear1->next;
		rear1->next = rear2->next;
		rear2->next = p->next;

		free(p);
		return OK;
	}
	else

	    return ERROR;
}

Status   OutList_Tail(LinkList rear)
{
	LinkList p= rear->next->next;

	while(p != rear->next)
	{
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n\n");

	return OK;
}

三、效果

猜你喜欢

转载自blog.csdn.net/Sruggle/article/details/90756309