知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第七章答案
Posted 知
篇首语:成年人的平和,一半是理解,一半是算了。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第七章答案相关的知识,希望对你有一定的参考价值。
第七章 图
Status Build_AdjList(ALGraph &G)//输入有向图的顶点数 边数 顶点信息和边的信息建立邻接表
InitALGraph(G);
scanf( %d &v);
if(v< ) return ERROR; //顶点数不能为负
G vexnum=v;
scanf( %d &a);
if(a< ) return ERROR; //边数不能为负
G arcnum=a;
for(m= ;m
G.vertices[m].data=getchar(); //输入各顶点的符号
for(m=1;m<=a;m++)
t=getchar();h=getchar(); //t为弧尾,h为弧头
if((i=LocateVex(G,t))<0) return ERROR;
if((j=LocateVex(G,h))<0) return ERROR; //顶点未找到
p=(ArcNode*)malloc(sizeof(ArcNode));
if(!G.vertices.[i].firstarc) G.vertices[i].firstarc=p;
else
for(q=G.vertices[i].firstarc;q->nextarc;q=q->nextarc);
q->nextarc=p;
p->adjvex=j;p->nextarc=NULL;
//while
return OK;
//Build_AdjList
7.15
//本题中的图G均为有向无权图,其余情况容易由此写出
Status Insert_Vex(MGraph &G, char v)//在邻接矩阵表示的图G上插入顶点v
if(G.vexnum+1)>MAX_VERTEX_NUM return INFEASIBLE;
G.vexs[++G.vexnum]=v;
return OK;
//Insert_Vex
Status Insert_Arc(MGraph &G,char v,char w)//在邻接矩阵表示的图G上插入边(v,w)
if((i=LocateVex(G,v))<0) return ERROR;
if((j=LocateVex(G,w))<0) return ERROR;
if(i==j) return ERROR;
if(!G.arcs[i][j].adj)
G.arcs[i][j].adj=1;
G.arcnum++;
return OK;
//Insert_Arc
Status Delete_Vex(MGraph &G,char v)//在邻接矩阵表示的图G上删除顶点v
n=G.vexnum;
if((m=LocateVex(G,v))<0) return ERROR;
G.vexs[m]<->G.vexs[n]; //将待删除顶点交换到最后一个顶点
for(i=0;i
G.arcs[i][m]=G.arcs[i][n];
G.arcs[m][i]=G.arcs[n][i]; //将边的关系随之交换
G.arcs[m][m].adj=0;
G.vexnum--;
return OK;
//Delete_Vex
分析:如果不把待删除顶点交换到最后一个顶点的话,算法将会比较复杂,而伴随着大量元素的移动,时间复杂度也会大大增加.
Status Delete_Arc(MGraph &G,char v,char w)//在邻接矩阵表示的图G上删除边(v,w)
if((i=LocateVex(G,v))<0) return ERROR;
if((j=LocateVex(G,w))<0) return ERROR;
if(G.arcs[i][j].adj)
G.arcs[i][j].adj=0;
G.arcnum--;
return OK;
//Delete_Arc
7.16
//为节省篇幅,本题只给出Insert_Arc算法.其余算法请自行写出.
Status Insert_Arc(ALGraph &G,char v,char w)//在邻接表表示的图G上插入边(v,w)
if((i=LocateVex(G,v))<0) return ERROR;
if((j=LocateVex(G,w))<0) return ERROR;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;p->nextarc=NULL;
if(!G.vertices[i].firstarc) G.vertices[i].firstarc=p;
else
for(q=G.vertices[i].firstarc;q->q->nextarc;q=q->nextarc)
if(q->adjvex==j) return ERROR; //边已经存在
q->nextarc=p;
G.arcnum++;
return OK;
//Insert_Arc
7.17
//为节省篇幅,本题只给出较为复杂的Delete_Vex算法.其余算法请自行写出.
Status Delete_Vex(OLGraph &G,char v)//在十字链表表示的图G上删除顶点v
if((m=LocateVex(G,v))<0) return ERROR;
n=G.vexnum;
for(i=0;i
if(G.xlist[i].firstin->tailvex==m) //如果待删除的边是头链上的第一个结点
q=G.xlist[i].firstin;
G.xlist[i].firstin=q->hlink;
free(q);G.arcnum--;
else //否则
for(p=G.xlist[i].firstin;p&&p->hlink->tailvex!=m;p=p->hlink);
if(p)
q=p->hlink;
p->hlink=q->hlink;
free(q);G.arcnum--;
//else
//for
for(i=0;i
if(G.xlist[i].firstout->headvex==m) //如果待删除的边是尾链上的第一个结点
q=G.xlist[i].firstout;
G.xlist[i].firstout=q->tlink;
free(q);G.arcnum--;
else //否则
for(p=G.xlist[i].firstout;p&&p->tlink->headvex!=m;p=p->tlink);
if(p)
q=p->tlink;
p->tlink=q->tlink;
free(q);G.arcnum--;
//else
//for
for(i=m;i
G.xlist[i]=G.xlist[i+1]; //修改表头向量
for(p=G.xlist[i].firstin;p;p=p->hlink)
p->headvex--;
for(p=G.xlist[i].firstout;p;p=p->tlink)
p->tailvex--; //修改各链中的顶点序号
G.vexnum--;
return OK;
//Delete_Vex
7.18
//为节省篇幅,本题只给出Delete_Arc算法.其余算法请自行写出.
Status Delete_Arc(AMLGraph &G,char v,char w)////在邻接多重表表示的图G上删除边(v,w)
if((i=LocateVex(G,v))<0) return ERROR;
if((j=LocateVex(G,w))<0) return ERROR;
if(G.adjmulist[i].firstedge->jvex==j)
G.adjmulist[i].firstedge=G.adjmulist[i].firstedge->ilink;
else
for(p=G.adjmulist[i].firstedge;p&&p->ilink->jvex!=j;p=p->ilink);
if (!p) return ERROR; //未找到
p->ilink=p->ilink->ilink;
//在i链表中删除该边
if(G.adjmulist[j].firstedge->ivex==i)
G.adjmulist[j].firstedge=G.adjmulist[j].firstedge->jlink;
else
for(p=G.adjmulist[j].firstedge;p&&p->jlink->ivex!=i;p=p->jlink);
if (!p) return ERROR; //未找到
q=p->jlink;
p->jlink=q->jlink;
free(q);
//在i链表中删除该边
G.arcnum--;
return OK;
//Delete_Arc
7.19
Status Build_AdjMulist(AMLGraph &G)//输入有向图的顶点数,边数,顶点信息和边的信息建立邻接多重表
InitAMLGraph(G);
scanf("%d",&v);
if(v<0) return ERROR; //顶点数不能为负
G.vexnum=v;
scanf(%d",&a);
if(a<0) return ERROR; //边数不能为负
G.arcnum=a;
for(m=0;m
G.adjmulist[m].data=getchar(); //输入各顶点的符号
for(m=1;m<=a;m++)
t=getchar();h=getchar(); //t为弧尾,h为弧头
if((i=LocateVex(G,t))<0) return ERROR;
if((j=LocateVex(G,h))<0) return ERROR; //顶点未找到
p=(EBox*)malloc(sizeof(EBox));
p->ivex=i;p->jvex=j;
p->ilink=NULL;p->jlink=NULL; //边结点赋初值
if(!G.adjmulist[i].firstedge) G.adjmulist[i].firstedge=p;
else
q=G.adjmulist[i].firstedge;
while(q)
r=q;
if(q->ivex==i) q=q->ilink;
else q=q->jlink;
if(r->ivex==i) r->ilink=p;//注意i值既可能出现在边结点的ivex域中,
else r->jlink=p; //又可能出现在边结点的jvex域中
//else //插入i链表尾部
相关参考
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第八章答案
第八章动态存储管理 typedefstruct char*start; intsize; fmblock;//空闲块类型 char*Malloc_Fdlf(intn)//遵循最后分配
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第九章答案
第九章查找 intSearch_Sq(SSTableSTintkey)//在有序表上顺序查找的算法监视哨设在高下标端 STelem[STlength+]key=key; for(i=
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第六章答案
第六章树和二叉树 intIs_Descendant_C(intuintv)//在孩子存储结构上判断u是否v的子孙是则返回否则返回 if(u==v)return; else if
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第五章答案
第五章数组和广义表 voidRSh(intA[n]intk)//把数组A的元素循环右移k位只用一个辅助存储空间 for(i=;i<=k;i++) if(n%i==&&a
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第三章参考答案
第三章栈与队列 typedefstruct Elemtype*base[]; Elemtype*top[]; BDStacktype;//双向栈类型 StatusInit_Stack
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第四章答案
第四章串 voidString_Reverse(StringtypesStringtype&r)//求s的逆串r StrAssign(r);//初始化r为空串 for(i=S
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第二章参考答案
第二章线性表 StatusDeleteK(SqList&aintiintk)//删除线性表a中第i个元素起的k个元素 if(i<||k<||i+k>aleng
四参考资料 目前国内数据结构教材的版本有PascalCC++Java多但C语言版本的教材是使用最广的教材虽然考试大纲还没有出来但基本上可以确定的教材是清华大学出版社出版严蔚敏等著的《数据结构(C
假设在算法描述语言中引入指针的二元运算异或若a和b为指针则a⊕b的运算结果仍为原指针类型且 a⊕(a⊕b)=(a⊕a)⊕b=b