如何基于链表实现支持任意输入数量的逻辑门完整真值表打印
解决任意输入数的逻辑门真值表链表实现问题
看起来你已经搞定了链表的基本操作,但核心问题在于现有代码只存储了逻辑运算的结果,没有记录对应的输入组合,而且固定死了2个输入。下面我给你一套适配任意输入数的完整方案,完全基于你指定的Data结构体和链表来实现:
核心思路调整
要支持任意n个输入,我们需要:
- 生成所有2ⁿ种输入组合(每个组合对应二进制数从0到2ⁿ-1的每一位)
- 把每一行的「输入组合 + 运算结果」存入链表,用特殊标记分隔不同行
- 打印时识别分隔标记,输出规整的真值表
修改后的完整代码
#include <stdio.h> #include <stdlib.h> typedef struct data { int value; struct data * next; } Data; typedef Data * DataList; // 辅助函数:创建单个Data节点 Data * createData( int value) { Data * dataptr = malloc(sizeof (Data)); if (!dataptr) { // 别忘了判断内存分配失败的情况 perror("malloc failed"); exit(EXIT_FAILURE); } dataptr->value = value; dataptr->next = NULL; return dataptr; } // 辅助函数:递归追加节点到链表尾部 void appendData(DataList *lstptr, Data *newptr) { if (*lstptr == NULL) { *lstptr = newptr; return; } appendData(&((*lstptr)->next), newptr); } // 生成任意n输入的AND门真值表(存入链表) int myandlst(DataList *inlist, int input_count) { int total_rows = 1 << input_count; // 计算总行数:2^input_count for (int row = 0; row < total_rows; row++) { // 1. 生成当前行的输入组合(从高位到低位取二进制位) for (int bit_pos = input_count - 1; bit_pos >= 0; bit_pos--) { int input_val = (row >> bit_pos) & 1; appendData(inlist, createData(input_val)); } // 2. 计算AND结果:只要有一个输入为0,结果就是0 int result = 1; for (int bit_pos = 0; bit_pos < input_count; bit_pos++) { if (!((row >> bit_pos) & 1)) { result = 0; break; } } appendData(inlist, createData(result)); // 3. 添加行分隔标记(用-1表示换行) appendData(inlist, createData(-1)); } return 0; } // 打印真值表:识别-1标记换行 int report(DataList inputs) { DataList temp = inputs; if (temp == NULL) return 0; while (temp != NULL) { if (temp->value == -1) { printf("\n"); } else { printf("%d ", temp->value); } temp = temp->next; } return 0; } // 辅助函数:释放链表内存(避免内存泄漏) void freeDataList(DataList *lstptr) { if (*lstptr == NULL) return; DataList temp = *lstptr; *lstptr = (*lstptr)->next; free(temp); freeDataList(lstptr); } int main( ) { DataList inputs = NULL; int input_count = 2; // 这里可以改成任意正整数,比如3就生成3输入AND真值表 myandlst(&inputs, input_count); report(inputs); // 用完链表记得释放内存 freeDataList(&inputs); return 0; }
代码关键说明
- 任意输入数支持:用
1 << input_count计算总行数(位运算等价于2的input_count次方),遍历每个行号,把行号转换成二进制位,每一位对应一个输入值。 - 链表存储结构:每一行的输入组合 → 运算结果 → 换行标记(-1)依次存入链表,这样打印时能准确识别每一行的边界。
- 可扩展性:如果要实现其他逻辑门(比如OR、XOR),只需要修改
myandlst里计算result的部分:- OR门:只要有一个输入为1,结果就是1,初始设
result=0,遍历到1就设为1并break - XOR门:统计输入中1的个数,奇数则结果为1,偶数为0
- OR门:只要有一个输入为1,结果就是1,初始设
测试输出(input_count=2时)
0 0 0 0 1 0 1 0 0 1 1 1
内容的提问来源于stack exchange,提问作者Joe Durner
相关产品推荐
相关产品推荐

