当前位置:文档之家› 第二章线性表答案

第二章线性表答案

第二章线性表答案
第二章线性表答案

2.11 设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

Status OrderListInsert-sq(SqList va, ElemType x) {

//将x插入到递增有序的顺序表va中,插入后va仍然递增有序(算法1)

if (va.length==va.listsize){

newbase=(ElemType

*)realloc(va.elem,(va.listsize+LISTINCREMENT)*sizeof(ElemType));

if (!newbase) exit(OVERFLOW);

va.elem=newbase;

va.listsize+=LISTINCREMENT;

}//当前存储空间已满,增加分配空间

if (!va.length) {va.elem[0]=x; ++va.length; return OK;}

q=&(va.elem[0]);

while (*q<=x)&&(q<=&(va.elem[va.length-1])) ++q; //查找插入位置

for (p=&(va.elem[va.length-1]); p>=q; --p) *(p+1)=*p;

*q=x;

++va.length;

return OK;

}//OrderListInsert-sq

Status OrderListInsert-sq(SqList va, ElemType x) {

//将x插入到递增有序的顺序表va中,插入后va仍然递增有序(算法2)

if (va.length==va.listsize){

newbase=(ElemType

*)realloc(va.elem,(va.listsize+LISTINCREMENT)*sizeof(ElemType));

if (!newbase) exit(OVERFLOW);

va.elem=newbase;

va.listsize+=LISTINCREMENT;

}//当前存储空间已满,增加分配空间

if (!va.length) {va.elem[0]=x; ++va.length; return OK;}

p=&(va.elem[va.length-1]);

while (P>=&(va.elem[0])&&*p>x) {*(p+1)=*p; --p;}

*(p+1)=x;

++va.length;

return OK;

}//OrderListInsert-sq

2.12 设A=(a1,...,a m)和B=(b1,...,b n)均为顺序表,A'和B'分别为A和B中除去最大共同前缀后的子表。若A'=B'=空表,则A=B;若A'=空表,而B'≠空表,或者两者均不为空表,且A'的首元小于B'的首元,则AB。试写一个比较A,B大小的算法。

int Compare-List(SqList a, SqList b){

//a,b为顺序表,若ab时,返回1

i=0;

while (i<=a.length-1) && (i<=b.length-1) && (a.elem[i]=b.elem[i]) ++i;

switch {

case i=a.length && i=b.length : return 0; break;

case (i=a.length && i<=b.length-1)

||(i<=a.length-1 && i<=b.length-1 && a.elem[i]

}

}//Compare-List

2.19

status del-l(LinkList &la, int mink, int maxk){

//la为带头结点的单链表的头指针,单链表中的结点以值递增有序排列

//本算法删除表中所有值大于mink且小于maxk的元素,mink

if (mink>=maxk) return ERROR

p=la;

while (p->next<>NULL && p->next->data<=mink) p=p->next;

q=p;

while (q->next<>NULL && q->next->datanext ;

q=q->next;

p1=p->next;

while (p1<>q) {q1=p1; p1=p1->next; free(q1);}

}//del-l

2.21

LinkList priou(LinkList la, LinkList q1){

//返回指向单链表la中结点的指针p1,p1->next=q1 p1=la;

while (p1->next!=q1) p1=p1->next;

return p1;

}//priou

void Reverse-List-l(LinkList &la) {

//就地逆置单链表la(算法1)

if (!la->next) return;

p=la->next; q=priou(la, NULL);

while (p!=q) {

p->data〈-〉q->data;

if (p=q) return;

q=priou(la, q);

}

}//Reverse-List-l

void Reverse-List-l(LinkList &la) {

//就地逆置单链表la(算法2)

p=priou(la, NULL); last=p;

pre=priou(la,p);

while (pre!=la) {

p=pre;

pre=priou(la,p);

}

p->next=NULL;

la->next=last;

}//Reverse-List-l

void Reverse-List-l(LinkList &la) { //就地逆置单链表la(算法3)if (!la->next) return;

pre=la->next;

if (!pre->next) return;

p=pre->next; pre->next=NULL; next=p->next;

while (p) {

p->next=pre;

pre=p;

p=next;

if (p) next=p->next;

}

la->next=pre;

return;

}//Reverse-List-l

void Reverse-List-l(LinkList &la) { //就地逆置单链表la(算法4)

if (!p || !p->next) return;

pn=p->next; p->next=NULL;

while (pn) {

p=pn; pn=pn->next;

p->next=la->next; la->next=p;

}

return;

}//Reverse-List-l

2.24

void MergeList(LinkList &a, LinkList &b, LinkList &c) {

//已知单链表a和b的元素按值递增有序排列

//归并a和b得到新的单链表c,c的元素按值递减有序

c=a; p=a->next; q=b->next; c->next=NULL;

while (p && q)

if (p->datadata) {

pn=p->next; p->next=c->next;

c->next=p; p=pn;

}

else {

qn=q->next; q->next=c->next;

c->next=q; q=qn;

}

while (p) {pn=p->next; p->next=c->next; c->next=p; p=pn;} while (q) {qn=q->next; q->next=c->next; c->next=q; q=qn;} free(b);

}//MergeList

2.33

void CutApart-LinkList(LinkList &l, LinkList la, LinkList lb, LinkList lc){

//单链表l中的元素含有三类字符:字母、数字和其它字符

//本算法将l分割为la、lb和lc三个循环链表,它们分别只含字母、数字和其它字符la=(LinkList)malloc(sizeof(LNode)); la->next=la;

lb=(LinkList)malloc(sizeof(LNode)); lb->next=lb;

lc=(LinkList)malloc(sizeof(LNode)); lc->next=lc;

pn=l->next;

while (pn){

p=pn; pn=pn->next;

switch {

case ('a'<=p->data && p->data<='z')

||('A'<=p->data && p->data<='Z') : p->next=la->next; la->next=p; break;

case ('0'<=p->data && p->data<='9') : p->next=lb->next; lb->next=p; break;

default : p->next=lc->next; lc->next=p;

}//switch

}//while

free(l);

}//CutApart-LinkList

2.39

typedef struct {

float coef;

int expn;

}*Poly, ElemType;

float Polynomial(Poly &p, int m, float x0){

//多项式p的顺序存储结构中依次存放有c1,e1,c2,e2,...,c m,e m

//x0为给定值,本算法计算p n(x0)的值

x=x0^p[0].expn;

pn=p[0].coef*x;

for (i=1; i<=m; ++i){

x=x*x0^(p[i].expn-p[i-1].expn);

pn=pn+p[i].coef*x;

}

retrun pn;

}//Polynomial

(以下内容来自https://www.doczj.com/doc/042964569.html,)

第二章线性表

2.10

Status DeleteK(SqList &a,int i,int k)//删除线性表a中第i个元素起的k个元素{

if(i<1||k<0||i+k-1>a.length) return INFEASIBLE;

for(count=1;i+count-1<=a.length-k;count++) //注意循环结束的条件

a.elem[i+count-1]=a.elem[i+count+k-1];

a.length-=k;

return OK;

}//DeleteK

2.11

Status Insert_SqList(SqList &va,int x)//把x插入递增有序表va中

{

if(va.length+1>va.listsize) return ERROR;

va.length++;

for(i=va.length-1;va.elem[i]>x&&i>=0;i--)

va.elem[i+1]=va.elem[i];

va.elem[i+1]=x;

return OK;

}//Insert_SqList

2.12

int ListComp(SqList A,SqList B)//比较字符表A和B,并用返回值表示结果,值为正,表示A>B;值为负,表示A

{

for(i=1;A.elem[i]||B.elem[i];i++)

if(A.elem[i]!=B.elem[i]) return A.elem[i]-B.elem[i];

return 0;

}//ListComp

2.13

LNode* Locate(LinkList L,int x)//链表上的元素查找,返回指针

{

for(p=l->next;p&&p->data!=x;p=p->next);

return p;

}//Locate

2.14

int Length(LinkList L)//求链表的长度

{

for(k=0,p=L;p->next;p=p->next,k++);

return k;

}//Length

2.15

void ListConcat(LinkList ha,LinkList hb,LinkList &hc)//把链表hb接在ha后面形成链表hc

{

hc=ha;p=ha;

while(p->next) p=p->next;

p->next=hb;

}//ListConcat

2.16

见书后答案.

2.17

Status Insert(LinkList &L,int i,int b)//在无头结点链表L的第i个元素之前插入元素b

{

p=L;q=(LinkList*)malloc(sizeof(LNode));

q.data=b;

if(i==1)

{

q.next=p;L=q; //插入在链表头部

}

else

{

while(--i>1) p=p->next;

q->next=p->next;p->next=q; //插入在第i个元素的位置

}

}//Insert

2.18

Status Delete(LinkList &L,int i)//在无头结点链表L中删除第i个元素

{

if(i==1) L=L->next; //删除第一个元素

else

{

p=L;

while(--i>1) p=p->next;

p->next=p->next->next; //删除第i个元素

}

}//Delete

2.19

Status Delete_Between(Linklist &L,int mink,int maxk)//删除元素递增排列的链表L中值大于mink且小于maxk的所有元素

{

p=L;

while(p->next->data<=mink) p=p->next; //p是最后一个不大于mink的元素

if(p->next) //如果还有比mink更大的元素

{

q=p->next;

while(q->datanext; //q是第一个不小于maxk的元素

p->next=q;

}

}//Delete_Between

2.20

Status Delete_Equal(Linklist &L)//删除元素递增排列的链表L中所有值相同的元素

{

p=L->next;q=p->next; //p,q指向相邻两元素

while(p->next)

{

if(p->data!=q->data)

{

p=p->next;q=p->next; //当相邻两元素不相等时,p,q都向后推一步

}

else

{

while(q->data==p->data) q=q->next;

p->next=q;p=q;q=p->next; //当相邻元素相等时删除多余元素

}

}//while

}//Delete_Equal

2.21

void reverse(SqList &A)//顺序表的就地逆置

{

for(i=1,j=A.length;i

A.elem[i]<->A.elem[j];

}//reverse

2.22

void LinkList_reverse(Linklist &L)//链表的就地逆置;为简化算法,假设表长大于2 {

p=L->next;q=p->next;s=q->next;p->next=NULL;

while(s->next)

{

q->next=p;p=q;

q=s;s=s->next; //把L的元素逐个插入新表表头

}

q->next=p;s->next=q;A->next=s;

}//LinkList_reverse

分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头.

2.23

void merge1(LinkList &A,LinkList &B,LinkList &C)//把链表A和B合并为C,A和B的元素间隔排列,且使用原存储空间

{

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

2.24

void reverse_merge(LinkList &A,LinkList &B,LinkList &C)//把元素递增排列的链表A和B合并为C,且C中元素递减排列,使用原空间

{

pa=A->next;pb=B->next;pre=NULL; //pa和pb分别指向A,B的当前元素

while(pa&&pb)

{

if(pa->datadata)

{

pc=pa;q=pa->next;pa->next=pre;pa=q; //将A的元素插入新表

}

else

{

pc=pb;q=pb->next;pb->next=pre;pb=q; //将B的元素插入新表

}

pre=pc;

}

while(pa)

{

q=pa->next;pa->next=pc;pc=pa;pa=q; //插入A中余下的元素

}

while(pb)

{

q=pb->next;pb->next=pc;pc=pb;pb=q; //插入B中余下的元素

}

C=A;A->next=pc; //构造新表头

}//reverse_merge

分析:本算法的思想是,按从小到大的顺序依次把A和B的元素插入新表的头部pc处,最后处理A或B的剩余元素.

2.25

void SqList_Intersect(SqList A,SqList B,SqList &C)//求元素递增排列的线性表A 和B的元素的交集并存入C中

{

i=1;j=1;k=0;

while(A.elem[i]&&B.elem[j])

{

if(A.elem[i]

if(A.elem[i]>B.elem[j]) j++;

if(A.elem[i]==B.elem[j])

{

C.elem[++k]=A.elem[i]; //当发现了一个在A,B中都存在的元素,

i++;j++; //就添加到C中

}

}//while

}//SqList_Intersect

2.26

void LinkList_Intersect(LinkList A,LinkList B,LinkList &C)//在链表结构上重做上题

{

p=A->next;q=B->next;

pc=(LNode*)malloc(sizeof(LNode));

while(p&&q)

{

if(p->datadata) p=p->next;

else if(p->data>q->data) q=q->next;

else

{

s=(LNode*)malloc(sizeof(LNode));

s->data=p->data;

pc->next=s;pc=s;

p=p->next;q=q->next;

}

}//while

C=pc;

}//LinkList_Intersect

2.27

void SqList_Intersect_True(SqList &A,SqList B)//求元素递增排列的线性表A和B的元素的交集并存回A中

{

i=1;j=1;k=0;

while(A.elem[i]&&B.elem[j])

{

if(A.elem[i]

else if(A.elem[i]!=A.elem[k])

{

A.elem[++k]=A.elem[i]; //当发现了一个在A,B中都存在的元素

i++;j++; //且C中没有,就添加到C中

}

}//while

while(A.elem[k]) A.elem[k++]=0;

}//SqList_Intersect_True

2.28

void LinkList_Intersect_True(LinkList &A,LinkList B)//在链表结构上重做上题{

p=A->next;q=B->next;pc=A;

while(p&&q)

{

if(p->datadata) p=p->next;

else if(p->data>q->data) q=q->next;

else if(p->data!=pc->data)

{

pc=pc->next;

pc->data=p->data;

p=p->next;q=q->next;

}

}//while

}//LinkList_Intersect_True

2.29

void SqList_Intersect_delete(SqList &A,SqList B,SqList C)//从有序顺序表A中删除那些在B和C中都出现的元素

{

i=1;j=1;k=1;

while(B.elem[i]&&C.elem[j])

{

if(B.elem[i]

else //找到了需要从A中删除的元素

{

u=B.elem[i];

while(A.elem[k]

for(;A.elem[k]==u;k++)

A.elem[k]=INFINITY; //把A中待删除元素置换为特殊记号

while(B.elem[i]==u) i++;

while(C.elem[j]==u) j++;

}//else

}//while

for(i=1,j=1;j<=A.length;i++) //第二遍扫描A,删除特殊记号

{

while(A.elem[j]==INFINITY)

{

j++;A.length--;

}

if(i

j++;

}//for

}//SqList_Intersect_delete

分析:本算法的时间复杂度为O(m),m为表长.思考:你自己的算法时间复杂度是多少?实际上也可以只用一遍扫描就完成整个操作,且时间复杂度也为O(m),但非常复杂,你能写出来吗?

2.30

void LinkList_Intersect_delete(LinkList &A,LinkList B,LinkList C)//在链表结构上重做上题

{

p=B->next;q=C->next;r=A-next;

while(p&&q&&r)

{

if(p->datadata) p=p->next;

else if(p->data>q->data) q=q->next;

else

{

u=p->data; //确定待删除元素u

while(r->next->datanext; //确定最后一个小于u的元素指针r if(r->next->data==u)

{

s=r->next;

while(s->data==u)

{

t=s;s=s->next;free(t); //确定第一个大于u的元素指针s

}//while

r->next=s; //删除r和s之间的元素

}//if

while(p->data=u) p=p->next;

while(q->data=u) q=q->next;

}//else

}//while

}//LinkList_Intersect_delete

2.31

Status Delete_Pre(CiLNode *s)//删除单循环链表中结点s的直接前驱{

p=s;

while(p->next->next!=s) p=p->next; //找到s的前驱的前驱p

p->next=s;

return OK;

}//Delete_pre

2.32

Status DuLNode_pre(DuLinkList &L)//完成双向循环链表结点的pre域{

for(p=L;!p->next->pre;p=p->next) p->next->pre=p;

return OK;

}//DuLNode_pre

2.33

Status LinkList_divide(LinkList &L,CiList &A,CiList &B,CiList &C)//把单链表L 的元素按类型分为三个循环链表.CiList为带头结点的单循环链表类型.

{

s=L->next;

A=(CiList*)malloc(sizeof(CiLNode));p=A;

B=(CiList*)malloc(sizeof(CiLNode));q=B;

C=(CiList*)malloc(sizeof(CiLNode));r=C; //建立头结点

while(s)

{

if(isalphabet(s->data))

{

p->next=s;p=s;

}

else if(isdigit(s->data))

{

q->next=s;q=s;

}

else

{

r->next=s;r=s;

}

}//while

p->next=A;q->next=B;r->next=C; //完成循环链表

}//LinkList_divide

2.34

void Print_XorLinkedList(XorLinkedList L)//从左向右输出异或链表的元素值{

p=L.left;pre=NULL;

while(p)

{

printf("%d",p->data);

q=XorP(p->LRPtr,pre);

pre=p;p=q; //任何一个结点的LRPtr域值与其左结点指针进行异或运算即得到

其右结点指针

}

}//Print_XorLinkedList

2.35

Status Insert_XorLinkedList(XorLinkedList &L,int x,int i)//在异或链表L的第i个元素前插入元素x

{

p=L.left;pre=NULL;

r=(XorNode*)malloc(sizeof(XorNode));

r->data=x;

if(i==1) //当插入点在最左边的情况

{

p->LRPtr=XorP(p.LRPtr,r);

r->LRPtr=p;

L.left=r;

return OK;

}

j=1;q=p->LRPtr; //当插入点在中间的情况

while(++j

{

q=XorP(p->LRPtr,pre);

pre=p;p=q;

}//while //在p,q两结点之间插入

if(!q) return INFEASIBLE; //i不可以超过表长

p->LRPtr=XorP(XorP(p->LRPtr,q),r);

q->LRPtr=XorP(XorP(q->LRPtr,p),r);

r->LRPtr=XorP(p,q); //修改指针

return OK;

}//Insert_XorLinkedList

2.36

Status Delete_XorLinkedList(XorlinkedList &L,int i)//删除异或链表L的第i个元素

{

p=L.left;pre=NULL;

if(i==1) //删除最左结点的情况

{

q=p->LRPtr;

q->LRPtr=XorP(q->LRPtr,p);

L.left=q;free(p);

return OK;

}

j=1;q=p->LRPtr;

while(++j

{

q=XorP(p->LRPtr,pre);

pre=p;p=q;

}//while //找到待删结点q

if(!q) return INFEASIBLE; //i不可以超过表长

if(L.right==q) //q为最右结点的情况

{

p->LRPtr=XorP(p->LRPtr,q);

L.right=p;free(q);

return OK;

}

r=XorP(q->LRPtr,p); //q为中间结点的情况,此时p,r分别为其左右结点

p->LRPtr=XorP(XorP(p->LRPtr,q),r);

r->LRPtr=XorP(XorP(r->LRPtr,q),p); //修改指针

free(q);

return OK;

}//Delete_XorLinkedList

2.37

void reform(DuLinkedList &L)//按1,3,5,...4,2的顺序重排双向循环链表L中的所有结点

{

p=L.next;

while(p->next!=L&&p->next->next!=L)

{

p->next=p->next->next;

p=p->next;

} //此时p指向最后一个奇数结点

if(p->next==L) p->next=L->pre->pre;

else p->next=l->pre;

p=p->next; //此时p指向最后一个偶数结点

while(p->pre->pre!=L)

{

p->next=p->pre->pre;

p=p->next;

}

p->next=L; //按题目要求调整了next链的结构,此时pre链仍为原状

for(p=L;p->next!=L;p=p->next) p->next->pre=p;

L->pre=p; //调整pre链的结构,同2.32方法

}//reform

分析:next链和pre链的调整只能分开进行.如同时进行调整的话,必须使用堆栈保存偶数结点的指针,否则将会破坏链表结构,造成结点丢失.

2.38

DuLNode* LOCATE(DuLinkedList &L,int x)//带freq域的双向循环链表上的查找{

p=L.next;

while(p.data!=x&&p!=L) p=p->next;

if(p==L) return NULL; //没找到

p->freq++;q=p->pre;

while(q->freq<=p->freq) q=q->pre; //查找插入位置

if(q!=p->pre)

{

p->pre->next=p->next;p->next->pre=p->pre;

q->next->pre=p;p->next=q->next;

q->next=p;p->pre=q; //调整位置

}

第二章线性表答案

2.11 设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。 Status OrderListInsert-sq(SqList va, ElemType x) { //将x插入到递增有序的顺序表va中,插入后va仍然递增有序(算法1) if (va.length==va.listsize){ newbase=(ElemType *)realloc(va.elem,(va.listsize+LISTINCREMENT)*sizeof(ElemType)); if (!newbase) exit(OVERFLOW); va.elem=newbase; va.listsize+=LISTINCREMENT; }//当前存储空间已满,增加分配空间 if (!va.length) {va.elem[0]=x; ++va.length; return OK;} q=&(va.elem[0]); while (*q<=x)&&(q<=&(va.elem[va.length-1])) ++q; //查找插入位置 for (p=&(va.elem[va.length-1]); p>=q; --p) *(p+1)=*p; *q=x; ++va.length; return OK; }//OrderListInsert-sq Status OrderListInsert-sq(SqList va, ElemType x) { //将x插入到递增有序的顺序表va中,插入后va仍然递增有序(算法2) if (va.length==va.listsize){ newbase=(ElemType *)realloc(va.elem,(va.listsize+LISTINCREMENT)*sizeof(ElemType)); if (!newbase) exit(OVERFLOW); va.elem=newbase; va.listsize+=LISTINCREMENT; }//当前存储空间已满,增加分配空间 if (!va.length) {va.elem[0]=x; ++va.length; return OK;} p=&(va.elem[va.length-1]); while (P>=&(va.elem[0])&&*p>x) {*(p+1)=*p; --p;} *(p+1)=x; ++va.length;

第二章 考研试题精选

第二章线性表作业 一、选择题 1.下述哪一条是顺序存储结构的优点?() A.存储密度大B.插入运算方便 C.删除运算方便D.可方便地用于各种逻辑结构的存储表示 2.下面关于线性表的叙述中,错误的是哪一个?() A.线性表采用顺序存储,必须占用一片连续的存储单元。 B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。 3.线性表是具有n个()的有限序列(n>0)。 A.表元素B.字符C.数据元素D.数据项 4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。 A.顺序表B.双链表C.带头结点的双循环链表D.单循环链表 5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。 A.单链表B.仅有头指针的单循环链表C.双链表D.仅有尾指针的单循环链表 6.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( )最节省时间。 A. 单链表 B.单循环链表 C. 带尾指针的单循环链表 D.带头结点的双循环链表 7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用()存储方式最节省运算时间。 A.单链表B.双链表C.单循环链表D.带头结点的双循环链表 8. 静态链表中指针表示的是(). A.内存地址B.数组下标C.下一元素地址D.左、右孩子地址 9. 链表不具有的特点是() A.插入、删除不需要移动元素B.可随机访问任一元素 C.不必事先估计存储空间D.所需空间与线性长度成正比 10. 下面的叙述不正确的是()

线性代数第二章答案

第二章 矩阵及其运算 1 已知线性变换 ?????++=++=++=3 213321232113235322y y y x y y y x y y y x 求从变量x 1 x 2 x 3到变量y 1 y 2 y 3的线性变换 解 由已知 ? ??? ?????? ? ?=???? ??221321323513122y y y x x x 故 ???? ?????? ? ?=???? ??-3211 221323513122x x x y y y ? ??? ?????? ??----=321423736 947y y y ?????-+=-+=+--=3 21332123 211423736947x x x y x x x y x x x y 2 已知两个线性变换 ?????++=++-=+=321332123 11542322y y y x y y y x y y x ?????+-=+=+-=3 233122 11323z z y z z y z z y 求从z 1 z 2 z 3到x 1 x 2 x 3的线性变换 解 由已知 ???? ?????? ? ?-=???? ??221321514232102y y y x x x ??? ? ?????? ??--???? ??-=32131 010 2013514232102z z z ??? ? ?????? ??----=321161109412316z z z

所以有?????+--=+-=++-=3 21332123 2111610941236z z z x z z z x z z z x 3 设???? ??--=111111111A ??? ? ??--=150421321B 求3AB 2A 及A T B 解 ??? ? ??---???? ??--???? ??--=-1111111112150421321111111111323A AB ???? ??----=???? ??---???? ??-=2294201722213211111111120926508503 ??? ? ??-=???? ??--???? ??--=092650850150421321111111111B A T 4 计算下列乘积 (1)??? ? ?????? ??-127075321134 解 ???? ?????? ??-127075321134???? ???+?+??+?-+??+?+?=102775132)2(71112374??? ? ??=49635 (2)???? ??123)321( 解 ??? ? ??123)321((132231)(10)

第2章线性表习题解析(答)

第二章线性表练习题 一、选择题 1.线性表是具有n个的有限序列。 A、表元素 B、字符 C、数据元素 D、数据项 E、信息项 2.线性表的静态链表存储结构与顺序存储结构相比优点是。 A、所有的操作算法实现简单 B、便于随机存储 C、便于插入和删除 D、便于利用零散的存储器空间 3.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素算法的时间复杂度为。 A、O(log2n) B、O(1) C、O(n) D、O(n2) 4.(1)静态链表既有顺序存储的特点,又有动态链表的优点。所以,它存取表中第i个元素的时间与i无关; (2)静态链表中能容纳元素个数的最大数在定义时就确定了,以后不能增加;(3)静态链表与动态链表在元素的插入、删除上类似,不需做元素的移动。 以上错误的是。 A、(1)、(2) B、(1) C、(1)、(2)、(3) D、(2) 6.在双向链表存储结构中,删除p所指的结点时须修改指针。 A、p->next->prior=p->prior; p->prior->next=p->next; B、p->next=p->next->next;p->next->prior=p; C、p->prior->next=p;p->prior=p->prior->prior; D、p->prior=p->next->next;p->next=p->prior->prior;

7.在双向循环链表中,在P指针所指的结点后插入q所指向的新结点,其修改指针的操作是。 A、p->next=q; q->prior=p;p->next->prior=q;q->next=q; B、p->next=q;p->next->prior=q;q->prior=p;q->next=p->next; C、q->prior=p; q->next=p->next; p->next->prior=q; p->next=q; D、q->next=p->next;q->prior=p;p->next=q;p->next=q; 8.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是。 A、 n b、2n-1 c、2n d、n-1 9.在一个长度为n的顺序表中,在第i个元素(1≤i≤n+1)之前插入一个新元素时须向后移动个元素。 A、n-i B、n-i+1 C、n-i-1 D、i 10.线性表L=(a1,a2,……an),下列说法正确的是。 A、每个元素有有一个直接前驱和一个直接后继 B、线性表中至少有一个元素 C、表中诸元素的排列必须是由小到大或由大到小。 D、除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继。 11.对单链表表示法,以下说法错误的是。 A、数据域用于存储线性表的一个数据元素 B、指针域(或链域)用于存放一指向本结点所含数据元素的直接后继所在结点的指针 C、所有数据通过指针的链接而组织成单链表 D、NULL称为空指针,它不指向任何结点只起标志作用

数据结构第二章线性表测试题

第二章线性表 1、描述一下三个概念的区别:头指针,头结点,首元结点。并给予图示。 2、对于有头结点的单链表,分别写出定位成功时,实现下列定位语句序列。(1)定位到第i 个结点a i ; (2)定位到第i 个结点的前驱a i-1; (3)定位到尾结点; (4)定位到尾结点的前驱。 3、已知L 是有表头结点的单链表,且P 结点既不是首元结点,也不是尾结点,试写出实现下列功能的语句序列。 (1)在P 结点后插入S 结点;(2)在P 结点前插入S 结点;(3)在表首插入S 结点;(4)在表尾插入S 结点 . p=head; p=head; j=0; while ( p && jnext; j++;} p=head; j=0; while ( p && jnext; j++;} p=head; while ( p ->next ) p=p->next; while ( p->next->next ) p=p->next; (1)s->next=p->next; p->next=s; (2)q =L ; whil e ( q ->next !=p ) q =q ->next;s->next=p 或 q ->next ; q ->next=s; (3 ) s->next=L ->next; L ->next=s; (4)q =L ; whil e ( q ->next !=NULL) q =q ->next;s->next= q ->next ; q ->next=s;

4、设计算法:在顺序表中删除值为e 的元素,删除成功,返回1;否则,返回0。 5、设计一个算法,将一个带头节点的数据域依次为a 1,a 2,…,a n (n ≥3)的单链表的所有节点逆置,即第一个节点的数据域变为a n ,…,最后一个节点的数据域为a 1。(注意:先用自然语言描述算法基本思想,然后用类C++语言描述) int Sqlist::DeleteElem( T e ) { for (i=1; i<=len g t h ; i ++) // 按值顺序查找 * i 可从0开始 if (elem[i-1]= =e) // 找到,进行删除操作 { for ( j=i; jnext; 4 LinkList* pri = NULL; //之前的节点 5 while(p){ 6 LinkList* q = new LinkList; 7 q->data = p->data; //把当前节点记录下来 8 q->next = pri; 9 pri = q; 10 head->next = q; 11 LinkList* t = p; //当前节点没用了删除掉 12 p=p->next; 13 delete(t); 14 } 15 }

数据结构第2章作业 线性表(答案)

第2章线性表 班级学号__________-姓名 一、判断正误 (×)1. 链表的每个结点中都恰好包含一个指针。 链表中的结点可含多个指针域,分别存放多个指针。例如,双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继结点的指针。 (×)2. 链表的物理存储结构具有同链表一样的顺序。 链表的存储结构特点是无序,而链表的示意图有序。 (×)3. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。 链表的结点不会移动,只是指针内容改变。 (×)4. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 混淆了逻辑结构与物理结构,链表也是线性表!且即使是顺序表,也能存放记录型数据。 (×)5. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 正好说反了。顺序表才适合随机存取,链表恰恰适于“顺藤摸瓜” (×)6. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。 前一半正确,但后一半说法错误,那是链式存储的优点。顺序存储方式插入、删除运算效率较低,在表长为n的顺序表中,插入和删除一个数据元素,平均需移动表长一半个数的数据元素。 (×)7. 线性表在物理存储空间中也一定是连续的。 线性表有两种存储方式,顺序存储和链式存储。后者不要求连续存放。 (×)8. 线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。 线性表有两种存储方式,在顺序存储时,逻辑上相邻的元素在存储的物理位置次序上也相邻。 (×)9. 顺序存储方式只能用于存储线性结构。 顺序存储方式不仅能用于存储线性结构,还可以用来存放非线性结构,例如 完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式。(后一节介绍) (×)10. 线性表的逻辑顺序与存储顺序总是一致的。 理由同7。链式存储就无需一致。 二、单项选择题 (C )1.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为:(A)存储结构(B)逻辑结构(C)顺序存储结构(D)链式存储结构( B )2. 一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是(A)110 (B)108 (C)100 (D)120 ( A )3. 在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是: (A)访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) (B)在第i个结点后插入一个新结点(1≤i≤n) (C)删除第i个结点(1≤i≤n) (D)将n个结点从小到大排序 ( B )4. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动个元素(A)8 (B)63.5 (C)63 (D)7 ( A )5. 链式存储的存储结构所占存储空间:

线性代数第二章矩阵试题及答案

第二章矩阵 一、知识点复习 1、矩阵的定义 由m n个数排列成的一个m行n列的表格,两边界以圆括号或方括号,就成为一个m n型矩阵。例如 2 -1 0 1 1 1 1 1 0 2 2 5 4 -2 9 3 3 3 -1 8 是一个45矩阵. 一个矩阵中的数称为它的元素,位于第i行第j列的数称为(i,j)位元素。 元素全为0的矩阵称为零矩阵,通常就记作0。 两个矩阵A和B相等(记作A=B),是指它的行数相等,列数也相等(即它们的类型相同),并且对应的元素都相等。 2、 n阶矩阵与几个特殊矩阵 行数和列数相等的矩阵称为方阵,行列数都为n的矩阵也常常叫做n阶矩阵。 n阶矩阵的从左上角到右下角的对角线称为主对角线。 下面列出几类常用的n阶矩阵,它们都是考试大纲中要求掌握的. 对角矩阵: 对角线外的的元素都为0的n阶矩阵. 单位矩阵: 对角线上的的元素都为1的对角矩阵,记作E(或I). 数量矩阵: 对角线上的的元素都等于一个常数c的对角矩阵,它就是c E. 上三角矩阵: 对角线下的的元素都为0的n阶矩阵. 下三角矩阵: 对角线上的的元素都为0的n阶矩阵. 对称矩阵: 满足A T=A矩阵,也就是对任何i,j,(i,j)位的元素和(j,i)位的元素总是相等的n阶矩阵. 反对称矩阵:满足A T=-A矩阵.也就是对任何i,j,(i,j)位的元素和(j ,i)位的元素之和总等于0的n阶矩阵.反对称矩阵对角线上的元素一定都是0.) 正交矩阵:若AA T=A T A=E,则称矩阵A是正交矩阵。 (1)A是正交矩阵?A T=A-1 (2)A是正交矩阵?2 A=1 阶梯形矩阵:一个矩阵称为阶梯形矩阵,如果满足: ①如果它有零行,则都出现在下面。 ②如果它有非零行,则每个非零行的第一个非0元素所在的列号自上而下严 格单调递增。 把阶梯形矩阵的每个非零行的第一个非0元素所在的位置称为台角。 每个矩阵都可以用初等行变换化为阶梯形矩阵,这种运算是在线性代数的各类 计算题中频繁运用的基本运算,必须十分熟练。 请注意:一个矩阵用初等行变换化得的阶梯形矩阵并不是唯一的,但是其非零 行数和台角位置是确定的。 3、矩阵的线形运算 (1)加(减)法:两个m n的矩阵A和B可以相加(减),得到的和(差)仍是m n 矩阵,记作A+B (A-B),运算法则为对应元素相加(减). (2)数乘: 一个m n的矩阵A与一个数c可以相乘,乘积仍为m n的矩阵, 记作c A,运算法则为A的每个元素乘c. 这两种运算统称为线性运算,它们满足以下规律: ①加法交换律:A+B=B+A. 2加法结合律:(A+B)+C=A+(B+C). ③加乘分配律:c(A+B)=c A+c B.(c+d)A=c A+d A. ④数乘结合律: c(d)A=(cd)A. ⑤ c A=0 c=0 或A=0. 4、矩阵乘法的定义和性质 (1)当矩阵A的列数和B的行数相等时,则A和B可以相乘,乘积记作AB. AB的行数和A相等,列数和B相等. AB的(i,j)位元素等于A的第i个行向量 和B的第j个列向量(维数相同)对应分量乘积之和.

DS第二章-课后习题答案

第二章线性表 2.1 填空题 (1)一半插入或删除的位置 (2)静态动态 (3)一定不一定 (4)头指针头结点的next 前一个元素的next 2.2 选择题 (1)A (2) DA GKHDA EL IAF IFA(IDA) (3)D (4)D (5) D 2.3 头指针:在带头结点的链表中,头指针存储头结点的地址;在不带头结点的链表中,头指针存放第一个元素结点的地址; 头结点:为了操作方便,在第一个元素结点前申请一个结点,其指针域存放第一个元素结点的地址,数据域可以什么都不放; 首元素结点:第一个元素的结点。 2.4已知顺序表L递增有序,写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。 void InserList(SeqList *L,ElemType x) { int i=L->last; if(L->last>=MAXSIZE-1) return FALSE; //顺序表已满 while(i>=0 && L->elem[i]>x) { L->elem[i+1]=L->elem[i]; i--; } L->elem[i+1]=x; L->last++; } 2.5 删除顺序表中从i开始的k个元素 int DelList(SeqList *L,int i,int k) { int j,l; if(i<=0||i>L->last) {printf("The Initial Position is Error!"); return 0;} if(k<=0) return 1; /*No Need to Delete*/ if(i+k-2>=L->last) L->last=L->last-k; /*modify the length*/

第二章线性表测试题

第二章测试试题 班级:学号:姓名:成绩: 一、选择题(每小题5分) 1.线性表是( A )。 A一个有限序列,可以为空;B一个有限序列,不能为空; C一个无限序列,可以为空;D一个无序序列,不能为空。 2.用链表表示线性表的优点是(C)。 A便于随机存取 B花费的存储空间较顺序存储少 C便于插入和删除 D数据元素的物理顺序与逻辑顺序相同 3.某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( D )存储方式最节省运算时间。 A单链表 B双链表 C单循环链表 D带头结点的双循环链表 4.带头结点的单链表head为空的判定条件是(B )。 A.head==NULL; B.head->next==NULL; C.head->next==head; D.head!=NULL; 5.在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入s结点,则执行(C )。 A.s->next=p->next;p->next=s; B.p->next=s->next;s->next=p; C.q->next=s;s->next=p; D.p->next=s; s->next=q; 二、填空题(每小题5分) 1.给定有n个结点的向量,建立一个单链表的时间复杂度_______。建立一个有序单链表的时间复杂度_______。 2.从一个具有n个结点的单链表中查找其值等于x结点时,在查找成功的情况下,需平均比较_____个结点。 3.在一个长度为n的线性表(采用顺序存储结构)中删除第i个元素(1≤i≤n)时,需向前移动____个元素。 4.当对一个线性表经常进行存取操作,而很少进行插入和删除操作时,则采用_____存储结构为宜。相反,当经常进行的是插入和删除操作时,则采用_______存储结构为宜。5.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。插入一个元素时平均要移动表中的个元素。 三、算法设计题(每小题25分) 1.设有一个用向量表示的线性表L,要求写出一个将该表逆置的过程,允许在原表的存储空间外再增加一个附加的工作单元。 2.已知两个整数集合A和B,它们的元素分别依元素值递增有序存放在两个单链表HA 和HB中,编写一个函数求出这两个集合的并集C,并要求集合C的链表的结点仍依元素值递增有序存放。(注意:并集不是归并)

第二章线性表答案

第2章线性表 一选择题 1.下述哪一条是顺序存储结构的优点?( A ) A.存储密度大 B.插入运算方便 C.删除运算方 便 D.可方便地用于各种逻辑结构的存储表示 2.下面关于线性表的叙述中,错误的是哪一个?( B )A.线性表采用顺序存储,必须占用一片连续的存储单元。B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。D.线性表采用链接存储,便于插入和删除操作。 3.线性表是具有n个( C )的有限序列(n>0)。 A.表元素 B.字符 C.数据元 素 D.数据项 E.信息项 4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用( A )存储方式最节省时间。 AHA12GAGGAGAGGAFFFFAFAF

A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表 5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( D )存储方式最节省运算时间。 A.单链表 B.仅有头指针的单循环链 表 C.双链表D.仅有尾指针的单循环链表 6.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( D )最节省时间。 A. 单链表 B.单循环链表 C. 带尾指针的单循环链表 D.带头结点的双循环链表 7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用( D )存储方式最节省运算时间。 AHA12GAGGAGAGGAFFFFAFAF

A.单链表 B.双链表 C.单循环链 表 D.带头结点的双循环链表 8. 静态链表中指针表示的是( BC ). A.内存地址 B.数组下标 C.下一元素地址D.左、右孩子地址 9. 链表不具有的特点是( C ) A.插入、删除不需要移动元素 B.可随机访问任一元素C.不必事先估计存储空间 D.所需空间与线性长度成正比 10. 下面的叙述不正确的是( BC ) A.线性表在链式存储时,查找第i个元素的时间同i的值成正比 AHA12GAGGAGAGGAFFFFAFAF

线性代数课后习题答案(陈维新)

第一章 行列式 习题1.1 1. 证明:(1)首先证明)3(Q 是数域。 因为)3(Q Q ?,所以)3(Q 中至少含有两个复数。 任给两个复数)3(3,32211Q b a b a ∈++,我们有 3 )()3()3)(3(3)()()3()3(3)()()3()3(2121212122112121221121212211b a a b b b a a b a b a b b a a b a b a b b a a b a b a +++=++-+-=+-++++=+++。 因为Q 是数域,所以有理数的和、差、积仍然为有理数,所以 ) 3(3)()3()3)(3()3(3)()()3()3()3(3)()()3()3(2121212122112121221121212211Q b a a b b b a a b a b a Q b b a a b a b a Q b b a a b a b a ∈+++=++∈-+-=+-+∈+++=+++。 如果0322≠+b a ,则必有22,b a 不同时为零,从而0322≠-b a 。 又因为有理数的和、差、积、商仍为有理数,所以 )3(33) (3)3() 3)(3()3)(3(3 32 2 22212122222121222222112211Q b a b a a b b a b b a a b a b a b a b a b a b a ∈--+--= -+-+= ++。 综上所述,我们有)3(Q 是数域。 (2)类似可证明)(p Q 是数域,这儿p 是一个素数。 (3)下面证明:若q p ,为互异素数,则)()(q Q p Q ?。 (反证法)如果)()(q Q p Q ?,则q b a p Q b a +=? ∈?,,从而有 q ab qb a p p 2)()(222++==。 由于上式左端是有理数,而q 是无理数,所以必有02=q ab 。 所以有0=a 或0=b 。 如果0=a ,则2 qb p =,这与q p ,是互异素数矛盾。 如果0=b ,则有 a p =,从而有“有理数=无理数”成立,此为矛盾。 所以假设不成立,从而有)()(q Q p Q ?。

第2章线性表(课堂作业)

第2章线性表 1.下面关于线性表的叙述中,错误的是哪一个?()A.线性表采用顺序存储,必须占用一片连续的存储单元。 B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。 2.线性表是具有n个()的有限序列(n>0)。 A.表元素 B.字符 C.数据元素 D.数据项 E.信息项 3.线性表( a1,a2,…,an)以链接方式存储时,访问第i位置 元素的时间复杂性为() A.O(i) B.O(1) C.O(n) D.O(i-1) 4.若长度为n的线性表采用顺序存储结构,在其第i个位置插 入一个新元素的算法的时间复杂度为()(1<=i<=n+1)。 A. O(0) B. O(1) C. O(n) D. O(n2) 5. 对于顺序存储的线性表,访问结点和增加、删除结点的时间 复杂度为()。 A.O(n) O(n) B. O(n) O(1) C. O(1) O(n) D. O(1) O(1) 6.对于一个头指针为head的带头结点的单链表,判定该表为空 表的条件是()

A.head==NULL B.head→next==NULL C.head→next==head D.head!=NULL 7.链表不具有的特点是() A.可随机访问任一元素 B.插入、删除不需要移动元素 C.不必事先估计存储空间 D.所需空间与线性长度成正比 8.在双向链表指针p的结点前插入一个指针q的结点操作是()。 >Llink=q;q->Rlink=p;p->Llink->Rlink=q;q->Llink=q; >Llink=q;p->Llink->Rlink=q;q->Rlink=p;q->Llink=p->Llink ; C. q->Llink=p->Llink;q->Rlink=q;p->Llink=q;p->Llink=q; >Rlink=p;q->Llink=p->Llink;p->Llink->Rlink=q;p->Llink=q ; 9.在单链表指针为p的结点之后插入指针为s的结点,正确的 操作是:()。 A. s->next=p->next;p->next=s; B. p->next=s;s->next=p->next; C.p->next=s;p->next=s->next; D. p->next=s->next;p->next=s; 10.对于一个头指针为head的带头结点的单链表,判定该表为

第二章 线性表习题

第二章线性表习题 判断题 1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。() 选择题 1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( ) (A)110 (B)108 (C)100 (D)120 3. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。 (A)64 (B)63 (C)63.5 (D)7 4.线性表采用链式存储结构时,其地址()。 (A) 必须是连续的 (B) 部分地址必须是连续的 (C) 一定是不连续的 (D) 连续与否均可以 5. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行() (A)s->next=p;p->next=s; (B) s->next=p->next;p->next=s; (C)s->next=p->next;p=s; (D)p->next=s;s->next=p; 6.在一个单链表中,若删除p所指结点的后续结点,则执行() (A)p->next=p->next->next; (B)p=p->next; p->next=p->next->next; (C)p->next=p->next; (D)p =p->next->next; 7.下列有关线性表的叙述中,正确的是() (A)线性表中的元素之间隔是线性关系 (B)线性表中至少有一个元素 (C)线性表中任何一个元素有且仅有一个直接前趋 (D)线性表中任何一个元素有且仅有一个直接后继 8.线性表是具有n个()的有限序列(n≠0) (A)表元素(B)字符(C)数据元素(D)数据项 填空题 1.已知P为单链表中的非首尾结点,在P结点后插入S结点的语句为:( ) 。 2.顺序表中逻辑上相邻的元素物理位置(一定 )相邻,单链表中逻辑上相邻的元素物理位置( )相邻。

第二章线性表习题及答案

第二章线性表习题及答案 一、基础知识题 2.1 试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。 答:始结点是指链表中的第一个结点,也就是没有直接前趋的那个结点。 链表的头指针是一指向链表开始结点的指针(没有头结点时),单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。 头结点是我们人为地在链表的开始结点之前附加的一个结点。有了头结点之后,头指针指向头结点,不论链表否为空,头指针总是非空。而且头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致(都是在某一结点之后)。 2.2 何时选用顺序表、何时选用链表作为线性表的存储结构为宜? 答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考虑: 1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。 2.基于时间的考虑。若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之,若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。 2.3 在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素? 答:在等概率情况下,顺序表中插入一个结点需平均移动n/2个结点。删除一个结点需平均移动(n-1)/2个结点。具体的移动次数取决于顺序表的长度n以及需插入或删除的位置i。i 越接近n则所需移动的结点数越少。 2.4 为什么在单循环链表中设置尾指针比设置头指针更好? 答:尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为rear,则开始结点和终端结点的位置分别是rear->next->next 和rear, 查找时间都是O(1)。 若用头指针来表示该链表,则查找终端结点的时间为O(n)。 2.5 在单链表、双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 答:我们分别讨论三种链表的情况。 1. 单链表。当我们知道指针p指向某结点时,能够根据该指针找到其直接后继,但是由于不知道其头指针,所以无法访问到p指针指向的结点的直接前趋。因此无法删去该结点。 2. 双链表。由于这样的链表提供双向链接,因此根据已知结点可以查找到其直接前趋和直接后继,从而可以删除该结点。其时间复杂度为O(1)。 3. 单循环链表。根据已知结点位置,我们可以直接得到其后相邻的结点位置(直接后继),又因为是循环链表,所以我们可以通过查找,得到p结点的直接前趋。因此可以删去p所指结点。其时间复杂度应为O(n)。 2.6 下述算法的功能是什么? LinkList Demo(LinkList L){ // L 是无头结点单链表 ListNode *Q,*P; if(L&&L->next){ Q=L;L=L->next;P=L;

线性代数第二章答案

第二章 矩阵及其运算 1 已知线性变换 ?????++=++=++=3 21332123 2113235322y y y x y y y x y y y x , 求从变量x 1 x 2 x 3到变量y 1 y 2 y 3的线性变换 解 由已知 ? ??? ?????? ? ?=???? ??22 1321323513122y y y x x x 故 ???? ?????? ? ?=???? ??-3211 221323513122x x x y y y ? ??? ?????? ??----=321423736 947y y y ?????-+=-+=+--=3 21332123 211423736947x x x y x x x y x x x y 2 已知两个线性变换 ?????++=++-=+=3 2133 2123 11542322y y y x y y y x y y x ?????+-=+=+-=3 233122 11323z z y z z y z z y 求从z 1 z 2 z 3到x 1 x 2 x 3的线性变换 解 由已知 ???? ?????? ? ?-=???? ??221321514232102y y y x x x ??? ? ?????? ??--???? ??-=32131 010 2013514232102z z z ??? ? ?????? ??----=32 1161109412316z z z

所以有?????+--=+-=++-=3 2133 2123 2111610941236z z z x z z z x z z z x 3 设???? ??--=111111111A ??? ? ??--=150421321B 求3AB 2A 及A T B 解 ??? ? ??---???? ??--???? ??--=-1111111112150421321111111111323A AB ???? ??----=???? ??---???? ??-=2294201722213211111111120926508503 ??? ? ??-=???? ??--???? ??--=092650850150421321111111111B A T 4 计算下列乘积 (1)??? ? ?????? ??-127075321134 解 ???? ?????? ??-127075321134???? ???+?+??+?-+??+?+?=102775132)2(71112374?? ? ? ??=49635 (2)???? ??123)321( 解 ??? ? ??123)321((132231)(10)

线性表 习题

第二章 一选择题 1.一个线性表第一个元素的存储地址是100,每个元素的长度为4,则第5个元素的地址是( ) A.110 B.116 C.100 D.120 2. 向一个有128个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。 A.64 B.63 C.63.5 D.7 3.在循环双链表的p所指接点之前插入s所指接点的操作是 A.p-> prior =s;s-> next t=p;p-> prior t->left=s;s-> prior =p-> prior; B. p-> prior =s;p-> prior -> next =s;s-> next =p;s-> prior =p-> prior; C.s-> next =p;s-> prior =p-> prior;p-> prior =s;p-> prior -> next =s; D.s-> next =p;s-> prior =p-> prior;p-> prior -> next =s;p-> prior =s; 4.从一个具有n个结点的单链表中查找其值等于x结点时,在查找成功的情况下,需平均比较()个结点。 A.n B.n/2 C.(n-1)/2 D.(n+1)/2 5.线性表是具有n个()的有限序列(n≠0) A.表元素 B.字符 C.数据元素 D.数据项 6.非空的循环单链表head的尾结点(由P指向)满足 A. p->next=NULL B. p=NULL C. p->next=head D.p=head 7.在一个单链表中已知q所指的结点是p所指结点的前驱结点,若在q和p之间插入s 结点,则执行( ) A. s->next=p->next;p->next=s; B.p->next=s->next;s->next=p; C. q->next=s;s->next=p; D.p->next=s;s->next=q; 8.已知一个顺序存储线性表,若第1个结点的地址d,第3个的地址是5d,则第n个结点的地址为( ) A.[2*(n-1)+1]*d B.2*(n-1)*d C.[2*(n-1)-1]*d D.(n+1)*d 9.在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( ) A.O(1) B.O(n) C.O(n2) D.O(nlog2n) 10.如果最常用的操作是提取第i个结点及其前驱,则采用( )存储方式最节省时间。 A.单链表 B.顺序表 C.循环链表 D.双链表 11.在一个长度为n的顺序存储线性表中,向第i个元素(1≤i≤n)之前插入一个新元素时,需要从后向前依次后移( )个元素。 A.n-i B.n-i+1 C.n-i-1 D.i 12.在一个长度为n的顺序存储线性表中,删除第i个元素(0≤i≤n-1)时,需要从后向

线性代数第二章习题答案

习 题 2-1 1.由6名选手参加乒乓球比赛,成绩如下:选手1胜选手2、4、5、6而负于选手3;选手2胜选手4、5、6而负于选手1、3;选手3胜选手1、2、4而负于选手5、6;选手4胜选手5、6而负于选手1、2、3;选手5胜选手3、6而负于选手1、2、4;选手6胜选手2而负于选手1、3、4、5.若胜一场得1分,负一场得0分,使用矩阵表示输赢状况,并排序. 解: ????? ?? ? ? ? ??000010 100100110000001011 1110001110106543216 54321,选手按胜多负少排序为:6,5,4,3,2,1. 2.设矩阵???? ??-=???? ?? +-=2521 ,03231 z x y x B A ,已知B A =,求z y x ,,. 解:由于B A =得?????=-=+=-0253223z x y x ,解得:?? ? ??===211 z y x 。 习 题 2-2 1.设???? ??=0112A ,??? ? ??-=4021B ,求 (1)B A 52-; (2)BA AB -; (3)2 2B A -. 解:(1)??? ? ??--=???? ??--???? ??=???? ??--???? ??=-202892001050224402150112252B A ; (2)???? ??--=???? ??--???? ??--=???? ?????? ??--???? ??-???? ??=-2592041021820112402140210112BA AB ; (3)??? ? ??--=???? ??-???? ??=???? ??-???? ??--???? ?????? ??=-152441606112254021402101120112B A 22. 2.已知????? ??--=230412301321A ,??? ? ? ??---=052110 35123 4B ,求B A 23-. 解:??? ? ? ??----????? ??--=052110351234223041230 13 21 323B -A ??? ? ? ??----=????? ??----????? ??--=61941016151055011010422061024686901236903963 3.设??? ? ? ??----=????? ??=101012121234,432112 122121B A ,求

相关主题
文本预览