广义表(())_怎么查看一款软件的源代码

广义表(())_怎么查看一款软件的源代码广义表存储结构1.头尾链表存储结构头尾链表存储结构由两种节点构成,分别是表节点和原子节点

广义表(())_怎么查看一款软件的源代码"

广义表存储结构

1.头尾链表存储结构

        头尾链表存储结构由两种节点构成,分别是表节点和原子节点。表节点包含3个域——标志域,指向表头的指针域和指向表尾的指针域,原子节点包含2个域——标志域和值域。

        其中标志域tag为0时表示原子节点,为1时表示表节点。

2.扩展线性链表存储结构

        扩展线性存储结构同样由两种节点构成——表节点和原子节点。这两种节点都包含3个域。其中,表节点由标志域,表头指针域,表尾指针域构成;原子节点由标志域,值域,表尾指针域构成。

题目:根据表头和表尾的定义,设计分别实现求表头和表尾操作的head()和tail()函数,并编写一个求广义表表头和表尾的程序。

该题采用头尾链表存储结构创建广义表

源代码如下:

/*

求广义表表头表尾

李子木9
*/
# include <stdio.h>
# include <string.h>
# include <malloc.h>
# define maxlen 100

typedef struct node
{
	int tag;   //结点类型标识  0表示原子,1表示子表结点 
	struct node* link;
	union
	{
		char data;
		struct node* slist;
	} val;
}gnode;

void disastr(char s[], char hstr[]);		//将串分为两个部分,第一个逗号前的子串和逗号后的子串
gnode* create(char s[]);		// 采用头尾链表存储结构创建广义表
void disp(gnode* h);			//输出广义表 
gnode* head(gnode* p);			//表头 
gnode* tail(gnode* p);			//表尾 

main()
{
	gnode* g, * h, * t;
	char str[maxlen];
	printf("输入广义表表达式:");
	scanf("%s", str);
	g = create(str);
	printf("1\n");
	printf("广义表:");
	disp(g);
	printf(" \n");
	if (g == NULL || g->tag == 0 || g->val.slist == NULL)
		printf("原子或空表不能取表头尾\n");
	else
	{
		h = head(g);
		if (h->tag==0){
			printf("1\n");
			printf("表头:%c\n", h->val.data);
		}
		else
		{
			printf("1\n");
			printf("表头:"); disp(h); printf("\n");
		}
		t = tail(g);
		printf("表尾:"); disp(t); printf("\n");
	}
}

//将串分为两个部分,第一个逗号前的子串和逗号后的子串 
void disastr(char s[], char hstr[])
//  s:广义表,hstr:表头 
{
	int I = 0, j = 0, k = 0, r = 0;
	char rstr[maxlen];
	while (s[I] && (s[I] != ',' || k))
	{
		if (s[I] == '(')  //遇到左括号标记k+1 
			k++;
		else
			if (s[I] == ')')	//遇到右括号则k-1 
				k--;
		if (k != 1 || s[I] != ',')	//不在一个最优括号内 或 当前操作符不为逗号时 
		{
			hstr[j++] = s[I];  //将当前元素存入表头数组 
			I++;
		}
	}

	hstr[j] = '\0'; //表头结束标志 
	if (s[I] == ',')  //碰到逗号时,进行下一个元素的操作 
		I++;
	while (s[I])  //将后面元素全部存入表尾 
	{
		rstr[r++] = s[I];
		I++;
	}
	rstr[r] = '\0';   //表尾结束标志 
	strcpy(s, rstr);  //表尾赋值给s 
}


// 采用头尾链表存储结构创建广义表 
gnode* create(char s[])
{
	gnode* p, * q, * r, * gh;
	char subs[maxlen], hstr[maxlen];
	int len;
	len = strlen(s);
	if (!strcmp(s, "()"))  //如果输入的串是空串,则创建一个空表  注意:当s="()"时,strcmp(s,"()")=0
		gh = NULL;
	else
		if (len == 1) 	
		{
			gh = (gnode*)malloc(sizeof(gnode));
			gh->tag = 0;   
			gh->val.data = *s;
			gh->link = NULL;
		}
		else
		{
			gh = (gnode*)malloc(sizeof(gnode));
			gh->tag = 1;
			p = gh;
			s++;
			strncpy(subs, s, len - 2);  //保存逗号以前的字符 
			subs[len - 2] = '\0';
			do
			{
				disastr(subs, hstr);
				r = create(hstr);
				p->val.slist = r;
				q = p;
				len = strlen(subs);
				if (len > 0)
				{
					p = (gnode*)malloc(sizeof(gnode));
					p->tag = 1;
					q->link = p;
				}
			} while (strlen(subs)!=0);
			q->link = NULL;
		}
	return(gh);
}

//输出广义表 
void disp(gnode* h)
{
	gnode* p, * q;
	printf("(");
	if (h)
		do
		{
			p = h->val.slist;
			q = h->link;
			while (q && p && !p->tag)
			{
				printf("%c,", p->val.data);
				p = q->val.slist;
				q = q->link;
			}
			if (p && !p->tag)
			{
				printf("%c", p->val.data);
				break;
			}
			else
			{
				if (!p)
					printf("( )");
				else
					disp(p);
				if (q)
					printf(",");
				h = q;
			}
		} while (h);
		printf(")");
}

gnode* head(gnode* p)
{
	return(p->val.slist);
}

gnode* tail(gnode* p)
{
	return(p->link);
}

今天的文章广义表(())_怎么查看一款软件的源代码分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/88817.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注