You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于链表实现支持任意输入数量的逻辑门完整真值表打印

解决任意输入数的逻辑门真值表链表实现问题

看起来你已经搞定了链表的基本操作,但核心问题在于现有代码只存储了逻辑运算的结果,没有记录对应的输入组合,而且固定死了2个输入。下面我给你一套适配任意输入数的完整方案,完全基于你指定的Data结构体和链表来实现:

核心思路调整

要支持任意n个输入,我们需要:

  1. 生成所有2ⁿ种输入组合(每个组合对应二进制数从0到2ⁿ-1的每一位)
  2. 把每一行的「输入组合 + 运算结果」存入链表,用特殊标记分隔不同行
  3. 打印时识别分隔标记,输出规整的真值表

修改后的完整代码

#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. 任意输入数支持:用1 << input_count计算总行数(位运算等价于2的input_count次方),遍历每个行号,把行号转换成二进制位,每一位对应一个输入值。
  2. 链表存储结构:每一行的输入组合 → 运算结果 → 换行标记(-1)依次存入链表,这样打印时能准确识别每一行的边界。
  3. 可扩展性:如果要实现其他逻辑门(比如OR、XOR),只需要修改myandlst里计算result的部分:
    • OR门:只要有一个输入为1,结果就是1,初始设result=0,遍历到1就设为1并break
    • XOR门:统计输入中1的个数,奇数则结果为1,偶数为0

测试输出(input_count=2时)

0 0 0 
0 1 0 
1 0 0 
1 1 1 

内容的提问来源于stack exchange,提问作者Joe Durner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:17:28