GreensnoWorld
记录点滴,分享乐趣,一块凝固的时间
0046.无用单元收集广义表结构标志算法C语言实例
数据结构与算法  2021年3月2日
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR -1
#define OVERFLOW 0
#define TRUE 1 
#define FALSE 0
#define MAXSTRLEN 255

typedef int Status;
typedef unsigned char SString[MAXSTRLEN+1];

typedef int ElemType;
typedef int AtomType;
typedef enum {ATOM, LIST}ElemTag;
typedef struct GLNode{
	int mark;
	ElemTag tag;
	union{
		AtomType atom;
		struct {struct GLNode *hp, *tp;}ptr;
	};
}*GList, GLNode;

Status StrAssign(SString T, unsigned char *chars)
{
	int i = 0;
	int n;
	 	
	while(*(chars + i))
	{
		if(i < MAXSTRLEN)
		{
			n = i + 1;
			T[n] = *(chars + i);
			i++;
		}
		else
			break;
	}
	T[0] = i;
	return OK;
}

Status StrCompare(SString S, SString T)
{
	int i=1;
	if(S[0]>0 && T[0]>0)
	{
		while(i<=S[0] && i<=T[0])
		{
			if(S[i] > T[i])
				return 11;
			else if(S[i] < T[i])
				return -11;
			else
				i++;
		}
		if(S[0]>T[0])
			return 11;
		else if(S[0]<T[0])
			return -11;
		else
			return 10; 
	}
	else
		return ERROR;
}

int StrLength(SString S)
{
	return S[0];
}

Status SubString(SString Sub, SString S, int pos, int len)
{
	int i;
	if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)
	{
		return ERROR;
	}
	for(i=1; i<=len; i++)
	{
		Sub[i] = S[i+pos-1];
	}
	Sub[0] = len;
	return OK;
}

Status StrEmpty(SString S)
{
	if(S[0] == 0)
		return TRUE;
	else
		return FALSE;
}

Status StrCopy(SString T, SString S)
{
	int i;
	for(i=1; i<=S[0]; i++)
	{
		T[i] = S[i];
	}
	T[0] = S[0];
	return OK;
}

Status ClearString(SString S)
{
	S[0] = 0;
	return OK;
}

Status server(SString str, SString hstr)
{
	int n = StrLength(str);
	int i = 0;
	int k = 0;
	SString ch;

	do{
		i++;
		SubString(ch, str, i, 1);
		if(ch[1] == '(')
			k++;
		else if(ch[1] == ')')
			k--;
	}while(i<n && (ch[1]!=',' || k!=0));
	if(i<n)
	{
		SubString(hstr, str, 1, i-1);
		SubString(str, str, i+1, n-i);
	}
	else
	{
		StrCopy(hstr, str);
		ClearString(str);
	}
	return OK;
}

int GListDepth(GList L)
{
	int max, dep;
	GList pp;

	if(!L)
		return 1;
	if(L->tag == ATOM)
		return 0;
	for(max=0, pp=L; pp; pp=pp->ptr.tp)
	{
		dep = GListDepth(pp->ptr.hp);
		if(dep>max)
			max = dep;
	}
	return max+1;
}

Status CopyGList(GList *T, GList L)
{
	if(!L)
		*T = NULL;
	else
	{
		if(!(*T=(GList)malloc(sizeof(GLNode))))
			exit(OVERFLOW);
		(*T)->tag = L->tag;
		if(L->tag == ATOM)
			(*T)->atom = L->atom;
		else
		{
			CopyGList(&(*T)->ptr.hp, L->ptr.hp);
			CopyGList(&(*T)->ptr.tp, L->ptr.tp);
		}
	}
	return OK;
}

Status CreateGList(GList *L, SString S)
{
	unsigned char *nlgl = "()";
	GList p, q;
	SString emp, sub, hsub;
	StrAssign(emp, nlgl);
	
	if(StrCompare(S, emp) == 10)
		*L = NULL;
	else
	{
		if(!(*L=(GList)malloc(sizeof(GLNode))))
			exit(OVERFLOW);
		if(StrLength(S)==1)
		{
			(*L)->tag = ATOM;
			(*L)->atom = S[1];
		}
		else
		{
			(*L)->tag = LIST;
			p = (*L);
			SubString(sub, S, 2, StrLength(S)-2);
			do{
				server(sub, hsub);
				CreateGList(&p->ptr.hp, hsub);
				q = p;
				if(!StrEmpty(sub))
				{
					if(!(p=(GLNode *)malloc(sizeof(GLNode))))
						exit(OVERFLOW);
					p->tag = LIST;
					q->ptr.tp = p;
				}
			}while(!StrEmpty(sub));
			q->ptr.tp = NULL;
		}
		(*L)->mark = 0;
	}
	return OK;
}

void MarkList(GList GL)
{
	GList p, q, t;
	_Bool finished;

	t = NULL;
	p = GL;
	finished = FALSE;
	while(!finished)
	{
		while(p->mark == 0)
		{
			p->mark = 1;
			q = p->ptr.hp;
			if(q && q->mark==0)
			{
				if(q->tag == 0)
					q->mark = 1;
				else
				{
					p->ptr.hp = t;
					p->tag = 0;
					t = p;
					p = q;
				}
			}
		}
		q = p->ptr.tp;
		if(q && q->mark==0)
		{
			p->ptr.tp = t;
			t = p;
			p = q;
		}
		else
		{
			while(t && t->tag==1)
			{
				q = t;
				t = q->ptr.tp;
				q->ptr.tp = p;
				p = q;
			}
			if(!t)
				finished = TRUE;
			else
			{
				q = t;
				t = q->ptr.hp;
				q->ptr.hp = p;
				p = q;
				p->tag =1;
			}
		}
	}
}

int main(void)
{
	GList L, T;
	SString S;
	unsigned char *ss = "((),(e),(a,(b,c,d)))";
	StrAssign(S, ss);

	CreateGList(&L, S);
	printf("GList Depth of L: %d\n", GListDepth(L));

	CopyGList(&T, L);
	printf("GList Depth of T: %d\n", GListDepth(T));

	MarkList(L);
	return OK;
}
LIJG
余本顽劣,生于紫云下,长于汝水滨。早年求学,兴趣广泛,好高骛远,学无所成,仓皇入世。兴趣所致,投身互联网,求知未证,而立已至,始悟光阴荏苒,终需务实钻研。故有此站,记录时光,积累点滴,验证所学,分享愚见。指舞方寸间,心系万千年。
留言