当前位置:
文档之家› 数据结构C语言课后习题答案(耿国华版)
数据结构C语言课后习题答案(耿国华版)
}
//两个串的比较 int StrCompare(LinkString *S,LinkString *T) { SNode *q,*p; p=S->head->next; q=T->head->next;
//p,q分别指向两个串的开始
while(p&&q) { if(p->ch!=q->ch) return(p->ch - q->ch); //如果当前字符不相等,返回它 们的差 p=p->next; q=q->next; } return(S->len - T->len); 差 } //如果对应位置的字符都相等,返回串的长度
5.4利用一个辅助向量空间的矩阵快速转置法
FastTransposeMatrix( TSMatrix A , TSMatrix *B) {/* 利用一个辅助向量空间的矩阵快速转置法 */ int col, t, p, q, pos[MAXSIZE+1]; B->len=A.len; B->n=A.m; B->m=A.n; if( B->len) { for( t=1; t<=A.n; t++ ) pos[t]=0; for( t=1; t<A.len; t++) pos[ A.data[t].col ]++ ; pos[0]=1; for( t=1; t<A.n; t++) pos[t]=pos[t]+pos[t-1]; for( t=A.n; t>=1; t--) pos[t]=pos[t-1];
第一步:v1到v3的路径v1,v3;长度15;新 S={V1,v3}; v1 dist[ ] path[ ] 0 v2 19
v1,v3,v2
v3 15
v1,v3
v4 ∞
v5 25
v1,v3,v5
v6 ∞
第二步: v1到v2的路径v1,v3,v2;长度19;新 S={V1,v3,v2};
v1
dist[ ] path[ ] 0
v2
19
v1,v3,v2
v3
15
v1,v3
v4
29
v1,v3,v2,v4
v5
25
v1,v3,v5
v6
∞
第三步: v1到v5的路径v1,v3,v5;长度25;新 S={V1,v3,v2,v5};
v1
dist[ ] path[ ] 0
v2
19
v1,v3,v2
v3
15
v1,v3
v4
29
v1,v3,v2,v4
v5
25
v1,v3,v5
v6
45
v1,v3,v5,v6
第四步: v1到v4的路径v1,v3,v2,v4;长度29;新 S={V1,v3,v2,v5,v4};
v1 dist[ ] path[ ] 0 v2 19
6.4
E B F
A
C
D
G
H I K J
6.5(1)右单枝树 (2)左单枝树 (3)单根树或者空树
6.9 设左1右0
0.32
0.19
0.21
0.06
0.10
0.07
0.02
0.03
0.02 11111 0.03 11110 0.06 1110 0.07 1100 0.10 1101 0.19 01 0.21 00 0.32 10
6.24交换左右子树算法 void exchangechild(BiTree t) { BiTNode *p; if(t) { p=t->lchild; t->lchild=t->rchild; t->rchild=p; exchangechild(t->lchild); exchangechild(t->rchild); } } /*注意:不能用中序遍历来交换*/
(3)邻接表
V1 V2 V3 V4 1 2 3 1 4 6 5 6
V5
V6
1
2
5
(4)逆邻接表
略
(6)强连通分量(三个分量)
6
2 3 4 1 5
7.3用Dijkstra算法求顶点1到其余顶点的最 短路径的过程:
初始状态:S={V1}; v1 dist[ ] path[ ] 0 v2 20 v1,v2 v3 15 v1,v3 v4 ∞ v5 ∞ v6 ∞
int IsReverse() 3-->5 判断输入的字符串中'&'前和'&'后部分是否为逆串,是则返回1,否则返回0 { SeqStack s; char e; InitStack(&s); while((e=getchar())!='&') { if(e==’@’) return 0;//不允许在’&’之前出现’@’ push(&s,e); } while( (e=getchar())!='@') { if(IsEmpty(&s)) return 0; pop(&s,&c); if(e!=c) return 0; } if(!IsEmpty(s)) return 0; return 1; }//IsReverse
{if(Qtag==1&&Q-->front==Q-->rear)
return FALSE;//tag域的值为1表示“非空”
Qelement[Qrear]=x;
Qrear=(Q rear+1)%MAXSIZE;
if(Q tag==0) Q tag=1; //队列不空
return TRUE;
作业2.7 顺序表的就地逆置
void reverse(SeqList *L)//顺序表的就地逆置 { for(i=0,j=Llast; i<j; i++,j--) {t=Lelem[i]; Lelem[i]=Lelem[j]; Lelem[j]=t; } }//reverse
void LinkList_reverse(Linklist 作业 2.7链表的就地逆置 *L)
• 带tag域的循环队列类型定义: # define MAXSIZE 50 typedef struct { QueueElementType element[MAXSIZE]; int front, rear,tag; } SeqQueue;
注意:tag域的值为0表示“空”,1表示“非空 "
3-->8带tag域的循环队列入队算法 int EnterQueue(SeqQueue *Q,int x)
/*链表的就地逆置*/ { Node *p, *q;
p=L->next; L->next=NULL; while(p) { q=p; p=p->next; q->next=Lnext; /*把L的元素逐个插入新表表头之后*/ Lnext=q; } }/*LinkList_reverse*/
分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头 部,p为新表表头.
5.1,5.2
5.1(1) 6*8*6=288 (2) 1000+(5*8+7)*6=1282 (3) 1000+(2*8+5)*6=1126 (4) 1000+(5*6+2)*6=1192 5.2(1) k=(i-1)*3-1+(j-i+1)+1=2*(i-1)+j (2) i=k/3+1; j= (k/3+1)+(k%3-1)=k/3+k%3
4.3题参考答案
//串结点定义 typedef struct snode { char ch; struct snode *next; }SNode; //链串定义 typedef struct { SNode *head; SNode *tail; int len; }LinkString;
//将串常量chars赋值给串S int StriAsign(LinkString *S,char *chars) {SNode *new,*p; int i=0; //初始化串S为空链串 new=(SNode *)malloc(sizeof(SNode)); if(!new) return(ERROR); new->next=null; S->head=new; S->tail=p=new; //建立链串S,并将串chars复制到S中 while(chars[i]!='\0') { new=(SNode *)malloc(sizeof(SNode)); new->ch=chars[i]; p->next=new; p=new; i++; } p->next=null; //链表的表尾 S->tail=p; S->len=i; //串长度 return(OK);
作业2.11 A表和B表合并为C表
void merge1(LinkList *A,LinkList *B,LinkList *C)
/*链表A和B合并为C,A和B的元素间隔排列,且用原空间*/
{ Node *p, *q; p=A->next; q=B->next; C=A; while(p&&q) { s=p->next; p->next=q; /*将B的元素插入*/ if (s) { t=q->next; q->next=s; } /*如A非空,将A的元素插入*/ p=s;q=t; }/*while*/ }/*merge1 */
}//EnterQueue