单向循环链表

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

//创建链表
List *CreateList()
{
	//给List(头结点)分配空间
	List *ls = (List *)malloc(sizeof(List)/sizeof(char)); 
	if (NULL == ls)
		return NULL;
	//给Node(结点·)分配空间
	ls->head = (Node *)malloc(sizeof(Node)/sizeof(char)); 
	if (NULL == ls->head)
	{
		free(ls);
		return NULL;
	}
	ls->head->next = ls->head;
	return ls;
}


//销毁链表
void Distory(List *ls)
{
	if (NULL == ls)
		return ;
	Node *tmp = ls->head;
	while(tmp->next != ls->head)
	{
		Node *p = tmp->next;
		tmp->next = p->next;
		free(p);
	}
	free(ls->head);
	free(ls);
}

//头插
BOOL Insert_Head (List *ls,Data data)
{
	if(NULL == ls)
		return ERROR;
	Node *node = (Node *)malloc(sizeof(node)/sizeof(char));
	if (NULL == node)
		return ERROR;
	node->data = data;
	node->next = ls->head->next;
	ls->head->next = node;
	return TRUE;
}

//尾插
BOOL Insert_Last (List *ls,Data data)
{
	if (NULL == ls)
		return ERROR;
	Node *node = (Node *)malloc(sizeof(node)/sizeof(char));
	if (NULL == node)
		return ERROR;
	Node *tmp = ls->head;
	while(tmp->next != ls->head)
	{
		tmp = tmp->next;
	}
	tmp->next = node;
	node->data = data;
	node->next = ls->head;
	return TRUE;
}

//在pos位置插入
BOOL Insert_Pos (List *ls, int pos, Data data)
{
	if (NULL == ls)
		return ERROR;
	
	int i ;
	Node *tmp = ls->head;
	for(i = 0 ; i < (pos-1) ; i++)
	{
		tmp = tmp->next;
		if(ls->head == tmp)       //检测是否越界
		{
			printf ("长度越界 %d\n",i);
			return ERROR;
		}
		
	}
	//创建新结点
	Node *node = (Node *)malloc(sizeof(node)/sizeof(char));
	if (NULL == node)
		return ERROR;
	//插入	
	node->data = data;
	node->next = tmp->next;
	tmp->next = node;
}

//删除第pos位
BOOL Delete_Pos (List *ls, int pos)
{
	if (NULL == ls)
		return ERROR;
	
	int i ;
	Node *tmp = ls->head;
	for(i = 0 ; i < (pos-1) ; i++)
	{
		tmp = tmp->next;
		if(ls->head == tmp || ls->head == tmp->next)       //检测是否越界
		{
			printf ("长度越界 %d\n",i);
			return ERROR;
		}
	}
	
	Node *p = tmp->next;
	tmp->next = p->next;
	free(p);
	return TRUE;
}

//根据数据删除
BOOL Delete_Data (List *ls, Data data)
{
	if (NULL == ls)
		return ERROR;
	
	Node *tmp = ls->head;
	while (tmp->next != ls->head)
	{
		if(tmp->next->data == data)       
		{
			Node *p = tmp->next;
			tmp->next = p->next;
			free(p);
			return TRUE;
		}
		tmp = tmp->next;
	}
	return FALSE;
}

//链表逆序
BOOL Reverse (List *ls)
{
	//NULL == ls || NULL == ls->head 链表不存在
	//NULL == ls->head->next         空链表
	// NULL == ls->head->next->next  只有一个结点的链表
	if(NULL == ls || NULL == ls->head || ls->head == ls->head->next || ls->head == ls->head->next->next)
	return ERROR;
	
	Node *pre = ls->head->next;  //第一个结点
	Node *cur = pre->next;       //第二个结点
	Node *tmp;                   //保存当前结点的下一个结点
	
	while (cur != ls->head)
	{
		tmp = cur->next;         //核
		cur->next = pre;         //心
		
		pre = cur;               //代
		cur = tmp;               //码
	}
	
	ls->head->next->next = ls->head;
	ls->head->next = pre;
	
	return TRUE;
}

//打印
void Display(List *ls)
{
	Node *tmp = ls->head->next;
	while(tmp != ls->head)
	{
		printf ("%-4d",tmp->data);
		tmp = tmp->next;
	}
	printf ("\n");
}

//倒数第K个值
Data CountBackwards(List *ls,int k)
{
	if (NULL == ls)
		return NULL;
	Node *tmp = ls->head;
	int i;
	for (i = 0; i < k; i++)
	{
		tmp = tmp->next;
		if(NULL == tmp)
		{
			printf("长度越界\n");
			return;
		}
	}
	Node *p1 = ls->head;
	Node *p2 = ls->head;
	for(i = 0; i < k-1; i++)
	{
		p1 = p1->next;
	}
	while(p1->next)
	{
		p1 = p1->next;
		p2 = p2->next;
	}
	return p2->data;
}

//中间数的值
//Data Middle(List *ls)


















 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值