链表中的链表(2D链表?)

4

我有一个文本文件,其中包含一个字符矩阵(矩阵中每个位置都是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个元素列表的列表。希望我已经清楚地表达了我的愿望。我正在考虑创建另一个结构体,其中包含指向两个活动列表中每个列表的下一个指针,但仍不确定这个想法如何。您会怎样建议我去做呢?
编辑
请给予一点帮助... 我已经重新实现了所有功能以适应您(@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();
}

这段代码成功提取了前六个元素,并将其作为列表的第一个元素,但在那之后它停止工作了。

1
你为什么不使用std::list - NathanOliver
我收到了一个使用链表的请求,但我自己不太确定为什么... 另外,我想避免使用任何其他类型,如vector - Rorschach
1
你具体有什么问题?你已经说明了你想要做什么,但这个陈述本身基本上就是对问题的回答。 - Daniel
我有一个链表,其中包含具有char [3]和指向该列表下一个成员的指针的元素。现在,我将拥有n个这些列表(所有列表都将包含6个元素)。如何创建一个链表来容纳这些6个元素(较小的)列表?编辑:仍然需要能够访问任何较小链接列表中的每个元素。 - Rorschach
@user3735245 你为什么不使用std::list,你没有回答这个问题。 - Vlad from Moscow
1
@VladfromMoscow 看起来像是一份教授链表的家庭作业。 - Daniel
1个回答

3

我会给你一些小提示来帮助你开始。正如你所知,一个链表节点包含一些数据和指向列表下一个元素的指针。你所谓的“二维链表”实际上只是由链表组成的链表。列表中的每个节点指向另一个链表。因此,你需要定义一个新类型:

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

你尝试的是将6个“ListNode”连接成一个链表。每个“ListNode”都包含指向“DataNode”的指针,该“DataNode”是与指向它的“ListNode”对应的行的链表的头部。
具体实现留给你自己完成。

谢谢,我想我开始有一些关于该怎么做的想法了。你看到我正在创建一个DataNode链表吗?我猜我可以实现一些计数器,创建与之前相同的列表,然后当计数器达到6时,将该列表放入ListNode中,然后重置计数器并重复此过程。这样说得通吗? - Rorschach
请查看我添加到原始问题的编辑。如何重复使用相同的指向列表头的指针来创建多个列表?谢谢。 - Rorschach
@user3735245 我不明白你想用添加的代码做什么。 (顺便说一句,GCC说没有效果的那行确实没有效果。它只是一个比较。) - Daniel
我正在尝试创建一个由6个元素组成的列表,然后将该列表作为DieSideNode的一个元素,重置列表,填充另外6个元素,再将另一个元素添加到DieSideNode中等等...应该是一个=,而不是两个... - Rorschach
我目前的代码怎么可能实现这个? - Rorschach
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接