C++实现图的邻接表

#include<iostream>
#include "malloc.h"
using namespace std;
#define Max 100
//邻接表实现图的DFS
//邻接表每一个链表节点的结构,有一个指向下一个节点的指针,一个存放权值的结构,一个存放节点的信息
typedef struct node
{
	 int data;
	 struct node* next;
	 int info; 
}linknode;

//表头信息,每一个节点都可以成为一次表头
typedef struct nodeheader
{
	int data;
	linknode* first;
}nodeh;

typedef struct graph
{
	int n,e;
	nodeh adjaceTable[Max];
}Graph;

void initGraph(Graph* &g)
{
	cin>>g->n>>g->e;
	for(int i=0;i<g->n;i++)
	{
		cin>>g->adjaceTable[i].data;
		g->adjaceTable[i].first = NULL;
	}
	
	for(int j=1;j<=g->e;j++)
	{
		 cout<<"in"<<endl;
		 int node1,node2;
		 cin>>node1>>node2;
		 cout<<node1<<node2;
		 for(int k=0;k<g->n;k++)
	     {
	     	 cout<<"ins"<<endl;
		      if(g->adjaceTable[k].data == node1)
			 {
			     if(g->adjaceTable[k].first == NULL) 
				 {
				     linknode *nodes = (linknode*)malloc(sizeof(linknode*));
				     nodes->data = node2;
					 nodes->next = NULL;
					 g->adjaceTable[k].first = nodes;  
			     }      
				 else
			     {
			     	 linknode *p = g->adjaceTable[k].first;
				     while(p->next != NULL)
				           p= p->next;
				     linknode *nodes = (linknode*)malloc(sizeof(linknode*));
				     nodes->data = node2;
					 nodes->next = NULL;
					 p->next = nodes;
				 } 
			 }
			 
		     if(g->adjaceTable[k].data == node2)
			 {
			     if(g->adjaceTable[k].first == NULL) 
				{
				     linknode *nodes = (linknode*)malloc(sizeof(linknode*));
				     nodes->data = node1;
					 nodes->next = NULL;
					 g->adjaceTable[k].first = nodes;  
			     }      
				 else
			     {
			     	 linknode *p = g->adjaceTable[k].first;
				     while(p->next != NULL)
				           p= p->next;
				     linknode *nodes = (linknode*)malloc(sizeof(linknode*));
				     nodes->data = node1;
					 nodes->next = NULL;
					 p->next = nodes;
				 } 
			 } 
	     }
		  
		
	}
}

void printGraph(Graph* g)
{
	for(int i=0;i<g->n;i++)
	{
		cout<<g->adjaceTable[i].data;
		if(g->adjaceTable[i].first != NULL)
		{
			linknode *p = g->adjaceTable[i].first;
			cout<<p->data<<"";
			p = p->next;
			while(p != NULL)
			{
				  cout<<p->data<<"";
				  p= p->next;
			}
		}
		cout<<endl;
	}	
}

int main()
{
	Graph *g = (Graph*)malloc(sizeof(Graph*));
	initGraph(g);
	printGraph(g);
	return 0;
} 

<think>好的,我需要帮助用户找到关于C++实现邻接表的资料和代码示例。用户已经提供了三个引用,我需要仔细查看这些引用的内容,看看哪些部分能用来回答问题。 首先,引用[2]提到使用C++实现邻接表,支持的创建、添加顶点和边、打印邻接表以及查询邻接点。这可能包含具体的代码结构。引用[3]详细解释了一个使用vector和指针实现的例子,提到了Node结构和动态数组的使用。这些信息应该能组成一个基本的代码示例。 我需要确保回答中的代码符合用户的要求,比如使用邻接表的结构,可能包括顶点和边的添加方法。同时,用户希望代码示例完整,所以我需要从引用中提取相关部分,并整合成一个连贯的示例。比如,引用[3]中的vector<Node> nodes可能用来存储节点,每个节点可能有邻接点的链表。引用[2]中的添加顶点和边的功能也需要在代码中体现。 另外,用户要求回答结构清晰,逐步解决问题。因此,我需要先解释邻接表的概念,再分步骤讲解代码实现,可能包括定义结构体、添加顶点和边的方法,以及示例用法。这样用户能一步步理解实现过程。 还要注意引用标识的正确使用,在解释各个部分时,引用对应的来源。例如,当提到使用vector存储节点时,引用[3],当讨论功能如添加边时,引用[2]。 最后,生成的相关问题需要与邻接表实现相关,比如性能优化、遍历方法或与其他结构的比较。这些问题应该能引导用户进一步学习。 现在需要检查是否有遗漏,比如是否覆盖了用户提到的所有功能:创建、添加顶点和边、打印邻接表、查询邻接点。确保代码示例包含这些部分,并且引用正确的来源。同时,代码语法是否正确,比如C++中的类定义和方法实现是否准确,指针使用是否正确,避免内存泄漏等问题。 总结下来,回答应包括邻接表的定义、C++实现步骤、完整代码示例、使用示例以及相关引用标注,最后附上相关问题。需要确保内容准确,符合用户需求,并且结构清晰易懂。</think>以下是一个使用C++实现邻接表数据结构的完整示例及分步解析: ### 邻接表实现步骤 1. **定义节点结构体** 使用`struct Node`存储顶点信息,并通过指针实现链表结构表示邻接关系[^3]。 2. **创建类** 封装顶点存储容器和操作方法,采用STL的`vector`实现动态数组管理。 3. **实现核心功能** 包含添加顶点、添加边、打印邻接表和查询邻接点等操作[^2]。 ```cpp #include <iostream> #include <vector> #include <string> using namespace std; // 定义邻接表节点结构 struct AdjListNode { int dest; // 目标顶点编号 AdjListNode* next; // 指向下一个邻接节点的指针 AdjListNode(int d) : dest(d), next(nullptr) {} }; // 定义顶点结构 struct Vertex { string name; // 顶点名称 AdjListNode* head; // 邻接链表头指针 Vertex(string n) : name(n), head(nullptr) {} }; class Graph { private: vector<Vertex> vertices; // 存储所有顶点的动态数组 public: // 添加新顶点 int addVertex(string name) { vertices.emplace_back(name); return vertices.size() - 1; // 返回顶点索引 } // 添加边(有向边) void addEdge(int src, int dest) { if (src >= vertices.size() || dest >= vertices.size()) return; // 创建新节点并插入链表头部[^2] AdjListNode* newNode = new AdjListNode(dest); newNode->next = vertices[src].head; vertices[src].head = newNode; } // 打印邻接表 void printGraph() { for (int i = 0; i < vertices.size(); ++i) { cout << vertices[i].name << " -> "; AdjListNode* current = vertices[i].head; while (current) { cout << vertices[current->dest].name << " "; current = current->next; } cout << endl; } } // 查询邻接点 vector<string> getAdjacent(int v) { vector<string> neighbors; AdjListNode* current = vertices[v].head; while (current) { neighbors.push_back(vertices[current->dest].name); current = current->next; } return neighbors; } ~Graph() { for (auto& v : vertices) { while (v.head) { AdjListNode* temp = v.head; v.head = v.head->next; delete temp; } } } }; // 使用示例 int main() { Graph g; int london = g.addVertex("London"); int paris = g.addVertex("Paris"); int berlin = g.addVertex("Berlin"); g.addEdge(london, paris); g.addEdge(paris, berlin); g.addEdge(berlin, london); g.printGraph(); return 0; } ``` ### 实现特点 1. **动态内存管理** 使用指针实现链表结构,析构函数自动释放内存 2. **时间复杂度** - 添加边:$O(1)$ - 查询邻接点:$O(d)$(d为顶点度数) 3. **空间效率** 存储空间为$O(|V|+|E|)$,适合稀疏[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值