链表中的链表(二维链表?

Linked list within a linked list (2D linked list?)

本文关键字:链表 二维      更新时间:2023-10-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();
}

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

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

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

您正在尝试执行的操作将有 6 个ListNode作为链表连接。每个ListNode都包含一个指向DataNode的指针,该指针是与指向它的ListNode对应的行的链接列表的头部。

我将把实施留给你。