我正在做一个图表,我的图表只有相邻的矩阵工作正常,相邻的列表变得越来越多,将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;
}
答案 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>