【问题标题】:Linked lists, program in C链表,C语言程序
【发布时间】:2014-02-11 01:49:09
【问题描述】:
我编写了一个程序,它将分析帕斯卡中的代码。我已经完成了对文本的处理,现在我必须将结果保存在链接列表中,并且我知道如何去做。在我的程序中,我有以下元素:
variables(name, type)
constants(name)
typedef(name and components)
procedures(local variables, constants and types)
function (its var, const and types)
在我看来,创建 5 个列表并不是有效的解决方案。你能给我一个提示如何为这些具有不同数量组件的元素创建列表吗?
非常感谢
【问题讨论】:
标签:
c
linked-list
analysis
lexical-analysis
【解决方案1】:
这取决于您所说的“高效”。
如果你想把所有不同的元素都放在同一个列表中,你需要给元素添加类型信息,当然还要花时间过滤掉所有错误的元素。
那么,不同类型元素的单独集合似乎更有效。
你应该这样做:
typedef struct Element Element;
struct Element {
Element *next;
};
typedef struct {
char *name;
VariableType type;
} ElementVariable;
/* ... and so on */
那么你就可以有各种链表头了:
ElementVariable *variables;
ElementConstant *constants;
由于每个ElementXXX 类型都以Element 开头,因此您可以编写相当通用的链表代码来处理所有不同的类型。
【解决方案2】:
我不确切知道您想对列表做什么,但这里有一个想法:创建一个树,其中 siblings 的行为类似于喜欢列表中的常规 next 项目,而 children 提供附加信息,例如复合类型或函数参数的条目。
所以结构看起来像这样:
struct Entity {
const char *id;
enum Type type;
char is_const;
char is_var;
/* ... whatever ... */
struct Entity *next;
struct Entity *child;
};
如果你有
var x: integer;
procedure proc(var res: integer, x, y: integer); forward;
type date = record
dd, mm, yy: integer;;
end;
你的树应该是这样的:
[var x: integer]
|
[proc: procedure] -> [var res: integer]
| |
| [x: integer]
| |
| [y: integer]
|
[type date: record] -> [dd: integer]
|
[mm: integer]
|
[yy: integer]
这里,箭头-> 表示子项,竖线| 表示兄弟姐妹或只是列表中的下一项。
左侧的元素构成您的主要列表,其中包括您的第一级(全局范围)符号。下一级表示父元素的范围。例如dd 仅在记录date 中已知。这本质上是一个多级链表,可以轻松扩展任意数量的函数参数或记录条目。
【解决方案3】:
5 个列表不一定是低效的,除非您想在所有列表中搜索名称或其他内容。
另一种方法是采用通用方式将所有信息存储在一个列表中。您可以枚举您存储的内容。