인접성 목록의 C 언어 구현

도 기억 연구에서 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;
} 

 

추천

출처blog.csdn.net/qq_39445165/article/details/92692027