图的邻接链表创建与删除
#include<stdio.h>#include<stdlib.h>
#define MAX 20
struct node //弧的头结点
{ int position; //位置
struct node*next;
};
struct Vnode //弧的尾节点
{
int data;
struct node*first;
};
struct graph //图
{ int vex;//顶点数
int arc;//边数
struct Vnode S[MAX];
};
void creat(struct graph&M) //初始化一个图
{
int i;
printf("请输入点个数\n");
scanf("%d",&M.vex);
printf("请输入边数\n");
scanf("%d",&M.arc);
getchar();
for(i=0;i<M.vex;i++)
{
printf("请输入第%d个点\n",i+1);
scanf("%c",&M.S[i].data);
getchar();
printf("节点%c",M.S[i].data);
M.S[i].first=NULL; //初始化时都是孤立的节点,没有弧
}
}
void insert(struct graph &t) //插入弧
{
struct node*q;
char ch;
int i,j,p;
for(i=0;i<t.vex;i++)
{
printf("请输入与%c组成边的头节点\n",t.S[i].data);
while(((ch=getchar())!='\n'))
{ for(j=0;j<t.vex;++j)
{
printf("ch的值%c\n",ch);
printf("t的值%c\n",t.S[j].data);
if(ch==t.S[j].data) 就是这句话,很简单的一个判等,明明相等,他居然不执行!!!直接执行后面的了,为什么啊
{ p=j;
break;}
}
q=(struct node*)malloc(sizeof(struct node));
q->position=p;
q->next=t.S[j].first;
t.S[j].first=q;
printf("%d",q->position);
}
}
}
void delet(struct graph &t) //删除弧
{
struct node*p,*q;
int i,s,w;
char tail,head;
printf("请输入要删除的边,如a->b\n");
scanf("%c->%c",&tail,&head);
for(i=0;i<t.vex;i++)
{
if(tail==t.S[i].data)
w=i;
if(head==t.S[i].data)
s=i;
break;
}
p=q=t.S[w].first;
while(p!=NULL)
{
if(p->position!=s)
{
p=q;
p=p->next;
}
else
{
q->next=p->next;
free(p);
}
}
}
void print(struct graph t) //输出弧
{
int i;
struct node*p;
for(i=0;i<t.vex;i++)
{ p=t.S[i].first;
while(p!=NULL)
{ printf("%c->%c",t.S[i].data,t.S[p->position].data);
p=p->next;
}
printf("\n");
}
}
void main()
{
struct graph T;
int i,j;
creat(T);
insert(T);
print(T);
printf("请输入删出边的条数\n");
scanf("%d",&i);
for(j=0;j<i;j++)
delet(T);
print(T);
}