图形邻接矩阵和列表错误

时间:2016-02-29 21:20:19

标签: c graph

我正在做一个图表,我的图表只有相邻的矩阵工作正常,相邻的列表变得越来越多,将adjmtx[3][2]的值更改为随机数:

Graph* graph = createGraph(4);
Graph* graph = createGraph(3);

这些似乎有效,但是这个:

Graph* graph = createGraph(5);

导致崩溃。我不明白的是当我调试所有功能时。它能是什么?

#include <stdio.h>
#include <stdlib.h>

typedef struct Node{
    int num;
    struct Node* next;
}Node;

typedef struct Graph{
    int nodes;
    int** adjmtx;
    Node** adjlist;
}Graph;

Node* createHead(){
    Node* head = malloc(sizeof(Node));
    head->next = NULL;
    return head;
}

Node* createNode(int num){
    Node* node = malloc(sizeof(Node));
    node->num = num;
    node->next = NULL;
    return node;
}

void addAdjlist(Node* head, int num){
    Node* node = createNode(num);
    while(head->next != NULL && head->next->num < node->num){
        head = head->next;
    }
    node->next = head->next;
    head->next = node;
}

Node** createAdjlist(int** adjmtx, int nodes){
    Node** adjlist;
    int i, j;
    adjlist = malloc(sizeof(Node*));
    for(i=0 ; i<nodes ; i++){
        adjlist[i] = createHead();
        for(j=0 ; j<nodes ; j++){
                if(adjmtx[i][j] != 0)
                    addAdjlist(adjlist[i],j);
        }
    }
    return adjlist;
}

int** createAdjmtx(int nodes){
    int** adjmtx, i, j;
    adjmtx = malloc(sizeof(int*));
    for(i=0 ; i<nodes ; i++)
        adjmtx[i] = malloc(sizeof(int));
    for(i=0 ; i<nodes ; i++){
        for(j=0 ; j<nodes ; j++)
            adjmtx[i][j] = 0;
    }
    for(i=0 ; i<nodes ; i++){
        for(j=i ; j<nodes ; j++){
            if(i!=j){
                printf("[%d]-[%d]",i,j);
                scanf("%d",&adjmtx[i][j]);
                adjmtx[j][i] = adjmtx[i][j];
            }
        }
    }
    return adjmtx;
}

Graph* createGraph(int nodes){
    Graph* graph = malloc(sizeof(Graph));
    graph->nodes = nodes;
    graph->adjmtx = createAdjmtx(nodes);
    graph->adjlist = createAdjlist(graph->adjmtx,nodes);
    return graph;
}


void viewAdjmtx(int** adjmtx,int nodes){
    int i, j;
    for(i=0 ; i<nodes ; i++){
        for(j=0 ; j<nodes ; j++){
            printf("%d\t",adjmtx[i][j]);
        }
        printf("\n");
    }
}

void viewAdjlist(Node** adjlist,int nodes){
    int i;
    for(i=0 ; i<nodes ; i++){
        printf("[%d]:",i);
        while(adjlist[i]->next != NULL){
            printf("%d -> ",adjlist[i]->next->num);
            adjlist[i] = adjlist[i]->next;
        }
        printf("NULL\n");
    }
}
int main(){
    Graph* graph = createGraph(4);
    viewAdjmtx(graph->adjmtx,graph->nodes);
    viewAdjlist(graph->adjlist,graph->nodes);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您没有为数据结构分配足够的内存。

    <DataGrid x:Name="dataGrid" BorderThickness="2" Margin="8,125,139,8" ColumnHeaderHeight="24" HorizontalGridLinesBrush="#FF009444" VerticalGridLinesBrush="#FF009444" BorderBrush="#FF009444" Background="White" RowHeight="20" FontFamily="Segoe UI Light" FontSize="14.8" AutoGenerateColumns="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" HeadersVisibility="Column" CanUserResizeRows="False" HorizontalScrollBarVisibility="Disabled" Padding="0">

        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="BorderThickness" Value="2" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="White" />
                        <Setter Property="Foreground" Value="Black" />
                        <Setter Property="BorderThickness" Value="0" />
                        <Setter Property="BorderBrush" Value="#FF009444" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>


        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="BorderThickness" Value="0" />
                        <Setter Property="BorderBrush" Value="#FF009444" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>

        <DataGrid.Resources>

            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Background" Value="#FF39B54A" />
                <Setter Property="BorderBrush" Value="#FF009444"/>
                <Setter Property="BorderThickness" Value="0,0,2,2"/>
                <Setter Property="Foreground" Value="White"/>
            </Style>
        </DataGrid.Resources>


        <DataGrid.Columns>
            <DataGridTextColumn x:Name="Column1" Header=" #" Binding="{Binding Name}" Width="20" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="Column2" Header=" Position" Binding="{Binding Name}" Width="90" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="Column3" Header=" Type" Binding="{Binding Name}" Width="71" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="Column4" Header=" Delay" Binding="{Binding Name}" Width="76" IsReadOnly="True"/>
            <DataGridTemplateColumn x:Name="Column5" Header=" [ ]" Width="20">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding Name}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn x:Name="Column6" IsReadOnly="True" Header="Description" Binding="{Binding Name}" Width="584"/>
        </DataGrid.Columns>
    </DataGrid>

您只为一个条目而不是adjmtx = malloc(sizeof(int*)); for(i=0 ; i<nodes ; i++) adjmtx[i] = malloc(sizeof(int)); .... adjlist = malloc(sizeof(Node*)); 条目分配了足够的内存,因此您正在写入已分配内存的边界,从而导致未定义的行为。

为每个条目分配nodes个条目:

nodes

另外,完成后,请务必adjmtx = malloc(nodes * sizeof(int*)); for(i=0 ; i<nodes ; i++) adjmtx[i] = malloc(nodes * sizeof(int)); .... adjlist = malloc(nodes * sizeof(Node*)); free main。{/ p>

相关问题