도 기억 연구에서 1. 인접 행렬과 인접리스트는 일반적으로 두 개의 인접 아래 표 C에서 구현하여도 저장 방식을 사용
2. 다음과 같이 구체적인 구현 프로세스는 다음과 같습니다
① 먼저, 얀 웨이 최소 버전 데이터 구조로 언급 될 수있는 구조의 일측에 관한도 명세서의 구조, 그래프의 정점의 구성 등을 이용하여 구조는 특정 데이터 구조를 작성한다 :
typedef struct ArcNode{
int adjvex;//该边所指向的节点的位置
struct ArcNode *nextarc;
// 边的信息, 例如边的权重
int info;
}ArcNode;
typedef struct{
//顶点表存储当前顶点的信息
int data;
//指向边的指针
ArcNode *firstarc;
}Vnode;
typedef struct{
//顶点数组
Vnode adjlist[maxSize];
//图中的顶点的数目和边的数目
int n, e;
}AGraph
지도에 대한 메모리 공간을 할당 이러한 구조는 그래서 우리는지도에 대한 포인터를 가리키는 선언하고 malloc에 기능을 사용할 필요로 ② 다음에는 할당되지 않은 경우 첫 번째면은 정점을 초기화 할 때, 다음 오류가 이것이다, 발생 자바 언어의 다른 점
오류가 프로그램을 발생하지 않는 경우 ③ 처음에는 할당 목록의 첫 번째 정점 지점의 첫 번째 모서리에 대한 포인터에 대한 필요성은 NULL의 할당은,이 단계는 필수적입니다 때
여기에 저장하기 때문에 ④, 꼭지점의 수, 모서리의 수를 입력 콘솔에서 볼 자격 및 에지 가중치는 새 노드를 만들 ArcNode한다
노드는 그 정점 노드 포인터 빈 firstarc 현재 포인터 포인트를인지 널로, adjvex의 V를 할당도 시작 정점 포인터가 가리키는 제 에지 여부 입력측에 할당 한 후에 판정 NULL 인 노드의 목록을 통과 한 후 insertNode 방법의 목록에 삽입 호출이 비어 있지 않은 추가 최종 표면의 목록에 삽입
⑤ 우리가 이송 될 firstarc 정점에 대응하는 현재의 인덱스를 결정하는 정점들의 어레이를 통해 MAP, 및 루프를 통과 할 수 있기 때문에, 인접 테이블 후에 생성이 비어있는 빈은 측면이 있으며, 현재의 정점은도 아닌 설명 우리는 전체 정점 목록을 통과하는 동안 루프를 사용할 필요가
나는 가장 중요한 것은 초기화 오류 동안 C 언어 포인터가 나타납니다 달리뿐만 아니라 데이터 구조를 살펴 보는 것입니다있는 식의 각 요소의 의미를 이해하는 것입니다 NULL 느낌
다음과 같이 테스트 데이터는 다음과 같습니다
3. 다음은 특정 코드는 다음과 같습니다
#include<stdio.h>
#include<iostream>
#include<malloc.h>
#define maxSize 1000
using namespace std;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
int info;
}ArcNode;
typedef struct{
int data;
ArcNode *firstarc;
}Vnode;
typedef struct{
Vnode adjlist[maxSize];
int n, e;
}AGraph;
AGraph *graph;
void insertNode(ArcNode *node, ArcNode *newNode){
ArcNode *p = node;
while(p->nextarc != NULL){
p = p->nextarc;
}
p->nextarc = newNode;
}
void create(){
graph = (AGraph*)malloc(sizeof(AGraph));
cout << "输入顶点的数目: " << endl;
cin >> graph->n;
cout << "输入图中边的数目: " << endl;
cin >> graph->e;
cout << graph->n << " ";
int u = -1, v = -1, weight = -1;
for(int i = 0; i < graph->n; i++){
graph->adjlist[i].firstarc = NULL;
}
ArcNode *node;
cout << graph->e << endl;
for(int i = 0; i < graph->e; i++){
cin >> u >> v >> weight;
node = (ArcNode *)malloc(sizeof(ArcNode));
node->adjvex = v;
node->info = weight;
node->nextarc = NULL;
graph->adjlist[u].data = u;
if(graph->adjlist[u].firstarc == NULL){
//边
graph->adjlist[u].firstarc = node;
}else{
//插入边
insertNode(graph->adjlist[u].firstarc, node);
}
}
}
void travseTree(){
for(int i = 0; i < graph->n; i++){
if(graph->adjlist[i].firstarc != NULL){
cout << i << " ";
ArcNode *p = graph->adjlist[i].firstarc;
while(p != NULL){
cout << p->adjvex << " ";
p = p->nextarc;
}
cout << endl;
}
}
}
int main(void){
create();
travseTree();
return 0;
}