基于连续存储空间的链表实现

根据算法导论 “10.3 Implementing pointers and objects” 这一章节实现。

list.h:

#ifndef _LINK_LIST_HEADER_

void init_list();
int  push_back(int key);
int push_front(int key);
void erase(int key);
void print_list(void);
#define _LINK_LIST_HEADER_
#endif//_LINK_LIST_HEADER_ 

list.c:

#include <stdio.h>
#include "list.h"

#define MAX_SIZE	100

struct list_element
{
	int prev;
	int next;
	int key;
	int used;
};

struct list_element g_list[MAX_SIZE];
int used_head, free_head;
int used_tail, free_tail;
int used_size, free_size;

void init_list(void)
{
	used_head  = -1;
	free_head = 0;
	free_tail = MAX_SIZE-1;
	used_tail = -1;
	int i;
	for(i = 0; i < MAX_SIZE -1; i++)
	{
		g_list[i].next = i+1;
		g_list[i].used = 0;

	}

	g_list[i].next = -1;
	g_list[i].used = 0;

	free_size = MAX_SIZE;
	used_size = 0;

}


int  push_back(int key)
{
	if( free_size == 0)
	{
		return 0;
	}
	
	if(used_size ==  0)
	{
		used_head = free_head;
		used_tail = free_head;
		free_head = g_list[free_head].next;
		g_list[used_head].prev = -1;
		g_list[used_tail].next = -1;
	}
	else
	{
		g_list[used_tail].next = free_head;
		g_list[free_head].prev = used_tail;
		used_tail = free_head;
		free_head = g_list[free_head].next;
	}

	g_list[used_tail].next = -1;
	g_list[used_tail].key = key;
	used_size++;
	free_size--;

	return 1;
}

int  push_front(int key)
{
	if( free_size == 0)
	{
		return 0;
	}

	if(used_size == 0)
	{
		used_head = free_head;
		used_tail = free_head; 
		free_head = g_list[free_head].next;
		g_list[used_tail].next = -1;
		g_list[used_head].prev = -1;
	}
	else
	{
		g_list[used_head].prev = free_head;
		int new_free_head = free_head;
		free_head = g_list[free_head].next;	
		g_list[new_free_head].next = used_head;
		g_list[new_free_head].prev = -1;
		used_head = new_free_head;
	}
	
	g_list[used_head].key = key;
	used_size++;
	free_size--;
	return 1;
}

void erase(int key)
{
	if(used_size == 0)
	{
		return;
	}	

	int idx = used_head;
	while(idx != -1)
	{
		if(g_list[idx].key == key)
		{
			if(idx == used_head)
			{
				used_head = g_list[idx].next;
				g_list[used_head].prev = -1;
			}
			else
			{
				int prev = g_list[idx].prev;
				g_list[prev].next = g_list[idx].next;
				int next = g_list[idx].next;
				if(next != -1)
				{
					g_list[next].prev = prev;	
				}
			}

			g_list[idx].next = free_head;
			free_head = idx;

			free_size++;
			used_size--;
			break;
		}
	

		idx = g_list[idx].next;	
	}
}


void print_list(void)
{
	int idx  = used_head;
	while(idx != -1)
	{
		printf("%d", g_list[idx].key);
		idx = g_list[idx].next;
		if(idx != -1)
		{
			printf("--->");
		}
		else
		{
			printf("\n");
		}
	}
}
测试:

#include "list.h"

int main(int argc, char **argv)
{
	init_list();

	push_front(3);
	push_front(5);
	push_front(7);
	push_front(24);
	push_front(9);
	print_list();
	erase(5);
	push_back(8);
	print_list();
	erase(9);
	print_list();
	erase(8);
	print_list();
	return 0;
}

输出:

9--->24--->7--->5--->3
9--->24--->7--->3--->8
24--->7--->3--->8
24--->7--->3


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值