【问题标题】:Linked list within a linked list (2D linked list?)链表中的链表(二维链表?)
【发布时间】:2015-09-05 17:24:16
【问题描述】:

我有一个 txt 文件,其中包含一个字符矩阵(矩阵中每个位置 1 或 2 个)

C P O Hr S A

N Hw N L Z R

W T O O Ta A

I O S S E T

类似的东西。我设法做的是创建一个链接列表并将该矩阵的每个元素存储在该列表中(单独)。

struct DataNode{
    char data[3];
    struct DataNode *nextData;
};

void initNode(DataNode *head, char x[3]) {
    for(int i=0; i<3; i++)
        head->data[i]=x[i];
    head->nextData=NULL;
}

void addNode(DataNode *head, char x[3]) {
    DataNode *newNode = new DataNode;
    for(int i=0; i<3; i++)
        newNode->data[i]=x[i];
    newNode->nextData=NULL;

    DataNode *curr = head;
    while(curr) {
        if(curr->nextData==NULL) {
            curr->nextData = newNode;
            return;
        }
        curr = curr->nextData;
    }
}

int main() {
char input[3];
if(in.is_open()) {
        in>>input;
        initNode(head,input);
        for(int i=0; i<3; i++)
            dieSide[i]=input[i];

        while(in>>input) {
            addNode(head,input);
        }
        in.close();
    }
}

到目前为止,这一切正常,我想我对此很满意。

我现在需要的是另一个链表,其中的元素仍然是char[3] 类型,但首先必须有一个包含一行 6 个元素的列表,然后是另一个包含所有这 6 个元素的列表元素列表。

我希望我清楚自己的愿望。

我正在考虑创建另一个结构,用 next 指针指向两个活动列表中的每一个,但仍然不确定这个想法。

你会建议我怎么做?

编辑

请帮个忙... 我已经重新实现了所有功能以适合您(@Daniel)建议的结构,并且它们似乎有效。但是,我需要一种方法来“重置”我想用于创建小列表的DataNode*。这样,我只打印整个矩阵的次数与文件中的行数一样多。 我所拥有的是>

char input[3];
int counter=0;
struct DataNode *head = new DataNode; //creates a list of all elements
struct DataNode *head_side = new DataNode; //want to use this one to create smaller lists
struct DieSideNode *head_die = new DieSideNode; //creates a list of smaller lists

if(in.is_open()) {
        in>>input;
        initNode(head,input);
        initNode(head_side, input);
        counter++;

    while(in>>input) {
        addNode(head,input);
        addNode(head_side, input);
        counter++;
        if( counter == 6 ) {
            initSide(head_die, head_side);
            head_side=0;
        }else if(counter%6==0) {
            addSide(head_die, head_side);
            head_side=0;
        }
    }
    in.close();
}

此代码成功提取了前六个元素,并将其作为列表的第一个元素,但随后停止工作。

【问题讨论】:

  • 您不使用std::list的任何原因?
  • 我有一个使用链表的请求,我自己也不知道为什么......另外,我想避免使用任何其他类型,如vector
  • 您的问题到底是什么?你已经陈述了你想要做什么,但这个陈述本身基本上就是对问题的回答。
  • 我有一个链表,其中包含char[3] 的元素和指向该列表下一个成员的指针。现在,我将拥有这些列表中的 n 个(所有列表将包含 6 个元素)。如何创建一个链接列表来保存这 6 个元素(较小的)列表?编辑:不过,我需要能够访问任何较小链表的每个元素。
  • @VladfromMoscow 似乎是教链表的家庭作业

标签: c++ linked-list singly-linked-list


【解决方案1】:

我会给你一个开始的小提示。如您所知,链表节点包含一些数据和指向链表下一个元素的指针。您所谓的“二维链表”实际上将简单地实现为链表的链表。链表中的每个节点都指向另一个链表。所以你需要定义一个新类型:

struct ListNode {
    DataNode* dataRowHead;
    struct ListNode* nextRow;
};

您尝试将 6 个ListNodes 连接为一个链表。每个ListNode 都包含一个指向DataNode 的指针,它是与指向它的ListNode 对应的行的链表头。

我将把实现留给你。

【讨论】:

  • 谢谢,我想我开始知道该怎么做了。看看我在哪里创建DataNode 的链接列表?我想我可以实现一些计数器,创建一个与以前相同的列表,然后,当计数器达到 6 时,将该列表放入 ListNode,然后重置计数器,然后重复.. 有意义吗?
  • @user3735245 如果您知道输入将始终是 6x6 矩阵,则可以这样做。如果输入可能是不同的形状,您可能不想那样做。相反,创建一个列表,当您看到换行符时,开始制作下一个列表。
  • 请查看我添加到原始问题的编辑。如何重新使用指向列表头的相同指针来创建多个列表?谢谢。
  • @user3735245 我不明白你想用你添加的代码做什么。 (顺便说一句,GCC说没有效果的那一行确实没有效果。只是一个比较。)
  • 我正在尝试创建一个包含 6 个元素的列表,然后将该列表作为 DieSideNode 的一个元素,重置列表,用另外 6 个元素填充它,将另一个元素添加到 DieSideNode 等...应该是一个=,而不是两个...
猜你喜欢
  • 2021-07-05
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多