1. 程式人生 > >c語言,順序空間遊標連結串列的實現

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;
}/*全通過驗證無空間*/