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 */
浙公网安备 33010602011771号