C 中的嵌套链表

Nested Linklist in C

我有以下代码,它是一个嵌套链表。我从 google 复制了一个示例程序并试图将其嵌套,但有些只打印内部列表并给出分段错误。下面是我的代码

int main() {
         struct snapshot
        {
                int num;
                struct snapshot *next;
        };
        struct list_el {
                int val;
                struct  snapshot *snp;
                struct list_el * next;
        };

        typedef struct list_el item;
        typedef snapshot item2;
        item * curr, * head;
        item2 * curr2, * head2;
        int i , j;
        head = NULL;
        for(i=1;i<=10;i++) {
                curr = (item *)malloc(sizeof(item));
                curr->val = i;
                curr->next  = head;
                head = curr;
                for(j=1 ; j <= 5; j++)
                {
                        curr2 = (item2 *)malloc(sizeof(item2));
                        curr2->num = j;
                        curr2->next = head2;
                        head2 = curr2;
                }
                 curr->snp = head2;
        }
        curr = head;
        while(curr) {
            printf("begin\n");
            printf("%d\n", curr->val);
            curr2 = curr->snp;
            while(curr2)
            {
            head2 = NULL;
            printf("inner\n");
            printf("%d\n", curr2->num);
            //printf("%d\n",curr2->next);
            curr2 = curr2->next;
            }

            curr = curr->next ;
            printf("outer\n");
    }

        return 1;
}

我好像没看懂问题

你不应该 head2 = NULL; 吗?您的第二个列表将永远不会结束。

这里有些东西不太好。

首先,您似乎没有初始化所有变量。在这种情况下,缺少将 head2 初始化为 NULL 可能是罪魁祸首。

也不要转换 malloc() 的结果。

第二点,列表根本不是真正的嵌套,它们是两个独立的列表,彼此没有任何联系。

嵌套列表可以使用更通用的列表元素定义来完成,例如

struct ListElement
{
  struct ListElement *pNext;
  void *pData;
};

你可以将 pData 设置为指向另一个列表头的指针。

您的 "head" 变量似乎更像是指向列表尾部而不是头部的指针。所以在你的列表中会倒退。

编辑:这些列表之间没有连接的事实也会导致内存泄漏,当您为第一个列表的每个列表元素创建一个新的第二个列表时,您也会丢弃先前生成的第二个列表的指针列表,因为你似乎没有在 "head2" 和 "curr2" 以外的任何地方保存这些指针,每次创建第一个列表的新列表元素时你都会覆盖它们。