我有以下代码,它是一个嵌套的链表。我从谷歌复制了一个示例程序并尝试将其嵌套,但有些内容列表只是打印出来并且它给出了分段错误。以下是我的代码
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;
}
我似乎不明白这个问题。
答案 0 :(得分:3)
你不应该head2 = NULL;
吗?你的第二个清单永远不会结束。
答案 1 :(得分:2)
这里的一些事情并不是很好。
首先,您似乎无法初始化所有变量。在这种情况下,缺少head2初始化为NULL可能是罪魁祸首。
也不要施放malloc()的结果。
第二件事,列表根本没有真正嵌套,它们是两个单独的列表,没有相互连接。
嵌套列表可以使用更通用的列表元素定义来完成,例如
WizardForm.LicenseAcceptedRadio.Font.Color := clWhite;
WizardForm.LicenseNotAcceptedRadio.Font.Color := clWhite;
可以将pData设置为指向另一个List头的指针。
也是你的&#34; head&#34;变量似乎更像是指向列表尾部而不是头部的指针。因此,在您的列表中将会倒退。
编辑:这些列表之间没有连接的事实也会导致内存泄漏,因为为第一个列表的每个列表元素创建一个新的第二个列表,你也丢弃了先前生成的第二个列表的指针,因为你似乎没有把握这些指针而不是&#34; head2&#34;和&#34; curr2&#34;,每次创建第一个列表的新列表元素时都会覆盖它。