2021/06/02 关于链表插入与邻接表表示图

 

今天又是给数据结构补课的一天。。所谓基础不牢地动山摇。做pta的时候想尝试看用邻接表的形式来表示,结果被一个单链表的插入卡了两个小时。。最后才发现是调入函数的参数类型出错了;

(想改变本地变量必须调用它的地址)

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int date;
	struct node *next;
}link;
void insert(link **head,int a) //如果这个位置用的是*head就会插入不成功。。多么简单的道理,我是被前面的一个*混淆了。。
{
	link *no;
	no=(link*)malloc(sizeof(link));
	no->date=a;
	no->next=NULL;
	if(*head==NULL)//如果头为空直接插入 
	{
		*head=no;
	}
	else
	{
		link *t;
		t=*head;
		while(t->next!=NULL)
		{
		t=t->next;	//走到最后 
		}
		t->next=no;
	}	
}
int main()
{
	link *head,*t;
	head=NULL;
	int i;
	for(i=0;i<10;i++)
	{	
		insert(&head,i);
	}
	t=head;
	while(t!=NULL)
	{
		printf("%d\n",t->date);
		t=t->next;
	}
	return 0;
}

 

本来写邻接表照着自己的理解洋洋洒洒写了一百多行,运行的时候各个函数都调试过没有问题,单单是最基础的链表插入出了差错。。真想爆粗。。。

以下是我个人写的邻接表表示图;

我承认写得实在是烂。。

#include<stdio.h>
#include<stdlib.h>
#define inf 9999999
typedef struct node{
	int ret;//邻接点的下标
	int lenth;//路径的长度
	int price;//路径所收费用
	struct node *next;
}link;//单链表
typedef struct enode{
	link *First;
}graph;//所谓邻接表只是用了一个储存链表头结点的数组罢了
int N,M;
int dist[1000];//最短路径 
int S[505];
int pri[505];//最小金额 
int path[505];
graph *G[505];
void insert(link **head,int a1,int a2,int a3)//插入边 
{
	link *node;
	node=(link*)malloc(sizeof(link));
	node->ret=a1;//ret表示邻接点的下标 
	node->lenth=a2;
	node->price=a3;
	node->next=NULL;
	if(*head==NULL)
	{
		*head=node;
	}
	else
	{
		link *t;
		t=*head;
		while(t->next!=NULL)
		{
			t=t->next;
		}
		t->next=node;
	}
}
int isEdge(int a,int b)//判断是否有边 
{
	link *t;
	t=G[a]->First;
	while(t!=NULL)
	{
		if(t->ret==b)
		{
			return 1;
		    break;	
		}
		t=t->next;
	}
	return 0;
}
int getlen(int a,int b)//得到路径长度
{
	link *t;
	t=G[a]->First;
	while(t!=NULL)
	{
		if(t->ret==b)
		{
			return t->lenth;
			break;
		}
		t=t->next;
	}
	return -1;
}
int getpri(int a,int b)//得到金额 
{
	link *t;
	t=G[a]->First;
	while(t!=NULL)
	{
		if(t->ret==b)
		{
			return t->price;
			break;
		}
		t=t->next;
	}
	return -1;
}

int main()
{
	int i,x1,x2,x3,x4,s,d;
	scanf("%d%d%d%d",&N,&M,&s,&d);
	for(i=0;i<N;i++)
	{
		G[i]=(graph*)malloc(sizeof(graph));		//邻接表初始化
		G[i]->First=NULL;
	}
	for(i=0;i<M;i++)
	{
		scanf("%d%d%d%d",&x1,&x2,&x3,&x4);			
		insert(&G[x1]->First,x2,x3,x4);//插入边,路径长度等信息
		insert(&G[x2]->First,x1,x3,x4);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值