C

时间:2015-04-30 12:48:15

标签: c linked-list

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

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;
}

我似乎不明白这个问题。

2 个答案:

答案 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;,每次创建第一个列表的新列表元素时都会覆盖它。

相关问题