鱼C论坛

 找回密码
 立即注册
查看: 2016|回复: 6

[已解决]这个上面明明已经分配空间了,为什么会这样呀?

[复制链接]
发表于 2023-2-23 12:08:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
YQ236~40{G%[}1QN_[{N(@R.png
  1. #include <stdio.h>

  2. #define scanf scanf_s
  3. #define MAXVEX 8                        // 最大顶点数
  4. #define INFINITY 65535                // 用65535来代表无穷大

  5. //表示元素的数据类型
  6. typedef char ElemType;

  7. //顶点节点
  8. typedef struct VertexNode {
  9.     ElemType data;
  10.     struct EdgeNode *first;
  11. }VertexNode;

  12. //边节点
  13. typedef struct EdgeNode {
  14.     int adjvex; //邻接域
  15.     int weight; //权
  16.     struct EdgeNode *next;  //指向下一个邻接点
  17. }EdgeNode;

  18. //头节点;记录节点数和边数
  19. typedef struct headNode {
  20.     VertexNode node[MAXVEX];
  21.     int numVertexes, numEdges;
  22. }headNode;

  23. //创建边节点
  24. void create_Edge(struct VertexNode* Vertex, int number, int weight) {
  25.     struct EdgeNode* Edge, * temp;

  26.     Edge = (struct EdgeNode *)malloc(sizeof(struct EdgeNode));
  27.     Edge->adjvex = number;
  28.     Edge->weight = weight;
  29.     Edge->next = NULL;

  30.     if (Vertex->first) {
  31.         Vertex->first = Edge;
  32.     }
  33.     else {
  34.         temp = Vertex->first;
  35.         while (temp->next) {
  36.             temp = temp->next;
  37.         }
  38.         temp->next = Edge;
  39.     }
  40. }

  41. // 建立邻接表
  42. void Create_Adjacencytables(headNode * head){
  43.     int i, j, k, w;

  44.     printf("请输入顶点数和边数:\n");
  45.     scanf("%d %d", &head->numVertexes, &head->numEdges);  //获取边的顶点数和边数
  46.     getchar();  //吸收换行符

  47.     //读取顶点信息
  48.     for (i = 0; i < head->numVertexes; i++) {
  49.         scanf("%c", &head->node[i].data);
  50.         head->node[i].first = NULL;                // 初始化置为空表
  51.         getchar();  //吸收换行符
  52.     }

  53.     //读取边节点信息
  54.     printf("请输入边(i,j)的i,j和对应的权w;格式(i j w):\n");
  55.     for (i = 0; i < head->numEdges; i++) {
  56.         scanf_s("%d %d %d", &j, &k, &w);
  57.         create_Edge(head->node + j, k, w);
  58.     }
  59. }

  60. //Prim算法生成最小生成树
  61. void MiniSpanTree_Prim(headNode head) {
  62.     int min, i, j, k;
  63.     int adjvex[MAXVEX];     //记录顶点的连接;储存所有可接触到的顶点和确定相连顶点间最小权值
  64.     int lowcost[MAXVEX];    // 保存相关顶点间边的权值
  65.     EdgeNode *edge;

  66.     adjvex[0] = 0;  //0顶点作为最小生成树的根开始遍历,权值为0
  67.     lowcost[0] = 0; //表示0顶点与已确定相连

  68.     //初始化------------------
  69.     for (i = 0; i < head.numVertexes; i++) {
  70.         lowcost[i] = INFINITY;  //先全部初始化为INFINITY
  71.         adjvex[i] = 0;  //先全部初始化为0
  72.     }
  73.     for (edge = head.node[i].first; edge; edge = edge->next){
  74.         lowcost[edge->adjvex] = edge->weight;   //将邻接矩阵第0行所有权值先加入数组
  75.     }

  76.     //构造最小生成树的过程
  77.     for (i = 0; i < head.numVertexes; i++) {
  78.         min = 65535;    //初始化最小权值为65535等不可能数值
  79.         k = 0;  //当前顶点初始化为0
  80.         j = 1;  //从1开始遍历

  81.         //遍历其他全部顶点
  82.         while (j < head.numVertexes) {
  83.             //找出lowcost数组已存储的最小权值
  84.             if (lowcost[j] != 0 && lowcost[j] < min) {
  85.                 min = lowcost[j];   //记录最小权值
  86.                 k = j;  //记录最小权值的下标
  87.             }
  88.             j++;
  89.         }

  90.         //打印当前顶点边中权值最小的边
  91.         printf("(%d,%d) ", adjvex[k], k);
  92.         lowcost[k] = 0;//将当前顶点k的权值设为0,表示k顶点与已确定相连

  93.         //逐个遍历k顶点与除已经确定连接顶点外全部顶点的权值
  94.         for (edge = head.node[k].first; edge; edge = edge->next) {
  95.             if (edge->weight < lowcost[edge->adjvex]) {   //判断顶点j与0顶点有路径的点;顶点j与0和k的路径长度
  96.                 lowcost[edge->adjvex] = edge->weight;    //如果顶点j与k的路径长度小于与0的路径长度
  97.                 adjvex[edge->adjvex] = k;  //讲顶点j与和k的路径设置为与确定相连顶点间权值最小的路径
  98.             }
  99.         }

  100.     }

  101. }


  102. int main() {
  103.     headNode head;

  104.     Create_Adjacencytables(&head);

  105.     MiniSpanTree_Prim(head);

  106.     return 0;
  107. }
复制代码
最佳答案
2023-2-23 15:27:04
本帖最后由 jhq999 于 2023-2-23 15:29 编辑
  1. if (Vertex->first) {
  2.         Vertex->first = Edge;
  3.     }
  4.     else {
  5.         temp = Vertex->first;//////////Vertex->first为假时
  6.         while (temp->next) {//////(temp->next出错,真假的应该调换过来
  7.             temp = temp->next;
  8.         }
  9.         temp->next = Edge;
  10.     }

  11.     }
  12.     else {
  13.         Vertex->first = Edge;
  14.     }
复制代码
  1. if (Vertex->first) {
  2.         temp = Vertex->first;
  3.         while (temp->next) {
  4.             temp = temp->next;
  5.         }
  6.         temp->next = Edge;
  7.     }
  8.     else {
  9.     Vertex->first = Edge;   
  10.     }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-23 15:27:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2023-2-23 15:29 编辑
  1. if (Vertex->first) {
  2.         Vertex->first = Edge;
  3.     }
  4.     else {
  5.         temp = Vertex->first;//////////Vertex->first为假时
  6.         while (temp->next) {//////(temp->next出错,真假的应该调换过来
  7.             temp = temp->next;
  8.         }
  9.         temp->next = Edge;
  10.     }

  11.     }
  12.     else {
  13.         Vertex->first = Edge;
  14.     }
复制代码
  1. if (Vertex->first) {
  2.         temp = Vertex->first;
  3.         while (temp->next) {
  4.             temp = temp->next;
  5.         }
  6.         temp->next = Edge;
  7.     }
  8.     else {
  9.     Vertex->first = Edge;   
  10.     }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-23 19:51:12 | 显示全部楼层

可是好像还是错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-23 19:53:15 | 显示全部楼层
御坂19090 发表于 2023-2-23 19:51
可是好像还是错误

发个样例过来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-23 20:06:05 | 显示全部楼层
53QHSW6%(9KLQWTWMB{8KL2.png
就改了一个感叹号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-23 20:06:40 | 显示全部楼层

但是这个错误好像还没有到那个!哪里。是其他原因
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-25 16:20:23 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAXVEX 32                        // 最大顶点数
  4. #define INFINITY 65535                // 用65535来代表无穷大
  5. /*6 8
  6. 1 2 7
  7. 2 4 1
  8. 4 5 4
  9. 2 5 2
  10. 1 5 3
  11. 1 6 8
  12. 1 3 2
  13. 3 6 9*/
  14. int pt[MAXVEX];
  15. typedef struct line
  16. {
  17.     int x,y,w ;
  18.     struct line *next;
  19. }line;
  20. typedef struct headNode
  21. {
  22.     int  pt[MAXVEX],havpt[MAXVEX];
  23.     line ln[MAXVEX],*tree[MAXVEX];
  24.     int ptnum,lnnum;
  25. }headNode;
  26. void create(headNode* hd)
  27. {
  28.     scanf("%d%d",&(hd->ptnum),&(hd->lnnum));
  29.     line* ln=hd->ln,*p=hd->ln;
  30.     for(int i=1;i<=hd->lnnum;i+=1)
  31.     {
  32.         scanf("%d%d%d",&ln[i].x,&ln[i].y,&ln[i].w);
  33.         p=ln;
  34.         while(p->next&&p->next->w<ln[i].w)p=p->next;
  35.         ln[i].next=p->next;
  36.         p->next=&ln[i];
  37.     }
  38.     p=ln;
  39.     while(p->next)
  40.     {
  41.         printf("%d--%d %d\n",p->next->x,p->next->y,p->next->w);
  42.         p=p->next;
  43.     }
  44. }

  45. // 建立邻接表


  46. //Prim算法生成最小生成树
  47. int MiniSpanTree(headNode *hd) {

  48.     int *pt=hd->pt,*hpt=hd->havpt,ct=0,i,min,j;
  49.     line* ln=hd->ln,*p=NULL,*ptmp;
  50.     pt[1]=1;
  51.     hpt[1]=1;
  52.     ct=1;
  53.     j=0;
  54.     while(ct<hd->ptnum)
  55.     {
  56.         min=INFINITY;
  57.         for(i=1,ptmp=NULL,pt[0]=0;pt[i];i+=1)
  58.         {
  59.             p=ln;
  60.             while(p->next)
  61.             {
  62.                 j+=1;
  63.                 if(pt[i]==p->next->x||pt[i]==p->next->y)
  64.                 {
  65.                     if(hpt[p->next->x]&&hpt[p->next->y])
  66.                     {
  67.                         p->next=p->next->next;
  68.                         continue;
  69.                     }
  70.                     else if((min>p->next->w)&&(hpt[p->next->x]||hpt[p->next->y]))
  71.                     {

  72.                             min=p->next->w;
  73.                             if(hpt[p->next->x])pt[0]=p->next->y;
  74.                             else pt[0]=p->next->x;
  75.                             ptmp=p;
  76.                             break;
  77.                     }
  78.                 }
  79.                p=p->next;
  80.             }
  81.         }
  82.         if(ptmp->next)
  83.         {
  84.             hd->tree[ct++]=ptmp->next;
  85.             pt[ct]=pt[0];
  86.             hpt[pt[0]]=1;

  87.             ptmp->next=ptmp->next->next;
  88.         }
  89.     }
  90.     return 0;
  91. }
  92. int main()
  93. {
  94.     headNode head={0};
  95.     create(&head);
  96.     MiniSpanTree(&head);
  97.     for(int i=1;head.tree[i];i+=1)
  98.         printf("%d--%d\n",head.tree[i]->x,head.tree[i]->y);

  99.     return 0;
  100. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 17:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表