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

时间:2015-06-19 16:31:54

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

我有一个包含字符矩阵的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*。这样我只打印整个矩阵的次数与文件中的行数一样多。 我所拥有的是&gt;

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 个答案:

答案 0 :(得分:2)

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

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

您要做的是将6 ListNode个连接为链接列表。每个ListNode都包含一个指向DataNode的指针,该ListNode是与指向它的puts对应的行的链接列表的头部。

我会将实施留给您。