请编写一个完整的程序,建立有向图的邻接表存储结构,要求:

请编写一个完整的程序,建立有向图的邻接表存储结构,要求:,第1张

给你一个邻接表的完整程序:

#include <iostream.h>

struct node

{

int data

node *next

}

class list

{

public:

list(){head=NULL}

void MakeEmpty()

int Length()

void Insert(int x,int i)//将x插入到第i个结点(不含头结点)的之后

void Insertlist(int a,int b)//将节点b插入a之前

int Delete(int x)

int Remove(int i)

int Find(int x)

void Display()

private:

node *head

}

void list::Display()

{

node *current=head

while (current!=NULL)

{

cout<<current->data<<" "

current=current->next

}

cout<<endl

}

void list::MakeEmpty()

{

head=NULL

}

int list::Length()

{int n=1

node *q=head

if(q==NULL)

n=1

else

while(q!=NULL)

{

n++

q=q->next

}

return n

}

int list::Find(int x)//在链表中查找数值为x的结点,成功返回1,否则返回0

{

node *p=head

while(p!=NULL&&p->data!=x)

p=p->next

if(p->data==x)

return 1

else

return 0

}

void list::Insert (int x,int i)//将x插入到第i个结点(不含头结点)的之后;

{

node *p//p中放第i个结点

node *q//q中放i后的结点

node *h//h中存要插入的结点

h=new node

h->data =x

p=head

if(p->next !=NULL) //链表不是只有一个结点或者空链表时候

{

int n=1

while(p->next !=NULL)

{

n++

p=p->next

}// 得到链表的结点的个数

p=head//使p重新等于链首

if(i==n)//i=n时,直接加在最后面就行了

{

while(p->next !=NULL)

p=p->next

p->next=h

h->next =NULL

}

else if(i<n&&i>1)//先找到第i个结点,用p存第i个结点,用q存i后的结点,用h存要插入的结点

{

for(int j=1j<ij++)

p=p->next//找到第i个结点,用p存第i个结点

q=p->next//q存i后的结点

p->next=h

h->next=q

}

else

cout<<"超出链表结点个数的范围"<<endl

}

else

cout<<"这个链表是空链表或者结点位置在首位"<<endl

}

void list::Insertlist(int a,int b)//将b插入到结点为a之前

{

node *p,*q,*s//p所指向的结点为a,s所指为要插入的数b,q所指向的是a前的结点

s=new node

s->data=b

p=head

if(head==NULL)//空链表的时候

{

head=s

s->next=NULL

}

else

if(p->data==a)//a在链首时候

{

s->next=p

head=s

}

else

{

while(p->data!=a&&p->next!=NULL)//使p指向结点a,q指向a之前的结点

{

q=p

p=p->next

}

if(p->data==a)//若有结点a时候

{

q->next=s

s->next=p

}

else//没有a的时候

{

p->next=s

s->next=NULL

}

}

}

int list::Delete(int x)//删除链表中值为x的结点,成功返回1,否则返回0;

{

node *p,*q

p=head

if(p==NULL)

return 0

if(p->data==x)

{

head=p->next

delete p

return 1

}

else

{

while(p->data!=x&&p->next!=NULL)

{q=p

p=p->next

}

if(p->data==x)

{

q->next =p->next

delete p

return 1

}

else

return 0

}

}

int list::Remove(int i)

{

node *p,*q

p=head

if(p!=NULL)

{ int n=1

while(p->next !=NULL)

{

n++

p=p->next

}//得到链表结点的个数

p=head

if(i==n)//i结点在结尾的时候

{

while(p->next!=NULL)

{

q=p

p=p->next

}

q->next=NULL

delete p

return 1

}

else if(i<n&&i>1)//i结点在中间的时候

{

for(int j=1j<ij++)

{

q=p//q中放i前的结点

p=p->next //p中放第i个结点

}

q->next=p->next

delete p

return 1

}

else if(i==1)//i结点在首位的时候

{

q=p->next

head=q

delete p

return 1

}

else

return 0

}

else

return 0

}

void main()

{

list A

int data[10]={1,2,3,4,5,6,7,8,9,10}

A.Insertlist(0,data[0])

for(int i=1i<10i++)

A.Insertlist(0,data[i])

A.Display()

menu:cout<<"1.遍历链表"<<'\t'<<"2.查找链表"<<'\t'<<"3.插入链表"<<endl

cout<<"4.删除链表"<<'\t'<<"5.链表长度"<<'\t'<<"6.置空链表"<<endl

int m

do

{

cout<<"请输入你想要进行的 *** 作(选择对应 *** 作前面的序号):"<<endl

cin>>m

}while(m<1||m>6)//当输入的序号不在包括中,让他重新输入

switch(m)

{

case 1:

{

A.Display ()

goto menu

}break

case 2:

{

cout<<"请输入你想要找到的结点:"<<endl

int c

cin>>c//输入你想要找到的结点

if(A.Find (c)==1)

{

cout<<"可以找到"<<c<<endl

A.Display ()//重新显示出链表A

}

else

{

cout<<"链表中不存在"<<c<<endl

A.Display ()//重新显示出链表A

}

goto menu

}break

case 3:

{

cout<<"请选择你要插入的方式(选择前面的序号进行选择)"<<endl

cout<<"1.将特定的结点加入到特定的结点前"<<'\t'<<"2.将特定的结点加到特定的位置后"<<endl

int b1

do

{

cout<<"请输入你想要插入的方式(选择前面的序号进行选择):"<<endl

cin>>b1

}while(b1<1||b1>2)//当输入的序号不在包括中,让他重新输入

if(b1==1)

{

cout<<"请输入你想要插入的数和想要插入的结点(为此结点之前插入):"<<endl

int a1,a2

cin>>a1>>a2

A.Insertlist (a1,a2)//将a1插入到结点为a2结点之前

cout<<"此时链表为:"<<endl

A.Display ()//重新显示出链表A

}

else

{

cout<<"请输入你想要插入的数和想要插入的位置(为此结点之后插入):"<<endl

int a1,a2

cin>>a1>>a2

A.Insert (a1,a2)//将a1插入到结点位置为a2的结点之后

cout<<"此时链表为:"<<endl

A.Display ()//重新显示出链表A

}

goto menu

}break

case 4:

{

cout<<"请选择你要删除的方式(选择前面的序号进行选择)"<<endl

cout<<"1.删除特定的结点"<<'\t'<<"2.删除特定位置的结点"<<endl

int b1

do

{

cout<<"请输入你想要插入的方式(选择前面的序号进行选择):"<<endl

cin>>b1

}while(b1<1||b1>2)//当输入的序号不在包括中,让他重新输入

if(b1==1)

{

cout<<"请输入你想要删除的结点:"<<endl

int a

cin>>a//输入你想要删除的结点

if(A.Delete (a)==1)

{

cout<<"成功删除"<<a<<endl

cout<<"删除后的链表为:"<<endl

A.Display ()

}

else

{

cout<<"此链表为:"<<endl

A.Display ()//重新显示出链表A

cout<<"链表中不存在"<<a<<endl

}

}

else

{

cout<<"请输入你想要删除的结点位置:"<<endl

int b

cin>>b//输入你想要删除的结点的位置

if(A.Remove(b)==1)

{

cout<<"成功删除第"<<b<<"个结点"<<endl

cout<<"删除后的链表为:"<<endl

A.Display ()//重新显示出链表A

}

else

{

cout<<"当前链表的结点个数为:"<<A.Length ()<<endl

cout<<"您输入的结点位置越界"<<endl

}

}

goto menu

}break

case 5:

{

cout<<"这个链表的结点数为:"<<A.Length ()<<endl

goto menu

}break

case 6:

{

A.MakeEmpty ()

cout<<"这个链表已经被置空"<<endl

goto menu

}break

}

}

评论(3)|1

sunnyfulin |六级采纳率46%

擅长:C/C++JAVA相关Windows数据结构及算法百度其它产品

按默认排序|按时间排序

其他1条回答

2012-04-23 17:41121446881|六级

我写了一个C语言的,只给你两个结构体和一个初始化函数:

#include "stdio.h"

#include "malloc.h"

struct adjacentnext//邻接表项结构体

{

int element

int quanvalue

struct adjacentnext *next

}

struct adjacenthead//邻接表头结构体

{

char flag

int curvalue

int element

struct adjacenthead *previous

struct adjacentnext *son

}

//初始化图,用邻接表实现

struct adjacenthead *mapinitialnize(int mapsize)

{

struct adjacenthead *ahlists=NULL

struct adjacentnext *newnode=NULL

int i

int x,y,z

ahlists=malloc(sizeof(struct adjacenthead)*mapsize)

if(ahlists==NULL)

return NULL

for(i=0i<mapsizei++)

{

ahlists[i].curvalue=0

ahlists[i].flag=0

ahlists[i].previous=NULL

ahlists[i].son=NULL

ahlists[i].element=i+1

}

scanf("%d%d%d",&x,&y,&z)//输入源结点,目的结点,以及源结点到目的结点的路权值

while(x!=0&&y!=0)//x,y至少有一个零就结束

{

newnode=malloc(sizeof(struct adjacentnext))

newnode->element=y

newnode->quanvalue=z

newnode->next=ahlists[x-1].son

ahlists[x-1].son=newnode

scanf("%d%d%d",&x,&y,&z)

}

return ahlists//返回邻接表头

}

邻接表

还是逆邻接表?如果是逆邻接表,每个顶点出发邻接表的

链表

中的结点个数就是

入度

如果是邻接表过程如下:有一个辅助数组,大小就是顶点数量,所有元素初值都为0从头到尾遍历每个顶点出发的邻接表的结点,只要当前结点的数据是几(也就是第几个结点被有向弧进入了),这个下标的辅助

数组元素

加1,等所有的邻接表的小链表遍历完了,这个辅助数组中各个下标的数字就是该顶点的入度


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/8018733.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存