#include<iostream>
#include<cstring>
using namespace std;
#define MAX 100
#define inf 10000
int A[MAX][MAX],visited[MAX],g[MAX];
typedef int elem_t;
typedef struct HeapStruct *Minheap;
struct HeapStruct{
elem_t H[MAX];//存盤堆元素的陣列
elem_t ph[MAX];
int size;//堆當前的元素個數
};
void Bubbleup(HeapStruct Heap,int n)
{
while(n>1)
{
if(Heap.H[n]<Heap.H [n/2])
{
int tmp=Heap.H [n];
Heap.H[n]=Heap.H[n/2];
Heap.H[n/2]=tmp;
n=n/2;
}
else
break;
}
}
int ExtractMin(HeapStruct Heap)
{
int M=Heap.H[1];
int pa,child,temp1;
temp1=Heap.H[Heap.size];
Heap.size--;
//Heap.H[Heap.size]=0;
for(pa=1;pa*2 <=Heap.size ;pa=child)//向下冒泡
{
child=2*pa;
if(Heap.H[child] > Heap.H[child+1]&&Heap.size>=child+1)
child++;
if(temp1 > Heap.H[child])
Heap.H[pa] = Heap.H[child];
else
break;
}
Heap.H[pa]=temp1;
visited[g[M]]=1;//這里出的問題
return M;
}
void Heapinsert(HeapStruct Heap,int n)
{
Heap.H[++Heap.size]= n;
Bubbleup(Heap,Heap.size);
}
void prim(int m,int n,int A[MAX][MAX],int p[],HeapStruct Heap)
{
p[m]=0;
int temp=m;
visited[m]=1;
for(int k=1;k<=n;k++)//生成堆
{
if(A[m][k]!=0)
{
p[k]=m;
g[A[m][k]]=k;
Heapinsert(Heap,A[m][k]);
Heap.ph[k]=Heap.size;
}
}
m=g[ExtractMin(Heap)];
while(Heap.size!=0)
{
visited[m]=1;
for(int i=1;i<=n;i++)
{
if(A[m][i]<Heap.H[Heap.ph[i]]&&A[m][i]!=0&&visited[i]!=1)
{
p[i]=m;
g[A[m][i]]=i;
Heap.H[Heap.ph[i]]=A[m][i];
Bubbleup(Heap,Heap.ph[i]);
}
}
m=g[ExtractMin(Heap)];
}
for(int j=1;j<=n;j++)
if(j!=temp)
cout<<p[j]<<"->"<<j<<endl;
}
First-chance exception in project2.exe: 0xC0000005: Access Violation.
uj5u.com熱心網友回復:
崩潰的時候在彈出的對話框按相應按鈕進入除錯,按Alt+7鍵查看Call Stack即“呼叫堆疊”里面從上到下列出的對應從里層到外層的函式呼叫歷史。雙擊某一行可將游標定位到此次呼叫的源代碼或匯編指令處,看不懂時雙擊下一行,直到能看懂為止。判斷是否越界訪問,可以在陣列的最后一個元素之后對應的地址處設定資料讀寫斷點。如果該地址對應其它變數干擾判斷,可將陣列多宣告一個元素,并設定資料讀寫斷點在該多出元素對應的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本來是b[10],為判斷哪句越界,故意宣告為b[11]
srand((unsigned int)time(NULL));//按兩次F11,等黃色右箭頭指向本行時,除錯、新建斷點、新建資料斷點,地址:&b[10],位元組計數:4,確定。
while (1) {//按F5,會停在下面某句,此時a的值為10,b[10]已經被修改為對應0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}
uj5u.com熱心網友回復:
當你運行程式得到了一個AV(Access Violation)錯誤的時候,這意味著你的程式正在試圖訪問一塊不再有效的記憶體,請注意我所提到的“不再 ”有效。大多數的情況下,出現這個錯誤要么是因為你試圖訪問一塊已經被釋放的記憶體,要么是想使用一個還未創建物件的指標。訪問陣列visited越位了吧
給的代碼連main函式也沒有,沒注釋,怎么呼叫也不知道,什么也沒有,怎么看
uj5u.com熱心網友回復:
visited對應陣列,取下標等,有問題。越界了uj5u.com熱心網友回復:
int main(){
memset(g,0,sizeof(g));
memset(visited,0,sizeof(visited));//初始化為0
int n,m,p[MAX];
HeapStruct Heap;
Heap.size=0;
cout<<"請輸入頂點個數:";
cin>>n;
for(int i=1;i<=n;i++)
{
Heap.H[i]=inf;
cout<<"請輸入與"<<i<<"相鄰接的頂點的權重: ";
for(int j=1;j<=n;j++)
cin>>A[i][j];
}
cout<<"請輸入你想創建的最小生成樹的起點:";
cin>>m;
prim(m,n,A,p,Heap);
return 0;
}
抱歉,這是主函式
uj5u.com熱心網友回復:
抱歉哈,忘貼主函式了,還有那個visited怎么越位了
uj5u.com熱心網友回復:
我的visited大小是100啊,g(m)是6,應該不會越界
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/103861.html
標籤:基礎類
