静态链表。实现。

 对于某些高级程序设计语言,并没有指针,又想使用链表结构。用可以数组实现。称为,静态链表。
 
/*
node	data	cur
0				1----------s[0].cur指向可用的节点。
1		x		2----------链表头指针
2		x		3	
3		x		4
4		x		5
5		x		6	
6		x		7
7		x		8	
8		x		9
9		x		0----------链表末尾
*/
#include <iostream>

using namespace std;

const int MAXSIZE=20; 
typedef int DataType;
typedef struct  
{
	DataType data;
	int cur;
}node,SLinkList[MAXSIZE];

void init_node(SLinkList S);
int find_previous_x(SLinkList S,int head,DataType x);
void insert_node(SLinkList S,int &head,DataType x,DataType y);//在x之前插入。
void delete_node(SLinkList S,int &head,DataType x);//删除为x的节点。
int malloc_node(SLinkList S);
void free_node(SLinkList S,int i);//实现释放i的内存。。


int main()
{
	SLinkList S;
	init_node(S);
	int head=malloc_node(S);
	int temp=head;
	S[head].data=1;
	for (int i=1;i<5;++i)
	{
		S[head].cur=malloc_node(S);
		head=S[head].cur;
		S[head].data=i+1;
	}
	S[head].cur=0;
	head=temp;

	//delete_node(S,head,4);
	//delete_node(S,head,5);
	delete_node(S,head,1);

	//insert_node(S,head,4,8);
	
	while(head)
	{
		cout<<S[head].data<<endl;
		head=S[head].cur;
	}

	system("pause");
	return 0;
}

void init_node(SLinkList S)
{
	for (int i=0;i<MAXSIZE-1;++i)
	{
		S[i].cur=i+1;
	}
	S[MAXSIZE-1].cur=0;//尾节点指向0。
}

int find_previous_x(SLinkList S,int head,DataType x)
{
	for (int i=head;i!=0;)
	{
		if (x==S[S[i].cur].data)//从head.cur开始寻找。
		{
			return i;
		}
		i=S[i].cur;//
	}
}

void insert_node(SLinkList S,int &head,DataType x,DataType y)
{
	int i=malloc_node(S);
	S[i].data=y;
	if (x==S[head].data)
	{
		S[i].cur=head;
		head=i;
	}
	else
	{
		int index=find_previous_x(S,head,x);
		S[i].cur=S[index].cur;
		S[index].cur=i;
	}

}

void delete_node(SLinkList S,int &head,DataType x)
{
	int temp;
	if (x==S[head].data)
	{
		temp=head;
		head=S[head].cur;
	}
	else
	{
		int index=find_previous_x(S,head,x);
		temp=S[index].cur;
		S[index].cur=S[temp].cur;
	}
	free_node(S,temp);
}

int malloc_node(SLinkList S)
{
	//只单纯实现malloc函数的功能。
	int i=S[0].cur;
	S[0].cur=S[i].cur;

	return i;
}

void free_node(SLinkList S,int i)
{
	//只用实现free的原来功能就行,只是删除节点,不管剩下的链表是否还连续。
	S[i].cur=S[0].cur;
	S[0].cur=i;
}
虽然就短短的100多行,确花了将近4个小时的时间,而且还不够完善,没有足够的测试,还有一些功能没有实现。待续吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值