问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++建立邻接表,程序出错,下面是代码

发布网友 发布时间:2022-05-13 09:51

我来回答

3个回答

热心网友 时间:2023-10-05 11:19

/**
 *
 * 处理流程是:先根据图的顶点数创建一个空的邻接表,然后
将图的信息输入邻接表(由CeateList函数完成)
 *
**/
#include <iostream>
using namespace std;
class Node
{
public:
char data;
Node *next;
int info;
public:
Node(){next=NULL;}
};

class AdjList
{
private:
Node *node;
int vernum;
public:
void Initialize(int);
void CreatList();
void display();
};
void AdjList::Initialize(int n)
{
int i;
vernum=n;
node=new Node[n];
for(i=0;i<n;i++)
{
node[i].info=i;
node[i].data='A'+i;
}
}

//@ 创建邻接表
void AdjList::CreatList()//char a,char b
{
int i,j;
int num;//@ 与某个顶点相邻接的顶点的数量
Node *p_node_new;//@ 新创建的节点
Node *p_node_second;//@ 链表中的第二个节点
char c;//@ 输入的顶点
for(i=0;i<vernum;i++)
{
printf("请输入与第%d个顶点[%c]相邻的顶点数:",i,node[i].data);
cin>>num;
printf("请输入与[%c]相邻的顶点,用大写字母进行输入:",node[i].data);

//@ 输入顶点,并加入node[i]链。
for(j=0;j<num;j++)
{
cin>>c;
p_node_new=new Node;
p_node_new->data=c;
p_node_new->info=c-'A';

//@ 将新节点插入到链表开头
p_node_second=node[i].next;
node[i].next=p_node_new;
p_node_new->next=p_node_second;
}
}
/*
Node *t=new Node();
int i,j;
for(i=0;i<vernum;i++)
{

for(j=0;j<vernum;j++)
{
if(node[i].data==a && node[j].data==b)
{
t=&node[i];

while(t->next!=NULL)
{
t=t->next;
}
t->next=&node[j];
return;
}
}
}
*/
}
void AdjList::display()
{
int i;
for(i=0;i<vernum;i++)
{
//Node *T=new Node();
Node *T; //@ 这里是遍历现存的链表,不需要new
cout<<node[i].info<<" "<<node[i].data<<"-";
T=node[i].next;
while(T!=NULL)
{
cout<<T->info<<"-";
T=T->next;
}
cout<<"^"<<endl;
//delete T;
}
}
int main()
{
AdjList a;
int i,j,t,num,arc;
char c1,c2;

cout<<"请输入图的顶点数: ";
cin>>t; //@ 顶点数
a.Initialize(t);//@ 创建空表
cout<<"创建的邻接表为:\n";
a.display();
a.CreatList();//@ 将图的信息存入表中

cout<<endl;
cout<<"输入的端邻接表为:"<<endl;
a.display();

return 0;
}

热心网友 时间:2023-10-05 11:20

这个地方,相当于是删除了i到j之间的Node,但是有两个问题
1:删去的Node内存没有释放

2:删除之后,从j到vernum之间的Node的info值需要修改一下

追问编译是通过的,是逻辑错误,下面是测试数据
输入1
5 7
A B
A D
A E
B D
C B
C E
E D
输出
0 A-1-3-4-^
1 B-3-^
2 C-1-4-^
3 D-^
4 E-3-^

我知道在哪出错了,在输入完A B A D A E后建立了一个链表A->B->D->E
输入B D后,本意是要建立B->D,但前面的指向保留了下来,实际建立的是B->D->E->D

知道怎样修改吗

追答你这个CreateList(a,b) 是找到a,b对应的节点,然后把a节点开始的最后一个链表元素和b连起来
所以 "在输入完A B A D A E后建立了一个链表A->B->D->E" 在这个之后

再输入B D 就是把D放在 B链表结尾 就是 A->B->D->E->D(后面形成循环链),

不知道你想要的结果是什么。

热心网友 时间:2023-10-05 11:20

#include <iostream>
using namespace std;

#define MAX_SIZE 20

class Node // 图的顶点类
{
public:
char data;
Node *next;
int info;
public:
Node(){next=NULL;}
};

class AdjList // 邻接表类
{
private:
Node *node; //Node node[MAX_SIZE];
int vernum;
public:
void Initialize(int);
void CreatList(char ,char);
void display();
};
void AdjList::Initialize(int n)
{
int i;
vernum=n;
node=new Node[n];
for(i=0;i<n;i++)
{
node[i].info=i;
node[i].data='A'+i;
node[i].next = NULL;
}
}
void AdjList::CreatList(char a,char b)
{
int i,j;
for(i=0;i<vernum;i++)
{
for(j=0;j<vernum;j++)
{
if(node[i].data==a && node[j].data==b)
{
if(!node[i].next) // 如果下一个结点为空
{
Node * p = new Node(); // 建立一个伪结点
p->data = NULL;
p->info = j;
p->next = NULL;
node[i].next = p;
}
else
{
Node * p = new Node();
p = node[i].next;
while(p->next) // 知道p的下一个结点为空
{
p = p->next;
}

Node * q = new Node();
q->data = NULL;
q->info = j;
q->next = NULL;
p->next = q;
}
return;
}
}
}
}
void AdjList::display()
{
int i;
for(i=0;i<vernum;i++)
{
Node *T=new Node();
cout<<node[i].info<<" "<<node[i].data<<"-";
T=node[i].next;
while(T!=NULL)
{
cout<<T->info<<"-";
T=T->next;
}
cout<<"^"<<endl;
delete T;
}
}
int main()
{
AdjList a;
int i,t,num,arc;
char c1,c2;
cout<<"输入图的个数:";
cin>>t;
while(t--)
{
cout<<endl<<"输入顶点数和弧数:";
cin>>num>>arc;
a.Initialize(num);
cout<<"输入"<<arc<<"条弧的起点和终点:"<<endl;
for(i=0;i<arc;i++)
{
cin>>c1>>c2;
a.CreatList(c1,c2);
}
cout<<"图的邻接表为:"<<endl;
a.display();
}
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
单位高温防护欠缺致员工中暑如何对待 狗狗为什么爱看视频 360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 不能将Lnode * 类型的值分配到Lnode * 类型的实体 C++出错Run-Time Check Failure #2 - Stack around the variable &#39;temp&#39; was corrupted. 学校校园网怎么用无线路由器啊 我们学校用的是校园网拨号上网 i Node智能客户端上网的能用无线路由器不? 什么是UNIX i-node 这个文件系统有是什么啊。和NTFS还有FAT有什么区别啊 netstat linux i-node是什么意思 听说街上卖的霉豆腐,两天就能发霉里面放了什么?对人有危害吗? 招商银行信用卡账单日每月5号,到期还款日是每月23日。拜托各位大神 招商银行信用卡每月账单日:22日,到期还款日:10日。也就是说我3月5日消费了,3月10日就要还清吗? 女人哪个部位吸引男人 那种要胸有胸,要*有*,要脸蛋有脸蛋,这种美女在足疗城是红人,为什么一般人她看不上? 女孩不喜欢把胸和屁股给男人摸吗 谁知道这首个却名字哇http:&#47;&#47;www.tudou.com&#47;programs&#47;view&#47;r2_uysaDGYE&#47; 我想给儿子却名字,姓刘。昌字辈的一定要姓刘 赵姓男孩却名字,五行缺金、缺水,出生于2011年农历9月18日13:05分,帮忙给个建议 急!!!广西司法考试 到底要去哪里现场确认 带什么证件 广西公务员司法考试考什么? 没有钥匙怎么开挂锁 怎么查看自己是不是被封了? 关于汽车零部件的简称 汽车车身上各种英文缩写代表什么意思? C语言 结构体指针的问题 请解释下lnode * create()这个 函数的每条语 ... 单链表尾差法中,Lnode *s,*r=L这条语句是什么意思 为什么free()函数中LNode-&gt;next为NULL 同学们向在校园里欢唱的小鸟打招呼向敬爱的老师问好向高高飘扬的国旗敬礼 L=(LNode *)malloc(sizeof(LNode)); 同学们在校园里向()小鸟打招呼,向()老师问好,向(丿国旗敬礼。 向敬爱的老师问好向高高飘扬的国旗敬礼表现了同学们的什么精神 制作一张赞扬老师或同学的赞扬卡 同学们向校园里欢唱的小鸟打招呼,向敬爱的老师问好,向高高飘扬的国旗敬礼这句话是什么意思 爱拼才会赢作文 高中的 要700字以上 求助一篇《爱拼才会赢》的文章 我现在是做货拉拉的车贴也贴了,还可以加入滴滴货运吗 如何办理建设用地规划许可证和建设工程规划许可证 高分求自创以“爱拼才会赢”为题的议论文。 建设用地规划许可证需要哪些申请材料 求:&quot;爱拼才会赢&quot;三分钟演讲稿.!急急急. 滴滴货运车贴协议终止还能跑吗 怎么加入滴滴?需要交钱么?有年龄限制吗? 威海滴滴货运上线了没有 滴滴货运未开通上岗什么意思