今天又是给数据结构补课的一天。。所谓基础不牢地动山摇。做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;
}