c语言,顺序空间游标链表的实现


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SpaceSize 1500/*内存池容量*/

#define _NormalMake_/*正常输入元素,相对随机而言*/
//#undef _NormalMake_
#define N 100 /*随机元素个数*/
typedef int ElemType;
typedef int PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Pos;

struct Node{
	ElemType data;
	Pos next;
} CurSpace[SpaceSize];
void ERROR(char *ch){
	puts(ch);
	exit(0);
}

void InitCurSpace(){
	for (int i = 0; i != SpaceSize; ++i){
		CurSpace[i].next = i + 1;
	}
		CurSpace[SpaceSize - 1].next = 0;		
}
static Pos
CurMalloc(){
	Pos p;

	p = CurSpace[0].next;
	if (0 == p)
		ERROR("Out of space!");
	CurSpace[0].next = CurSpace[p].next;

	return p;
}
static void
CurFree(Pos p){
	CurSpace[p].next = CurSpace[0].next;
	CurSpace[0].next = p;
}
List MakeEmpty(){
	List L;
	L = CurMalloc();
	CurSpace[L].next = 0;/出过错误
	return L;
}
int IsEmpty(List L){
	return 0 == CurSpace[L].next;
}
int IsLast(Pos p){
	return 0 == CurSpace[p].next;
}
Pos Find(ElemType e, List L){
	Pos p;

	p = CurSpace[L].next;
	while (CurSpace[p].data != e&&p)
		p = CurSpace[p].next;

	return p;
}
Pos FindPre(ElemType e, List L){
	Pos p;

	p = L;//出错
	while (!IsLast(p) && CurSpace[CurSpace[p].next].data != e)
		p = CurSpace[p].next;

	return p;
}
void DeleteElem(ElemType e, List L){
	Pos p,TemCell;

	p = FindPre(e, L);
	if (!IsLast(p)){
		TemCell = CurSpace[p].next;
		CurSpace[p].next = CurSpace[TemCell].next;
		CurFree(TemCell);
	}
}
void InsertElem(ElemType e, Pos p){
	Pos TemCell;

	TemCell = CurMalloc();
	CurSpace[TemCell].data = e;
	CurSpace[TemCell].next = CurSpace[p].next;
	CurSpace[p].next = TemCell;
}
void DeleteCurList(List L){
	Pos p, TemCell;

	p = CurSpace[L].next;
	CurSpace[L].next = 0;
	while (p){
		TemCell = CurSpace[p].next;
		CurFree(p);
		p = TemCell;
	}
}
void GetElemSeries(int array[N]){
	srand((unsigned)time(NULL));
	for (int i = 0; i != 100; ++i){
		array[i] = rand() % 100;
	}
}
List MakeCurList(){
	List L;
	Pos p;

	p=L = MakeEmpty();
#ifdef _NormalMake_
	ElemType e;
	puts("请输入表0结束:");
	scanf("%d", &e);
	while (e){
		InsertElem(e, p);
		p = CurSpace[p].next;
		scanf("%d", &e);
	}
#else
	//int array[N];
	int *array = malloc(sizeof(int)*N);
	GetElemSeries(array);
	for (int i = 0; i != N; i++){
		InsertElem(array[i], p);
		p = CurSpace[p].next;
	}
#endif
	return L;///
}
void PrintCurList(List L){
	Pos p;

	if (IsEmpty(L))
		ERROR("\nEmpty List!");
	p = CurSpace[L].next;
	puts("\n表如下");
	while (p){
		printf("%d ", CurSpace[p].data);
		p = CurSpace[p].next;
	}
}
void DeleteSerial(List L){
#ifdef _NormalMake_
	ElemType e;
	puts("\n输入删除的元素0结束");
	scanf("%d", &e);
	while (e){
		DeleteElem(e, L);
		scanf("%d", &e);
	}	
#else
	int array[N];
	GetElemSeries(array);
	for (int i = 0; i != N/2; i++){
		DeleteElem(array[i], L);
	}
#endif
}


int main(){
	List L1,L2;
	


	InitCurSpace();
	L1 = MakeCurList();
	PrintCurList(L1);
	DeleteSerial(L1);
	PrintCurList(L1);

	DeleteCurList(L1);
	//PrintCurList(L1);

	L2 = MakeCurList();
	PrintCurList(L2);
	DeleteSerial(L2);
	//PrintCurList(L1);
	PrintCurList(L2);

	
	DeleteCurList(L2);
	PrintCurList(L2);
	

	return 0;
}/*全通过验证无空间*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值