静态链表——用顺序存储实现链式存储功能

一  静态链表


结构体

struct node{
		T data;
		int link;
	};

一个成员存放数据,另一个成员(link)存放下一个数据的位置。

存于数组中,构成静态链表:node SL[MAXSIZE]


数据前后关系不是以数组顺序决定,由link决定。或者说:

链表输出不是以数组顺序输出,而是由指定位置(link)输出。


值得注意的是,存在着两个链表:

数据链表:该链表存放有用的数据,头节点在SL【0】;

备用链表:插入新数据时分配此链表的空间,分配的空间转换成数据链表的一部分;头节点在SL【MAXSIZE-1】。


如下图所示:















二 程序实现:


1 建立一个SList.h文件:


#ifndef SLIST_H
#define SLIST_H
const int MAXSIZE=10;
template <typename T>
class SList{
	struct node{
		T data;
		int link;
	};
private:
	node SL[MAXSIZE];
	int New(){
		int i=SL[MAXSIZE-1].link;
		if(i)
			SL[MAXSIZE-1].link=SL[i].link;
		return i;
	}
	void Delete(int k){
		SL[k].link=SL[MAXSIZE-1].link;
		SL[MAXSIZE-1].link=k;
	}
public:
	SList(){
		int i;
		SL[0].link=0;
		SL[MAXSIZE-1].link=1;
		for(i=1;i<MAXSIZE-2;i++)
			SL[i].link=i+1;
		SL[MAXSIZE-2].link=0;
		
	}
	void ClearList(){
		int j,i=SL[MAXSIZE-1].link;
		while(i){
			j=i;
			i=SL[i].link;
		}
		SL[j].link=SL[0].link;
		SL[0].link=0;
	}
	bool ListEmpty(){
		return SL[0].link==0;
	}
	int ListLen()const{
		int count=0,i=SL[0].link;
		while(i){
			i=SL[i].link;
			count++;
		}
		return count;
	}
	
	
	bool PriorElem(T e, bool(*eq)(T, T), T &pre_e)const
	{

		int j, i=SL[0].link;
		do
		{
			j=i;
			i=SL[i].link;
		}while(i && !eq(SL[i].data, e));
		if(i)
		{
			pre_e=SL[j].data;
			return true;
		}
		return false;
	}
	bool NextElem(T e, bool(*eq)(T, T), T &next_e)const
	{

		int i=SL[0].link;
		while(i)
		{
			if(eq(SL[i].data, e) && SL[i].link)
			{
				next_e=SL[SL[i].link].data;
				return true;
			}
			i=SL[i].link;
		}
		return false;
	}

	bool InsertElem(int i,T e){
		int m,k=0;
		for(m=1;m<i;m++){
			k=SL[k].link;
			if(k==0)
				break;

		}
		if(m<i) return false;
		else{
			m=New();
			if(m){
				SL[m].data=e;
				SL[m].link=SL[k].link;
				SL[k].link=m;
				return true;
			}
			return false;
		}
	}
	bool DeleteElem(int i,T &e){
		int m,k=0;
		for(m=1;m<i;m++){
			k=SL[k].link;
			if(k==0) break;
		}
		if(m<i||SL[k].link==0) return false;
		else{
			m=SL[k].link;
			SL[k].link=SL[m].link;
			e=SL[m].data;
			Delete(m);
			return true;
		}
	}
	void ListPrint(void(*visit)(T*)){
		int i=SL[0].link;
		while(i){
			visit(&SL[i].data);
			i=SL[i].link;
		}
		cout<<endl;
	}
};
#endif


2 测试SList类:


#include <iostream>
#include<string>
using namespace std;
typedef string T;
bool equal(string c1, string c2)
{
	return c1==c2;
}
void print(T* c)
{
	cout<<*c<<" ";
}
#include "SList.h"
int main()
{
	SList<T> L;
	T e, e0="kobe";
	bool i;
	int j, k;
	T s;
	cout<<"请输入你心中最好的6名球星:"<<endl;
	for(j=1; j<=6; j++){
		cin>>s;
		i=L.InsertElem(j, s);
	}
	cout<<endl;
	cout<<"你的榜单L=";
	L.ListPrint(print);
	cout<<"L是否空?"<<boolalpha<<L.ListEmpty()<<",L长=";
	cout<<L.ListLen()<<endl;
	
	i=L.PriorElem(e0, equal, e);
	if(i)
		cout<<"球星"<<e0<<"的前一名为"<<e<<endl;
	
	i=L.NextElem(e0, equal, e);
	if(i)
		cout<<"球星"<<e0<<"的后一名为"<<e<<endl;
	
	k=L.ListLen();
	for(j=k+1; j>=k; j--)
	{
		i=L.DeleteElem(j, e);
		if(i)
			cout<<"删除第"<<j<<"个球星成功,他是"<<e<<endl;
		else
			cout<<"删除第"<<j<<"个球星失败(榜单不存在此球星),";
	}
	cout<<"依次输出L的球星:";
	L.ListPrint(print);
	L.ClearList();
	cout<<"清空L后,L=";
	L.ListPrint(print);
	cout<<"L是否空?"<<boolalpha<<L.ListEmpty()<<",L长=";
	cout<<L.ListLen()<<endl;

	return 0;
}




三 运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值