一、 实验内容
1.编写symtab_ll.c
2.使用 python 代码进行测试
二、 实验过程
编写symtab_ll.c
1) 初始化:
初始化时需要分配一个新的结构体节点,并将内容置零,‘next’初始化为NULL
1 2 3 4 5 6 7
| symtab *symtab_init(){ symtab *self = malloc(sizeof(symtab)); memset(self, '\0', sizeof(symtab)); self->next = NULL; return self; }
|
2) 插入:
将新条目插入到链表中,需要遍历链表,检查给定的键是否已经存在。如果不存在,它创建一个新节点,用提供的键和值初始化其条目,并将其追加到链表的末尾。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int symtab_insert(symtab *self, char *key, VAL_T value){ symtab *ptr = self; while(ptr->next != NULL){ if(strcmp(ptr->entry.key, key) == 0) return 0; ptr = ptr->next; } symtab *node = malloc(sizeof(symtab)); memset(node, '\0', sizeof(symtab)); entry_init(&node->entry, key, value); node->next = NULL; ptr->next = node; return 1; }
|
3) 查找:
查找给定键,先遍历链表,如果找到键,就返回相应的值;否则返回 -1。
1 2 3 4 5 6 7 8 9
| VAL_T symtab_lookup(symtab *self, char *key){ symtab *ptr = self; while(ptr != NULL){ if(strcmp(ptr->entry.key, key) == 0) return ptr->entry.value; ptr = ptr->next; } return -1; }
|
4) 删除:
从符号表中移除给定键对应的条目,遍历链表,找到匹配的键后删除相应的节点,并释放相关的内存。如果成功删除,则返回 1;否则返回 0。
1 2 3 4 5 6 7 8 9 10 11 12 13
| int symtab_remove(symtab *self, char *key){ symtab *ptr = self, *tmp; while(ptr->next != NULL) { if(strcmp(ptr->next->entry.key, key) == 0){ tmp = ptr->next; ptr->next = ptr->next->next; free(tmp); return 1; } ptr = ptr->next; } return 0; }
|
三、 测试结果
Test.py运行成功