C ++ |合并链接列表

时间:2015-11-12 01:57:09

标签: c++ singly-linked-list

所以我一直在做数据结构的家庭作业,而且我已经走了几个小时。为了解释,我必须以文本ListJava和ListDS文本文件的形式获取信息:名称姓氏NUM等级。这两个文件包含相同的名称,但顺序不同。该作业基本上希望我们合并排序文件。

这些是我的结构:

typedef struct student
{
    string name;
    string surname;
    int am;
    int grade;
}StudentFile;
typedef struct node {

    StudentFile element;
    struct node* next;
}Node;

typedef struct stud 
{
    string name;
    string surname;
    int am;
    int grade;
    int grade2;
    struct stud* next;
}Student;

这是我合并它们的功能:

/*Merge Lists into one*/
Student* MergeLists(Node* headDS, Node* headJava, Student* head)
{
    bool flag = false;

    Student *a = new Student;
    Student *prev = NULL;
    Student *temp = NULL;
    Node *tempDS = headDS;
    Node *tempJava = headJava;
    Node *prevJava = NULL;

    if (head == NULL)
    {
        head = a; //mermory alocation for head<Student>
        temp = head;
    //  temp->next = NULL;
    }
    while (tempDS != NULL)
    {

        if(head != NULL)
        {

            if (tempDS->element.surname.compare(tempJava->element.surname) == 0) // if surnames are equal
            {
                prev = temp;

                temp->name = tempDS->element.name;
                temp->surname = tempDS->element.surname;
                temp->am = tempDS->element.am;
                temp->grade = tempDS->element.grade;
                temp->grade2 = tempJava->element.grade;

                tempJava = tempJava->next;
                tempDS = tempDS->next;
                temp = temp->next;
                flag = false; //meaning that prevJava can get a new value again.
            }
            else  // if DS > Java
            {
                /*Keep tempJava in mermory while iterating through the next nodes to find the temp that is equal to DS*/
                if (flag == false)
                {
                    prevJava = tempJava;
                    tempJava = tempJava->next;
                    flag = true;
                }
                else
                {
                    tempJava = tempJava->next;
                }

            }

            /*temp = temp->next;
            tempJava = tempJava->next;
            tempDS = tempDS->next;*/
        }
        prev->next = a;
    }
    a->next = NULL;

    return a;
}

问题出在temp = temp-&gt;下一行。虽然第一次运行完全正常,然后正确搜索ListJava以找到与ListDS相等的名称,临时值是0xcdcdcdcd {...},它会抛出异常:

Exception thrown at 0x00C38EF0 in Exercise3_zitima2.exe: 0xC0000005: Access violation reading location 0xCDCDCDE5.

我如何应对这个错误,我真的在这里和那里搜索过尝试的东西,但似乎没有任何结果。我知道这不是一个要求别人解决我的任务的地方,只需要一点点的指导。

2 个答案:

答案 0 :(得分:3)

您的var xParameter = commonSelector.Parameters[0]; 结构没有构造函数,因此当您在Student中分配一个并将其分配给a时,MergeLists将会有垃圾。 (0xCDCDCDCD是MSVC填充分配的内存,因此您可以看到这些未初始化的用法。)

您需要让构造函数将a->next指针设置为next,或者在分配后将其手动设置为NULL

答案 1 :(得分:1)

合并列表函数通常用于合并两个已排序的列表。不涉及节点分配。将来自一个列表的第一个节点与另一个列表的第一个节点进行比较。较小的节点将从其列表中删除,并附加到最​​初为空的列表,该列表将以合并的节点结束。唯一更改的节点成员是下一个指针。重复该过程,直到到达其中一个列表的末尾,然后将添加到合并列表的最后一个节点的下一个指针设置为指向另一个列表的其余部分的第一个节点,并完成合并