广义表存储结构
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