循环链表设计

 上面内存结构分析,下面数据结构分析:

 下面插入与删除分析:

 代码设计:circlelist.h

#ifndef _CIRCLELIST_H_
#define _CIRCLELIST_H_


//数据节点
typedef struct _circle_list_node circle_list_node;

typedef struct _circle_list_node{
	int data;
	circle_list_node *next;
}circle_list_node;



//头节点
typedef struct _t_circle_list{
	int length;
	circle_list_node *next;
}t_circle_list;


t_circle_list *create_list();
void clear(t_circle_list *t_list);
void destroy(circle_list_node *node,int end_index);
int get_len(t_circle_list *t_list);
int insert_value(t_circle_list *t_list,int value,int pos);
circle_list_node *get(t_circle_list *t_list,int pos);
circle_list_node *delete_node(t_circle_list *t_list,int pos);
circle_list_node *get_behind_node(t_circle_list *t_list);
void print_node(t_circle_list *t_list);


#endif

实现文件:circlelist.c

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


t_circle_list *create_list()
{
	t_circle_list *t_list = (t_circle_list*)malloc(sizeof(t_circle_list));
	if(t_list != NULL) {
		t_list->length = 0;
		t_list->next = NULL;
	}
	return t_list;
}

void clear(t_circle_list *t_list)
{
	if(t_list != NULL) {
		t_list->length = 0;
	}
}

void destroy(circle_list_node *node,int end_index)
{
	//这里数据节点应该循环删除,因为每一个节点都malloc了一个节点空间
	if(end_index < 0) {
		return;
	} else {
		//先移动,在把所有接点全部释放掉
		end_index--;
		destroy(node->next,end_index);
		free(node);//释放这片空间也是可以访问,数据会变成乱码,操作系统可以随时调用
	}
}

int get_len(t_circle_list *t_list)
{
	int res = -1;
	if(t_list != NULL) {
		res = t_list->length;
	}
	return res;
}

//得到尾节点
circle_list_node *get_behind_node(t_circle_list *t_list) 
{
	circle_list_node *res = NULL;
	if(t_list != NULL) {
		//根据序号来进行移动
		if(t_list->next == NULL || get_len(t_list) == 0) {
			res = t_list->next;
		} else {
			circle_list_node *p_cur = (circle_list_node*)t_list;
			int i;
			for(i = 0;i < get_len(t_list);i++) {
				p_cur = p_cur->next;
			}
			res = p_cur;
		}
	}
	return res;
}


int insert_value(t_circle_list *t_list,int value,int pos)
{
	int res = t_list != NULL && pos >= 0 && pos <= get_len(t_list);
	if(res) {
		//创建空间链接值
		circle_list_node *node = (circle_list_node*)malloc(sizeof(circle_list_node));
		node->data = value;
		//下面链接到链表里面去
		int i;
		circle_list_node *p_cur = (circle_list_node*)t_list;
		for(i = 0;i < pos;i++) {
			p_cur = p_cur->next;
		}
		circle_list_node *p_next = p_cur->next;
		p_cur->next = node;
		node->next = p_next;
		//在第一个节点插入元素与插入是第一个节点插入处理不一样
		if(get_len(t_list) == 0) {
			node->next = node;//第一个节点让next指向自己
		} else if(pos == 0){
			circle_list_node *last_node = get_behind_node(t_list);
			last_node->next = node;;
		}
		t_list->length++;
	}
	return res;
}

circle_list_node *get(t_circle_list *t_list,int pos) 
{
	circle_list_node *res = NULL;
	if(t_list != NULL && pos >= 0 && pos < get_len(t_list)) {
		circle_list_node *p_cur = (circle_list_node*)t_list;
		int i = 0;
		for(;i < pos;i++) {
			p_cur = p_cur->next;
		}
		res = p_cur->next;
	}
	return res;
}

circle_list_node *delete_node(t_circle_list *t_list,int pos)
{
	circle_list_node *res = get(t_list,pos);
	if(res != NULL && pos >= 0 && pos < get_len(t_list)) {
		circle_list_node *last_node = get_behind_node(t_list);
		circle_list_node *p_cur = (circle_list_node*)t_list;
		int i = 0;
		for(;i < pos;i++) {
			p_cur = p_cur->next;
		}
		circle_list_node *p_del = p_cur->next;
		p_cur->next = p_del->next;
		if(pos == 0) {
			//得到最后一个节点
			last_node->next = p_del->next;//指向删除节点下一个节点
		}
		t_list->length--;
	}
	return res;
}

//打印
void print_node(t_circle_list *t_list) 
{
	if(t_list != NULL) {
		circle_list_node *p_cur = (circle_list_node*)t_list->next;
		circle_list_node *p_loop = p_cur->next;
		circle_list_node *p_first = (circle_list_node*)t_list->next;
		printf("%p %d %p\n",p_first,p_first->data,p_first->next);
		//循环链表
		while(p_loop != p_first) {
			printf("%p %d %p\n",p_loop,p_loop->data,p_loop->next);
			p_loop = p_loop->next;
		}
	}
}



测试文件:main.c

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


int main(){
        t_circle_list *t_list = create_list();
	printf("before:%d\n",get_len(t_list));
	insert_value(t_list,45,get_len(t_list));	
	insert_value(t_list,78,get_len(t_list));	
	insert_value(t_list,56,get_len(t_list));	
	insert_value(t_list,47,get_len(t_list));
	printf("after:%d\n",get_len(t_list));
	printf("\n------------------\n");
	print_node(t_list);
	delete_node(t_list,1);
	printf("\n-----\n");
	print_node(t_list);
	delete_node(t_list,0);
	printf("\n-----\n");
	print_node(t_list);
	printf("\n-----\n");
	circle_list_node *p_head = (circle_list_node*)t_list;
	destroy(p_head,get_len(t_list));
	print_node(t_list);	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值