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" 以外的任何地方保存这些指针,每次创建第一个列表的新列表元素时你都会覆盖它们。
我有以下代码,它是一个嵌套链表。我从 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" 以外的任何地方保存这些指针,每次创建第一个列表的新列表元素时你都会覆盖它们。