动态列表<malloc.h>免费触发断点 - C编程

时间:2016-11-27 12:39:22

标签: c dynamic linked-list breadth-first-search

有人可以帮我解决这个问题。我借助动态列表在C编程语言中制作BFS算法。

这是我的代码。

// ConsoleApplication3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <malloc.h>

#define n 6

typedef struct field
{
    int x;
    int y;
    int dist;
    struct field *next;
}Field;

// Get row and column number of 4 neighbours
int rows[] = { -1, 0, 0, 1 };
int cols[] = { 0, -1, 1, 0 };

Field *addToEnd(Field *lst, Field field)
{
    Field *newField = (Field*)malloc(sizeof Field);
    newField = &field;
    newField->next = NULL;

    if (!lst)
        return newField;
    else
    {
        Field *current;
        for (current = lst; current->next; current = current->next);
        current->next = newField;
        return lst;
    }
}

// Check if field is/isn't out of range
bool isValid(int row, int col)
{
    return (row >= 0) && (row < n) && (col >= 0) && (col < n);
}

int BFS(int mat[][n], Field source, Field destination)
{
    bool visited[n][n];
    memset(visited, false, sizeof visited);

    // Mark the source field as visited
    visited[source.x][source.y] = true;

    // Create dynamic list
    Field *lst = NULL;
    source.dist = 0;

    // Adding the source field to the list
    lst = addToEnd(lst, source);

    while (lst)
    {
        // Getting first element in the list
        Field current = *lst;

        // If destination is reached then end function
        if (current.x == destination.x && current.y == destination.y)
            return current.dist;

        // Delete first element of the list
        Field *toDelete;
        toDelete = lst;
        lst = lst->next;
        free(toDelete);

        for (int i = 0; i < 4; i++)
        {
            int row = current.x + rows[i];
            int col = current.y + cols[i];

            // If adjacent field is valid, has path and isn't visited add it to the list
            if (isValid(row, col) && mat[row][col] == 0 && !visited[row][col])
            {
                visited[row][col] = true;
                Field adjField = { row, col, current.dist + 1 };
                lst = addToEnd(lst, adjField);
            }
        }
    }

    // Return -1 if destination can't be reached
    return -1;
}

int main()
{
    int mat[n][n] = 
    {
        { 0, 0, 0, 0, 0, 0 },
        { 0, 1, 1, 1, 1, 0 },
        { 0, 1, 0, 0, 0, 0 },
        { 0, 0, 0, 1, 1, 0 },
        { 0, 1, 0, 0, 0, 0 },
        { 0, 0, 0, 1, 1, 0 }
    };

    Field start = { 1, 0 }, end = { 5, 5 };

    int number = BFS(mat, start, end);

    if (number != -1)
        printf("%d\n", number);
    else
        printf("Destination can't be reached\n");

    return 0;
}

除了需要删除列表的第一个元素的部分代码之外的所有内容都正常工作。问题在于自由功能。

https://i.stack.imgur.com/QpK1j.png
https://i.stack.imgur.com/HXp8d.png

有没有人知道这可能有什么问题,我该如何解决?

0 个答案:

没有答案