1 #include <stdio.h>
  2 #include <stdlib.h>
  3 //定义最大定点数
  4 #define MAX_VERTEX_NUM 20
  5 
  6 //=========================----------邻接表的定义--------=====================================
  7 
  8 typedef struct ArcNode{
  9 int adjvex; //邻接点在图中的位置
 10 ArcNode *nextarc;
 11 int *info;  //info 该弧相关的信息指针
 12 }ArcNode;
 13 
 14 typedef struct VNode{
 15 char vexdata; //头结点存储的信息
 16 ArcNode *firstarc; //指向下一个邻接点
 17 } AdjList[MAX_VERTEX_NUM]; //定义最多表头----20
 18 
 19 typedef struct ALGraph{
 20 AdjList vertices;  //线性邻接表
 21 int vexnum,arcnum;
 22 //int kind;
 23 }ALGraph;
 24 
 25 //=========================----------邻接表结束定义-------=====================================
 26 
 27 //查找节点名称所在的位置
 28 int Locate_Vex(ALGraph * G, char ch)
 29 {
 30 for (int i = 0; i < G->vexnum; i++)
 31 {
 32 if(G->vertices[i].vexdata==ch) return i;
 33 }
 34 return -1;
 35 }
 36 
 37 ALGraph * Create_ALGraph()
 38 {
 39 ALGraph * algraph;
 40 char start,end; //start 表示顶点开始,end 表示顶点的结束
 41 int i,j;
 42 algraph = (ALGraph *)malloc(sizeof(ALGraph));
 43 printf("请输入点的个数和边数:");
 44 scanf("%d%d",&(algraph->vexnum),&(algraph->arcnum));
 45 printf("请输入顶点的名称:");
 46 for (int k = 0; k < algraph->vexnum; k++) //完成节点名字的存储
 47 {
 48 scanf("%s",&(algraph->vertices[k]).vexdata);
 49 algraph->vertices[k].firstarc = NULL;
 50 }
 51 for (int k = 0; k < algraph->arcnum; k++)
 52 {
 53 printf("请输入第%d条弧起始和终点:",(k+1));
 54 fflush(stdin);
 55 scanf("%c %c",&start,&end);
 56 //创建A->B链式存储结构
 57 ArcNode *arcnode = (ArcNode *)malloc(sizeof(ArcNode));
 58 i = Locate_Vex(algraph,start);
 59 j = Locate_Vex(algraph,end);
 60 arcnode->adjvex = j;
 61 arcnode->nextarc = algraph->vertices[i].firstarc;
 62 algraph->vertices[i].firstarc = arcnode;
 63 //创建B->A链式存储结构
 64 arcnode = (ArcNode *)malloc(sizeof(ArcNode));
 65 arcnode->adjvex = i;
 66 arcnode->nextarc = algraph->vertices[j].firstarc;
 67 algraph->vertices[j].firstarc = arcnode;
 68 }
 69 return algraph;
 70 }
 71 
 72 void Print_ALGraph(ALGraph * algraph)
 73 {
 74 VNode *p;
 75 ArcNode *q;
 76 for (int i = 0; i < algraph->vexnum; i++)
 77 {
 78 p = &(algraph->vertices[i]);
 79 printf("%c",p->vexdata);
 80 q = p->firstarc;
 81 while (q)
 82 {
 83 printf("-->");
 84 printf("%c",algraph->vertices[q->adjvex].vexdata);
 85 q = q->nextarc;
 86 }
 87 printf("\n");
 88 }
 89 
 90 }
 91 
 92 void Excute_Delete(ALGraph *G,int firstarc, int adjvex)
 93 {
 94 int flag = 0; //定义标志量,如果要删除点紧连接在接点头,值为1
 95 VNode *p = &(G->vertices[firstarc]);
 96 ArcNode *q = p->firstarc;
 97 ArcNode *r;
 98 r = q;
 99 while (q)
100 {
101 flag++;
102 if(q->adjvex == adjvex)
103 {
104 if(flag==1)
105 {
106 p->firstarc = q->nextarc;
107 break;
108 }
109 r->nextarc = q->nextarc;
110 free(q);
111 break;
112 }
113 r = q;
114 q = q->nextarc;
115 }
116 }
117 
118 void Delete_Arc(ALGraph *algraph, char start, char end)
119 {
120 int i,j;
121 i=Locate_Vex(algraph,start);
122 j=Locate_Vex(algraph,end);
123 //删除A->B邻接表结构
124 Excute_Delete(algraph,i,j); //执行清除
125 //删除B->A邻接表结构
126 Excute_Delete(algraph,j,i); //执行清除
127 }
128 
129 int main(void)
130 {
131 ALGraph * algraph;
132 char start,end;
133 algraph = Create_ALGraph();
134 printf("\n打印邻接表如下:\n");
135 Print_ALGraph(algraph);
136 printf("\n请输入需要删除的边:");
137 fflush(stdin);
138 scanf("%c %c",&start,&end); //注意有空格
139 Delete_Arc(algraph,start,end);
140 printf("\n打印已经删除边如下:\n");
141 Print_ALGraph(algraph);
142 system("pause");
143 return 0;
144 }
145 /*
146 Output:
147 请输入点的个数和边数:5 6
148 请输入顶点的名称:A B C D E
149 请输入第1条弧起始和终点:A B
150 请输入第2条弧起始和终点:A D
151 请输入第3条弧起始和终点:B C
152 请输入第4条弧起始和终点:B E
153 请输入第5条弧起始和终点:C D
154 请输入第6条弧起始和终点:C E
155 
156 打印邻接表如下:
157 A-->D-->B
158 B-->E-->C-->A
159 C-->E-->D-->B
160 D-->C-->A
161 E-->C-->B
162 
163 请输入需要删除的边:A B
164 
165 打印已经删除边如下:
166 A-->D
167 B-->E-->C
168 C-->E-->D-->B
169 D-->C-->A
170 E-->C-->B
171 */

 

posted on 2013-03-11 00:07  Jason_shang  阅读(523)  评论(0)    收藏  举报